python爬虫scrapy概要介绍

Scrapy是一个用于爬取web站点并提取结构化数据的应用框架,通常我们称之为爬虫,一款优秀的python爬虫。

scrapy爬取的数据可被用在数据挖掘、信息处理、历史数据归档等非常广泛数据分析和处理领域。

我们可以通过一个简单的例子来初步了解一下如何通过scrapy蜘蛛(spider)爬取web页面。

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 {
                'author': quote.xpath('span/small/text()').get(),
                'text': quote.css('span.text::text').get(),
            }

        next_page = response.css('li.next a::attr("href")').get()
        if next_page is not None:
            yield response.follow(next_page, self.parse)

将这段代码保存为quotes_spider.py,然后执行以下命令

scrapy runspider quotes_spider.py -o quotes.json

或者:

python -m scrapy runspider quotes_spider.py -o quotes.json

执行完毕后,我们会在输出文件quotes.json中得到如下格式的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"
},
...]

可以看到,每个项目包含两个字段:author和text。这些正是http://quotes.toscrape.com/tag/humor/这个页面上展示的内容。

我们现在来分析一下上边这段代码的执行过程。

当运行scrapy runspider quotes_spider.py这个命令后,scrapy会从quotes_spider.py这个脚本加载其中定义的一个spider,并在爬虫引擎中执行这个spider定义的一些方法。

引擎首先打开start_urls中定义的链接,成功后会调用默认的回调函数parse,将响应消息response作为参数传入parse函数。

parse回调函数使用css选择器选取并循环遍历response中的quote对象,从中提取中author和text字段。并查找页面中的next标签,以确定是否继续使用同样的方法爬取和解析“下一页”。

你应该已经注意到了使用scrapy的好处:页面请求是由scrapy异步地进行调度和处理的。这意味着scrapy不需要等待某个请求的完成和处理,它可以同时发送其他请求或者执行其他业务。同样,某个请求失败或异常也不影响其他请求的执行。

除了可以快速爬取页面,scrapy还提供了一些配置项,用来调控爬取行为。我们可以设置请求间的间隔,可以控制每个域名或每个ip的并发请求数,这样使得爬取行为看起来不那么“粗暴”。scrapy甚至提供了扩展程序以自动调整这些参数。

当然,作为一个强大的爬虫框架,scrapy提供的功能远不止此。

  • 内置增强的css选择器和xpath表达式,用来选取和解析html和xml文件,支持使用正则表达式。
  • 提供一个交互式shell控制台,方便编写和调试spider。
  • 内置多种数据输出格式(json、csv、xml),并可将数据存储在多种后端系统(ftp、s3、本地文件系统)。
  • 支持页面编码自动检测
  • 丰富的插件,可用于处理cookies/session,支持http压缩、鉴权和缓存等特性,仿造user-agent等。

总的来说,用python做爬虫,基本绕不开scrapy。我们一起学习吧。

最后推荐一本不错的参考书。