初窥Scrapy¶
Scrapy是一个应用程序框架,用于爬取网站并提取结构化的数据,这些数据可用于广泛的有用的应用,例如数据挖掘,信息处理或历史归档。
虽然Scrapy最初设计用于网页爬取,它也可以用于使用API提取数据(如 Amazon Associates Web Services) 或作为一种通用的网络爬虫。
浏览一个示例爬虫¶
为了给你显示Scrapy提到的内容,我们将引导你通过一个Scrapy爬虫实例,使用最简单的方法来运行一个爬虫。
下面是从网站http://quotes.toscrape.com爬出名言的爬虫代码,并跟踪页码︰
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('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:
next_page = response.urljoin(next_page)
yield scrapy.Request(next_page, callback=self.parse)
把它放在一个文本文件中,把它命名为quotes_spider.py
,并使用runspider
命令运行这个spider︰
scrapy runspider quotes_spider.py -o quotes.json
终于,我们可以运行spider来获取网站的数据,并以JSON格式存入到 scraped_data.json
文件中:
[{
"author": "Jane Austen",
"text": "\u201cThe person, be it gentleman or lady, who has not pleasure in a good novel, must be intolerably stupid.\u201d"
},
{
"author": "Groucho Marx",
"text": "\u201cOutside of a dog, a book is man's best friend. Inside of a dog it's too dark to read.\u201d"
},
{
"author": "Steve Martin",
"text": "\u201cA day without sunshine is like, you know, night.\u201d"
},
...]
刚刚发生了什么?¶
当你运行命令scrapy runspider quotes_spider.py
时,Scrapy寻找它里面的Spider定义并通过它的爬虫引擎运行它。
爬虫通过发出请求到start_urls
属性中定义的URL(在本例中,仅仅是humor类别中的quotes的URL) 开始并调用默认的回调方法parse
,将响应对象作为参数传递。在parse
回调中,我们使用一个CSS Selector循环名言元素, 产生一个带有提取好的名言文本和作者的Python字典,寻找下一个页面的链接并且安排另一个请求使用相同的parse
方法作为回调函数。
这里,你注意到关于Scrapy的主要有点之一︰ 请求是以异步方式调度和处理的。这意味着Scrapy不需要等待请求完成和处理,它可以发送另一个请求,或同时做其他事情。这也意味着其他请求可以继续走下去,即使处理它时一些请求失败或错误发生。
虽然这使你可以做非常快速爬虫(以容错的方式发送多个并发请求同时) Scrapy还通过几个设置给你控制爬虫的礼貌性。你可以设置每个请求之间下载的延迟,限制每个域或每个IP并发请求的数量,甚至使用自动节流扩展试图自动找出这些设置。
注
它使用feed exports生成JSON文件,你可以轻松更改导出格式(例如XML或 CSV) 或存储后端(例如FTP或Amazon S3)。 同时,您也可以编写 item管道 将item存储到数据库中。
还有什么?¶
您已经了解了如何通过Scrapy提取存储网页中的信息,但这仅仅只是冰山一角。 Scrapy提供很多强大的功能使得爬取轻松且高效,如︰
- 内置支持使用的扩展的CSS选择器和XPath表达式从HTML/XML源选择和提取数据,使用正则表达式和辅助方法来提取。
- 一个交互式shell控制台(可用于IPython),用于尝试CSS和XPath表达式以爬取数据,当编写或调试你的spider时非常有用。
- 内置支持生成feed 导出为多种格式 (JSON, CSV, XML) 以及将其存储在多个后端(FTP,S3,本地文件系统)
- 针对非英语语系中不标准或者错误的编码声明, 提供了自动检测以及健壮的编码支持。
- 强大的可扩展性支持,允许你使用 信号和定义良好的API(中间件、扩展和管道)插入自己的功能。
- 内置的中间件及扩展为下列功能提供了支持:
- cookies and session 处理
- HTTP 压缩
- user-agent spoofing
- robots.txt
- 爬取深度限制
- 以及更多
- 一个Telnet控制台,用于挂接到运行你的Scrapy进行的一个Python控制台来审查和调试爬虫
- 再加上其他好处,例如可重用的spider来爬取从站点地图和XML/CSV feed爬取站点和,一个媒体管道自动下载与爬取的item关联的图像(或其他媒体),一个缓存DNS解析程序,以及更多!