现在很多网站都是对单个 IP 地址有访问次数限制,如果你在短时间内访问过于频繁。该网站会封掉你 IP,让你在一段时间内无法正常该网站。突破反爬虫机制的一个重要举措就是代理 IP。拥有庞大稳定的 IP 代理,在爬虫工作中将起到重要的作用,但是从成本的角度来说,一般稳定的 IP 池都很贵。因此,我为 Scrapy 爬虫编写个免费 IP 代理池插件。
1 特点
该插件适用的程序是基于 Scrapy 框架编写的爬虫程序。插件通过爬取免费代理地址,然后过滤掉无效 IP 代理后存放到 Mysql 数据库。另外,它会每 10 分钟轮询数据库中的 IP 代理数量。如果代理地址因为连接失败次数超过 3 次被删除,从而导致代理不够,它会后台重新爬取新的 IP 代理。
2 收集的代理网站
- 无忧代理(data5u)
- ip181 代理
- 快代理
- 西刺代理
3 项目说明
startrun.py
项目的主入口。它负责启动 Scrapy 爬虫和代理池。your_scrapy_project
该目录下主要存放两个文件:config.py
和settings.py
。config.py 是代理池的项目配置信息。而 settings.py 是你的 Scrapy 爬虫项目的配置参考代码。ProxyPoolWorker.py
ProxyPoolWorker.py
是 IP代理池模块的管理类,负责启动和维护 IP 代理池。proxyDBManager.py
proxyDBManager.py
位于 dbManager 包下。它是数据库操作类。主要工作是创建数据库表、往数据库中插入 IP 代理、查询数据库中剩余的 IP 代理总数、从数据库中随机查询一个 IP 代理、对连接超时或失败的 IP 代理做处理。proxyModel.py
proxyModel.py
在model
包下。它是 IP 代理对象类。requestEnginer.py
requestEnginer.py
位于requester
目录下。requestEnginer 是整个爬虫代理池的网络引擎。它采用 Session 的形式来发起 HTTP 请求。同时,它还负责验证代理地址有效性, 达到过滤掉无用 IP 代理的目的。scrapy
scrapy 目录是一些 Scrapy 框架的自定义中间件。RandomUserAgentMiddleware.py
是为 HTTP 请求随机设置个 User-agent。middlewares.py
有两个职责。一是为 HTTP 请求随机设置个 IP 代理。二是负责捕获并处理 HTTP 异常请求。spiders
该包主要是爬取各大代理网站的爬虫。
4 使用方法
4.1 安装依赖
使用本插件,你需要通过 pip 安装以下依赖:
- requests
- apscheduler
- pymysql
4.2 修改配置
将
startrun.py
放到你的 Scrapy 项目的主目录下。例如你项目名为 demo,那么你需要放到 demo 的目录下。修改
config.py
里面的 Mysql 相关配置信息。然后将其放到你的 Scrapy 项目的二级目录下。假如你项目名为 demo,那么你需要放到 demo /demo 的目录下。参考
setting.py
,修改你的 Scrapy 项目中的setting.py
文件。主要是在你项目中增加以下代码:
# 默认使用 IP 代理池
if IF_USE_PROXY:
DOWNLOADER_MIDDLEWARES = {
# 第二行的填写规则
# yourproject.myMiddlewares(文件名).middleware类
# 设置 User-Agent
'scrapy.contrib.downloadermiddleware.useragent.UserAgentMiddleware': None,
'proxyPool.scrapy.RandomUserAgentMiddleware.RandomUserAgentMiddleware': 400,
# 设置代理
'scrapy.contrib.downloadermiddleware.httpproxy.HttpProxyMiddleware': None,
'proxyPool.scrapy.middlewares.ProxyMiddleware': 100,
# 设置自定义捕获异常中间层
'proxyPool.scrapy.middlewares.CatchExceptionMiddleware': 105,
}
5 写在最后
本项目目前是第一版,可能有些不完善的地方。如果你有宝贵的完善建议或者有更多的代理网站,可以反馈给我。我会持续完善本项目。最后,本项目也在 github 上开源了。传送门
上篇阅读:Python 实现识别弱图片验证码
推荐阅读:Python定时任务(下)