《Learning Scrapy》这本书是2016年1月出版的,作者使用的版本是Scrapy 1.0.3。
现在,Scrapy的最新版本是1.4。
Scrapy的图标是个小刮铲 :)
Scrapy文档的中文版现在还是1.0的:http://scrapy-chs.readthedocs.io/zh_CN/latest/intro/tutorial.html。
官方文档更新自然是最快的:https://docs.scrapy.org/en/latest/intro/tutorial.html。
官方案例现在使用网站http://quotes.toscrape.com作为抓取源。这个网站是GoodReads.com(特别好的书评网站,Kindle用户肯定熟悉)和Scrapinghub合作的。多说一句,Scrapinghub提供了几个有用的产品,如下:
Scrapy Cloud是一个有限免费的云平台,可以部署爬虫进行定时爬取(免费一个并发进程)。Scrapy官网推荐过Scrapy Cloud。
Crawlera是代理插件,《Learning Scrapy》书里用到过,那时还是免费的,现在是收费的了。
最简单的Scrapy例子:
代码语言:javascript复制import scrapy #命名为quotes_spider.py
class QuotesSpider(scrapy.Spider):
name = "quotes"
start_urls = [
'http://quotes.toscrape.com/tag/humor/',
]
def parse(self, response):
for quote in response.css('div.quote'):
yield {
'text': quote.css('span.text::text').extract_first(),
'author': quote.xpath('span/small/text()').extract_first(),
}
next_page = response.css('li.next a::attr("href")').extract_first()
if next_page is not None:
yield response.follow(next_page, self.parse)
运行这个爬虫,输出为json格式:
代码语言:javascript复制scrapy runspider quotes_spider.py -o quotes.json
会得到一个quotes.json文件,如下:
爬取步骤分析:
1向start_urls发出请求,将响应作为参数传递给调回方法parse;
2 用CSS选择器循环抓取名人名言。寻找下一页的链接,规划下一个请求。
可以看出Scrapy的优点:请求是经过规划,然后异步执行的。所以,Scrapy不用等待请求完成,就可以发出另一个请求。如果某个请求受阻,其它请求仍然可以执行。
这样的话,Scrapy爬取的速度就可以很快。控制爬取速度,可以通过设置两个请求的间隔时间、设置域名或ip的并发请求数、或使用自动阻塞插件(AutoThrottle extension)。
Scrapy的其它特点:
- 内建的CSS选择器和XPath表达式
- 基于IPython交互式shell,方便编写爬虫和debug
- 内建的文件导出和保存方法,格式多样JSON、CSV、XML
- 健壮的编码支持
- 扩展性强,可以使用signals和API(中间件、插件、管道)添加自定义功能
- 多种用于处理session、cookies、HTTP认证、user-agent、robots.txt、抓取深度限制的中间件和插件
- Scrapy内建Telnet console,可用于debug
安装
Scrapy现在支持Python 2.7 和 Python 3.3以上的版本。最方便的就是用pip安装:
代码语言:javascript复制pip install Scrapy
如果用的是Anaconda环境,官网还介绍了conda安装方法:
代码语言:javascript复制conda install -c conda-forge scrapy
官方推荐的是使用虚拟环境,这样可以减少冲突,使用gitbash(这里使用win7的shell不能正常deactivate,使用gitbash没问题):
代码语言:javascript复制pip install virtualenv
新建一个虚拟环境:
代码语言:javascript复制virtualenv test1
激活这个虚拟环境:
代码语言:javascript复制source activate test1
这时再安装Scrapy:
代码语言:javascript复制pip install Scrapy
安装的包就存储在 ..test1Libsite-packages中了。
退出这个环境:
代码语言:javascript复制source deactivate