Scarpy2.5从入门到高级系列教程(一):快速了解Scrapy框架

Scrapy 快速一览

Scrapy 是一个用于抓取网站和提取结构化数据的应用程序框架,可用于各种有用的应用程序,如数据挖掘、信息处理或历史存档。

尽管 Scrapy 最初是为网页元素抓取而设计的,但是它也能通过使用Apis来提取数据,比如亚马逊的服务接口,或者就一个通用的目的,网页元素抓取。

一个蜘蛛的例子

为了向您展示 Scrapy 带来了什么,我们将向您展示一个 Scrapy Spider 示例,使用最简单的方式运行蜘蛛。

下面是一个爬虫的代码,它从网站 http://quotes.toscrape.com 爬取名言,遵循分页:

# 导入scrapy库
import scrapy


# 创建一个蜘蛛类
# 这在以后,会在创建爬虫项目后,自动生成
# 该类默认继承scrapy中的Spider类
class QuotesSpider(scrapy.Spider):
    # 定义蜘蛛名,这个在后期,你使用命令行创建的时候,
    # 和你使用命令行中的名称保持一致,当然你也可以选择不一致
    name = 'quotes'
    # 定义爬取的url,它是一个列表
    start_urls = [
        'http://quotes.toscrape.com/tag/humor/',
    ]
	# 回调函数,对继承类的重写
    # 这个response相应,是你请求的url的响应结果
    def parse(self, response):
        # 遍历你找到的名言
        # 通过yield生成一个迭代器,并将其抛出
        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()
        # 如果有下一页数据,就回调parse,进行重新解析
        if next_page is not None:
            yield response.follow(next_page, self.parse)

创建一个py文件,并在命令终端,进入到对应的文件目录下,执行

文件格式:.jl 类别:Julia Source Code File。JL文件保存为文本格式,因此它可以用任何文本编辑器进行编辑。

scrapy runspider quotes_spider.py -o quotes.jl

完成后,同级目录下,会多一个文件,quotes.jl 文件中将包含 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": "Steve Martin", "text": "\u201cA day without sunshine is like, you know, night.\u201d"}
......

这些都是怎么发生的呢

当您运行命令 scrapy runspider quotes_spider.py -o quotes.jl 时,Scrapy会查找你定义的蜘蛛类 QuotesSpider,之后自动使用爬虫引擎(框架的核心)运行它。

这个爬取的过程由制造一些请求开始,请求的url就是你蜘蛛类中定义的start_url(这是一个url列表),请求完成后,会调取默认回调函数parse,且会将请求的响应response作为一个参数传递给parse回调函数。在回调函数中,这里使用了css选择器先获取了页面中所有的元素,然后循环每一句名言,并使用yield函数生成一个python字典,这个数据是被抛出的,你在文件中看到了,然后我们查询是否还有下一页数据,如果存在,我们就使用相同的回调方法,重新执行一遍这个过程,直到没有下一页为止。

在这里您会注意到 Scrapy的主要优势之一: 请求是异步调度和处理的。

  • 这意味着 Scrapy不需要等待请求完成和处理,它可以在此期间发送另一个请求或做其他事情。
  • 这也意味着即使某些请求失败或在处理它时发生错误,其他请求也可以继续进行。

虽然这使您可以进行非常快速的爬网(以容错方式同时发送多个并发请求),但 Scrapy 还让您可以通过一些设置来控制爬网的礼貌。

你可以做一些事情,比如设置每个请求之间的下载延迟,限制每个域或每个 IP的并发请求数量,甚至使用自动限制扩展来尝试自动找出这些。

上面这些设置,后面我们会涉及到,现在不着急了解具体是怎么设置的。

注意

对数据储存,你可以选择多种方式,导出格式可以使用:json\XML\csv。或者写item pipline存储到数据库上。

还有其它?

您已经了解了如何使用 Scrapy从网站中提取和存储项目,但这只是表面。

Scrapy提供了许多强大的功能来使抓取变得简单高效,例如:

  • 内置的css选择器和xpath表达式以及辅助正则表达式,来帮助我们提取数据.

  • 一个交互式 shell 控制台(IPython感知),用于尝试使用CSSXPath表达式来抓取数据,在编写或调试蜘蛛时非常有用。

  • 内置支持以多种格式(JSON、CSV、XML)生成提要导出并将它们存储在多个后端(FTP、S3、本地文件系统

  • 强大的编码支持和自动检测,用于处理外部、非标准和损坏的编码声明。

  • 强大的可扩展性支持,允许您使用signals和定义良好的(middlewares, extensions, and pipelines)插入自己的功能。

  • 用于处理的各种内置扩展和中间件:

    • HTTP features like compression, authentication, caching
    • user-agent spoofing
    • robots.txt
    • crawl depth restriction
  • 一个 Telnet 控制台,用于连接到在Scrapy进程中运行的Python 控制台,以检查和调试您的爬虫

  • 加上其他好东西,比如可重复使用的蜘蛛类,从Sitemap和 XML/CSV 提要中抓取url、用于自动下载与抓取的项目相关联的图像(或任何其他媒体)的媒体管道、缓存 DNS解析器等等!

下一步

安装 Scrapy,按照教程学习如何创建一个成熟的 Scrapy项目。 谢谢你的关注!

你可能感兴趣的:(Scrapy2.5从初级到高级,爬虫,python)