什么是爬虫
一句话: get网页就是爬虫。
from urllib.request import urlopen
print(urlopen('wwww.baidu.com').read())
基本流程
几个环节:Get->Extract->Store
从一个start_url开始,一般先抓列表页,然后抓详情页
利器
抓包工具:chrome/ charles
调试工具: paw/ ipython
发请求:urllib.request/ requests
抽取信息: re/ lxml/ pyquery/ parsel (css选择器、 xpath选择器)
反爬虫
- User-Agent、Referrer检测 -> Cosplay, 伪装User-Agent、Referrer
- 登录限制 -> 模拟登录
- 封IP -> 用代理, 用ADSL不断拨号换ip
- 验证码限制 -> 调用验证码识别api(机器识别、人工打码服务)
- 接口加签名 -> 逆向破解
- 频率限制 -> 放慢频率
- 封账号 -> 购买一大堆小号
- 动态内容 -> Selenium、Phantomjs
- 投毒(返回虚假数据) -> 细心验证
容错机制
- 如果是频率过快,可以暂停一段时间再发请求,或者换号、换ip
- 如果是301/ 302则重定向到新url。requests库默认会自动重定向即requests.get(‘http://github.com‘, allow_redirects=True)
- 如果是400/ 401/ 403/ 404/ 500,直接跳过
- 如果是网络问题,可以进行重试N次
存储
- csv (直接open写文件即可)
- excel (pip3 install XlsxWriter)
- sqlite (python自带,直接import sqlite3)
- mysql (pip3 install mysqlclient)
- redis (pip3 install redis)
- mongodb (pip3 install pymongo)
通过并发提高吞吐量
- 多进程
- 多线程
- 协程
- 异步
- celery
爬虫框架
主要有scrapy、pyspider
用现成的框架的好处就是不用担心 cookie、retry、timeout、频率限制、并发、去重的事,甚至有shell、web UI、监控等。可以使用现成的Middewares或者自定义Middewares。方便维护user-agent池、cookie池、ip池。