简介
Scrapy 一个爬虫框架。
代码示例
scrapy 运行单个爬虫文件,爬取 [http://quotes.toscrape.com/tag/humor/] 上的名言和作者
import scrapy
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('.text::text').extract_first(),
'author': quote.xpath('span/small/text()').extract_first(),
}
next_page = response.css('.next a::attr(href)').extract_first()
if next_page:
yield response.follow(next_page, self.parse)
在命令行中执行: scrapy runspider quotes_spider.py -o quotes.csv
将结果输出到 quotes.csv
运行流程:
- scrapy 根据 start_urls 发送GET请求。当响应返回时,调用默认的回调函数 parse()。
- 在 parse() 中,使用 XPath 或 CSS选择器 提取数据(字典格式),并通过 response.follow() 发送 "下一页" 的 GET请求
Scrapy 优点
- HTTP请求的发送和响应的处理是异步的。
- 可以连续发送多个请求,不必的等待是一个请求的响应处理完成。
- 当一个请求在发送/处理的过程中发生错误时,不会影响其他请求。
限速
为了避免 scrapy 快速地发送多个请求,可以使用一些设置来进行限速:
- 在 settings.py 中配置请求之间的延迟;每个网站的线程数
- 在 settings.py 中配置 auto-throttling 扩展,根据前面的响应时间自动调试请求间的延迟
保存结果
- 通过 feed exports 可以将结果保存为 csv, json, jl, xml 格式 或 保存到 FTP, Amazon S3 上
- 通过 pipeline 可以将结果保存到数据库中
Scrapy 的其他优点:
- 通过 XPath, CSS选择器,正则表达式 提取数据
- 通 IPython 来测试提取表达式
- 内置将结果保存为多种格式和存储系统
- 强大的 HTTP 解码能力
- 通过 signals, middlewares, extensions, pipeline 来扩展 scrapy
- 自带的扩展和中间件用于处理 cookie, session, http 缓存/认证, robots.txt, User-Agent, 爬取深度限制
- 通过 Telnet console 用来调试正在运行低爬虫