爬虫往往要用到多个IP切换。而各代理网站的免费IP大多数都是无效的。一个个手工试是不可能的任务,我们就用爬虫来爬,并设置定时任务自动调度执行。
文中的工程采用scrapy来写爬虫,使用scrapy_proxies调度使用获取到的IP(用法详见链接中的说明),定义了crawlall的命令来同时执行所有的爬虫(来源忘记,可搜索scrapy crawlall)。
完整代码:https://github.com/dodolo-cc/proxy
环境
centos7 + python2.7 + scrapy1.2.2
创建爬虫工程
scrapy startproject proxy
创建出来的目录结构如下:
proxy
├── proxy #python代码放在这个目录下
│ ├── init.py
│ ├── items.py #item文件
│ ├── pipelines.py #pipeline文件
│ ├── settings.py #项目的设置文件
│ └── spiders #放爬虫文件的目录
│ └── init.py
└── scrapy.cfg #项目配置文件
定义item文件
抓取代理ip要用到的字段很简单,就是IP、端口、代理类型三个
# items.py 文件
# -*- coding: utf-8 -*-
import scrapy
class ProxyItem(scrapy.Item):
ip = scrapy.Field()
port = scrapy.Field()
p_type = scrapy.Field()
创建spider
本文以http://www.xicidaili.com为例,另外的代理网站,再写对应的spider即可
scrapy genspider xici www.xicidaili.com
爬虫名称为xici,允许爬取的域名是www.xicidaili.com
命令执行后,可以在spiders目录下找到文件xici.py
写spider
确定爬取链接的正则表达式
链接规律:
http://www.xicidaili.com/nn/1
http://www.xicidaili.com/nn/2
http://www.xicidaili.com/nn/3
免费IP失效很快,一般只抓最新的一两页就够了
r"http://www.xicidaili.com/nn/[1-2]$"
确定爬取内容的xpath
用chrome浏览器右键“检查”,如图红框里就是xpath。
chrome有时候会自动补全一些东西,可能会造成和实际xpath不符合的情况,这时可以改用firefox“查看元素”。
直接用firefox也很好,看个人习惯。
Spider代码
这个网站第一页没有本页的链接,所以起始页从第二页开始。否则是爬不到第一页的。其它的网站可能没有这个问题。
# xici.py文件