这篇笔记介绍使用scrapy写一个入门爬虫的示例,该爬虫从网站爬取一些ip/port数据。主要目的是先把一个爬虫启动起来,后续再逐步讲其中的一些细节。
安装
scrapy的安装如果有root权限是比较方便的,没有的话需要手动编译安装一些库的依赖,以及使用pip/easy_install安装一些包的依赖,具体不再细说,无非是修改PATH,LD_LIBRARY_PATH,C_INCLUDE_PATH等。
背景
想要做一个简单的爬虫,不可避免要遇到代理的问题。看到快代理这里有一些可以用于爬虫的代理ip和port,如何能够使用scrapy把这些代理自动抓取下来呢?方案有很多,这篇笔记介绍下如何使用scrapy快速的实现这个目标。
实现
目录结构
通过执行
scrapy startproject httpproxy
scrapy genspider proxy_spider kuaidaili.com/proxylist/
可以获得一个最基本的爬虫目录结构
|~~httpproxy
|~~|~~__init__.py
|~~|~~pipelines.py
|~~|~~items.py
|~~|~~spiders
|~~|~~|~~__init__.py
|~~|~~|~~proxy_spider.py
|~~|~~settings.py
|~~scrapy.cfg
修改几个文件,就可以达到我们爬虫的目标了。
要抓取的对象
爬取的目标是结构化的数据,在scrapy中使用scrapy.Item来定义,修改items.py。
我们需要爬取的是地址和端口,定义如下:
class HttpproxyItem(scrapy.Item):
# define the fields for your item here like:
ip = scrapy.Field()
port = scrapy.Field()
定义爬取的规则
从页面中提取需要的元素,可以使用xpath。
具体可以参考这个链接,推荐chrome安装一个xpath helper,以及使用chrome里的copy XPath也可以。也可以使用scrapy shell
这个命令来调试下是否该xpath能够生效。
我们需要3个xpath的路径:地址、端口以及跳转导航条,这里直接贴出来。
分别为
//*[@id="list"]/table/tbody/tr/td[1]/text()
//*[@id="list"]/table/tbody/tr/td[2]/text()
//div[@id="listnav"]/ul/li/a/@href
跳转导航条的作用是通过该页获取其他所有存储地址、端口的页面。
修改后的proxy_spider.py文件内容为:
# -*- coding: utf-8 -*-
import scrapy
from httpproxy.items import HttpproxyItem
class ProxySpiderSpider(scrapy.Spider):
name = "proxy_spider"
# allowed_domains = ["http://www.kuaidaili.com/proxylist/"]
start_urls = (
'http://www.kuaidaili.com/proxylist/',
)
def parse(self, response):
sel = scrapy.Selector(response)
ip_list = sel.xpath('//*[@id="list"]/table/tbody/tr/td[1]/text()').\
extract()
port_list = sel.xpath('//*[@id="list"]/table/tbody/tr/td[2]/text()').\
extract()
for ip, port in zip(ip_list, port_list):
yield HttpproxyItem(ip=ip, port=port)
url_list = sel.xpath('//div[@id="listnav"]/ul/li/a/@href').extract()
for url in url_list:
yield scrapy.Request(url='http://www.kuaidaili.com'+url,
callback=self.parse)
运行
执行命令
scrapy crawl proxy_spider -t json -o json.out
得到文件json.out就是我们的爬取结果了。是不是很简单?
有任何问题,请给我留言。
参考资料
http://scrapy-chs.readthedocs.org/zh_CN/latest/intro/overview.html