前段时间写了一个 Python 爬虫,爬了一个租房网站上的一些数据,大概有 7k 条。爬虫打算等做完了写一个系列文章放上来。今天把写爬虫过程中遇到的一些问题与解决办法总结一下。
常用的库
- 抓取网页:
requests
,urllib
- 解析:
BeautifulSoup4
,lxml
- 图片处理:
Pillow
- 代理:
PySocks
- 操作 MongoDB:
pymongo
如何模拟成搜索引擎?
使用 requests
库可以很方便的给请求加上 header:
1 | url = 'https://www.baidu.com/' |
如何提交表单?模拟登陆?
一般是查找 html 源代码找到 form,然后看 form 提交的地址,就可以直接使用 requests 的 post 方法提交数据。
另外 requests 还有个 Session 模块,使用起来很方便。
有些网站如果是需要登录的,我们可以直接把登录后自己的 cookies 复制下来,直接作为 requests 的 cookies 参数传进去。
如何加快爬取速度?
我这里用的是多线程,下一步考虑使用异步爬虫来取代多线程。
代码:
1 | import time |
这里贴了一个简单的使用爬虫的方法。
multiprocessing.dummy
是 multiprocessing
库的线程版克隆,主要作用是创建线程,与 multiprocessing
库一样提供了 map
方法。所以替换这两个库异常容易,你可以针对 IO 密集型任务(多线程更优秀)和 CPU 密集型任务(多进程更优秀)选择使用不同的库。
通过使用 map
方法,可以大大减少代码量。可以看到代码中关键的只有一句:
results = pool.map(requests.get, urls)
因为不同的机器配置不同,所以我们需要 通过尝试来确定线程池的大小。
如何避免访问频率过高而被网站 block?
通过使用多线程,对网站的访问频率会达到一个十分高的地步。即使模拟成了百度 spider 并使用了代理,还是会被一些网站 block 掉。
解决办法是降低访问频率,在线程处理函数中随机停顿:time.sleep(random.randint(0, 10))
随机停顿时间可以自己设置,如果不是很急的话可以停顿时间长一点,然后把代码放到服务器上跑。