Python 爬虫总结

python-spider

前段时间写了一个 Python 爬虫,爬了一个租房网站上的一些数据,大概有 7k 条。爬虫打算等做完了写一个系列文章放上来。今天把写爬虫过程中遇到的一些问题与解决办法总结一下。

常用的库

  • 抓取网页: requests, urllib
  • 解析: BeautifulSoup4, lxml
  • 图片处理: Pillow
  • 代理: PySocks
  • 操作 MongoDB: pymongo

如何模拟成搜索引擎?

使用 requests 库可以很方便的给请求加上 header:

1
2
3
4
5
url = 'https://www.baidu.com/'
headers = {
'User-Agent': 'Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)',
}
web_data = requests.get(url, headers=headers)

如何提交表单?模拟登陆?

一般是查找 html 源代码找到 form,然后看 form 提交的地址,就可以直接使用 requests 的 post 方法提交数据。

另外 requests 还有个 Session 模块,使用起来很方便。

有些网站如果是需要登录的,我们可以直接把登录后自己的 cookies 复制下来,直接作为 requests 的 cookies 参数传进去。

如何加快爬取速度?

我这里用的是多线程,下一步考虑使用异步爬虫来取代多线程。

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import time
import requests
from multiprocessing.dummy import Pool as ThreadPool

urls = [
'http://www.python.org',
'http://www.python.org/about/',
'http://www.onlamp.com/pub/a/python/2003/04/17/metaclasses.html',
'http://www.python.org/doc/',
'http://www.python.org/download/',
'http://www.python.org/getit/',
'http://www.python.org/community/',
'https://wiki.python.org/moin/',
'http://planet.python.org/',
'https://wiki.python.org/moin/LocalUserGroups',
'http://www.python.org/psf/',
'http://docs.python.org/devguide/',
'http://www.python.org/community/awards/'
]

pool_size = 13
pool = ThreadPool(pool_size)
start_time = time.time() # 开始时间
results = pool.map(requests.get, urls)
pool.close()
pool.join()
end_time = time.time() # 结束时间
# 将执行时间记录下来,用做比较
with open('time.txt', 'a') as f:
f.write('{} Pool: {} Seconds\n'.format(pool_size, end_time - start_time))
print(list(results))

这里贴了一个简单的使用爬虫的方法。

multiprocessing.dummymultiprocessing 库的线程版克隆,主要作用是创建线程,与 multiprocessing 库一样提供了 map 方法。所以替换这两个库异常容易,你可以针对 IO 密集型任务(多线程更优秀)和 CPU 密集型任务(多进程更优秀)选择使用不同的库。

通过使用 map 方法,可以大大减少代码量。可以看到代码中关键的只有一句:
results = pool.map(requests.get, urls)

因为不同的机器配置不同,所以我们需要 通过尝试来确定线程池的大小

如何避免访问频率过高而被网站 block?

通过使用多线程,对网站的访问频率会达到一个十分高的地步。即使模拟成了百度 spider 并使用了代理,还是会被一些网站 block 掉。

解决办法是降低访问频率,在线程处理函数中随机停顿:
time.sleep(random.randint(0, 10))

随机停顿时间可以自己设置,如果不是很急的话可以停顿时间长一点,然后把代码放到服务器上跑。

-------------本文结束感谢阅读-------------
  • 本文标题:Python 爬虫总结
  • 本文作者:xlui
  • 发布时间:2017年09月09日 - 09:09
  • 最后更新:2018年05月01日 - 20:05
  • 本文链接: https://xlui.me/t/spider-summary/
  • 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-ND 4.0 许可协议。转载请注明出处!