简介


    Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。

    其最初是为了 页面抓取 (更确切来说, 网络抓取 )所设计的, 也可以应用在获取API所返回的数据或者通用的网络爬虫。

使用建议,爬取数据的时候为了防止ip地址被封禁,有以下几个建议:

1.修改配置文件伪造session信息。

2.抓取间隔时间尽量要长。

3.通过代理使用ip地址池,循环使用,避免使用一个地址。

4.请求透过Tor Browser,防止自身ip被禁。


安装


    由于scrapy依赖的安装包很多,所以推荐使用pip工具实现快速安装。安装命令如下:pip install Scrapy 。其他安装方式可以参考官方文档。

    注:先下载pip安装文件,下载地址:https://bootstrap.pypa.io/get-pip.py,然后运行pip安装命令:python get-pip.py。


实例


      将抓取quotes.toscrape.com网站数据,这是一个列出著名作家引用的网站。

    本教程将引导您完成这些任务:

    1.创建一个新的Scrapy项目

    2.编写爬虫抓取网站并提取数据

    3.使用命令行导出抓取的数据

    4.更改爬虫递归跟随链接

    5.使用爬虫参数


创建Scrapy项目


    选择工程存放目录,创建名为tutorial的工程,然后运行如下命令:scrapy startproject tutorial.

这将创建一个包含以下内容的tutorial目录:

tutorial/

    scrapy.cfg  # 部署配置文件

    tutorial/ #项目的Python模块,从这里导入你的代码

        init.py

        items.py  # 项目提取字段定义文件

        middlewares.py # 项目中间件文件,用于定义属于自己特殊应用的中间件

        pipelines.py # 项目管道文件

        settings.py # 项目配置文件

        spiders/ #编写自己抓取各种数据方法目录

            init.py


编写Spider


    Spiders是自己定义的类,Scrapy用来从网站(或一组网站)上抓取信息。 他们必须对scrapy.Spider进行子类化并定义初始请求,可选择如何关注页面中的链接,以及如何解析下载的页面内容以提取数据。

    在tutorial/spiders目录下,创建名为quotes_spider.py的文件,用于编写具体的抓取方法。

    实例代码如下:

import scrapy

class QuotesSpider(scrapy.Spider):

    name=“quotes” #爬虫的名称,启动爬虫时需要该爬虫名称。

    def start_requests(self):

        urls=[

            ‘http://quotes.toscrape.com/page/1/’,

            ‘http://quotes.toscrape.com/page/2/’,

        ]

        for url in urls:

            yield scrapy.Request(url=url, callback=self.parse)

    def parse(self, response):

        page=response.url.split(“/”)[2]

        filename=‘quotes-%s.html’%page

        with open(filename, ‘wb’) as f:

            f.write(response.body)

            self.log(‘Saved file %s’%filename)

    为Spider子类(QuotesSpider)scrapy.Spider定义了一些属性和方法:

    名称:爬虫名字。 它在项目中必须是唯一的,也就是说,不能为不同的爬虫设置相同的名称。

    start_requests():必须返回一个迭代请求(你可以返回一个请求列表或者写一个生成器函数),Spider将开始抓取它。 随后的请求将从这些初始请求中连续生成。

    parse():将被调用来处理为每个请求下载的响应的方法。 响应参数是TextResponse的一个实例,用于保存页面内容,并有更多有用的方法来处理它。

    parse()方法通常解析响应,将提取的数据提取为字符串,并找到新的URL来跟踪并创建新的请求(Request)。


如何启动爬虫


    在工程的同级目录运行命令:scrapy crawl quotes。

     该命令使用刚刚添加的名称引号运行该爬虫,该爬虫将向quotes.toscrape.com域发送一些请求。 你会得到类似于这样的输出:

(omittedforbrevity)

20161216 21:24:05[scrapy.core.engine] INFO: Spider opened

20161216 21:24:05[scrapy.extensions.logstats] INFO: Crawled 0 pages(at 0 pages/min), scraped 0 items(at 0 items/min)

20161216 21:24:05[scrapy.extensions.telnet] DEBUG: Telnet console listening on 127.0.0.1:6023

….

    现在,检查当前目录中的文件。 您应该注意到已经创建了两个新文件:quotes-1.html和quotes-2.html,以及相应URL的内容,正如分析方法指示的那样。


爬虫运行的原理


    Scrapy安排由Spider的start_requests方法返回的scrapy.Request对象。 在收到每个响应后,它会实例化Response对象,并调用与请求相关的回调方法(在本例中为parse方法),将响应作为参数传递。

    除了实现从URL生成scrapy.Request对象的start_requests()方法外,您还可以使用URL列表定义start_urls类属性。 这个列表将被默认的start_requests()实现用来为你的爬虫创建初始请求:

import    scrapy

class    DmozSpider(scrapy.spiders.Spider):

    name=”dmoz”

    allowed_domains=[“dmoz.org”]

    start_urls=    [“http://www.dmoz.org/Computers/Programming/Languages/Python/Books/”,”http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/”]   

    def    parse(self,response):    

        filename=response.url.split(“/”)[-2]

        with    open(filename,’wb’)asf:

                f.write(response.body)

    该实例将调用parse()方法来处理这些URL的每个请求,即使没有明确告诉Scrapy这样做。 发生这种情况是因为parse()是Scrapy的默认回调方法,该方法在未显式分配回调的情况下针对请求调用。


提取数据


学习如何使用Scrapy提取数据的最佳方法是使用Scrapy shell,运行:

scrapy  shell  ‘http://quotes.toscrape.com/page/1/’

输出如下:

[…Scrapyloghere…]2016-09-1912:09:27[scrapy.core.engine]DEBUG:Crawled(200)(referer:None)[s]AvailableScrapyobjects:[s]scrapyscrapymodule(containsscrapy.Request,scrapy.Selector,etc)[s]crawler[s]item{}[s]request[s]response[s]settings[s]spider[s]Usefulshortcuts:[s]shelp()Shellhelp(printthishelp)[s]fetch(req_or_url)Fetchrequest(orURL)andupdatelocalobjects[s]view(response)Viewresponseinabrowser>>>

查看包含 [dmoz] 的输出,可以看到输出的log中包含定义在 start_urls 的初始URL,并且与spider中是一一对应的。在log中可以看到其没有指向其他页面( (referer:None) )。

除此之外,更有趣的事情发生了。就像parse 方法指定的那样,有两个包含url所对应的内容的文件被创建了: Book , Resources 。

刚才发生了什么?

Scrapy为Spider的 start_urls 属性中的每个URL创建了 scrapy.Request 对象,并将 parse 方法作为回调函数(callback)赋值给了Request。

Request对象经过调度,执行生成 scrapy.http.Response 对象并送回给spider parse() 方法。

提取Item

Selectors选择器简介

从网页中提取数据有很多方法。Scrapy使用了一种基于 XPath 和 CSS 表达式机制: Scrapy Selectors。 关于selector和其他提取机制的信息请参考 Selector文档 。

这里给出XPath表达式的例子及对应的含义:

/html/head/title: 选择HTML文档中 

 标签内的  元素</p> <p>/html/head/title/text(): 选择上面提到的 <br /> <title> 元素的文字<br /> //td: 选择所有的 </p> <td> 元素<br /> //div[@class=”mine”]: 选择所有具有 class=”mine” 属性的 div 元素</p> <p>上边仅仅是几个简单的XPath例子,XPath实际上要比这远远强大的多。 如果您想了解的更多,推荐官方文档。</p> <p>为了配合XPath,Scrapy除了提供了 Selector 之外,还提供了方法来避免每次从response中提取数据时生成selector的麻烦。</p> <p>Selector有四个基本的方法(点击相应的方法可以看到详细的API文档):</p> <p>xpath(): 传入xpath表达式,返回该表达式所对应的所有节点的selector list列表 。</p> <p>css(): 传入CSS表达式,返回该表达式所对应的所有节点的selector list列表.</p> <p>extract(): 序列化该节点为unicode字符串并返回list。</p> <p>re(): 根据传入的正则表达式对数据进行提取,返回unicode字符串list列表。</p> <h2>在Shell中尝试Selector选择器</h2> <p>为了介绍Selector的使用方法,接下来将要使用内置的 Scrapy shell 。Scrapy Shell需要您预装好IPython(一个扩展的Python终端)。</p> <p>您需要进入项目的根目录,执行下列命令来启动shell:</p> <p>scrapy    shell    “http://www.dmoz.org/Computers/Programming/Languages/Python/Books/”</p> <p>注解</p> <p>当您在终端运行Scrapy时,请一定记得给url地址加上引号,否则包含参数的url(例如 & 字符)会导致Scrapy运行失败。</p> <p>shell的输出类似:</p> <p>[…Scrapyloghere…]2015-01-0722:01:53+0800[domz]DEBUG:Crawled(200)(referer:None)[s]AvailableScrapyobjects:[s]crawler[s]item{}[s]request[s]response[s]selrnrn[s]settings>[s]spider[s]Usefulshortcuts:[s]shelp()Shellhelp(printthishelp)[s]fetch(req_or_url)Fetchrequest(orURL)andupdatelocalobjects[s]view(response)Viewresponseinabrowser>>></p> <p>当shell载入后,您将得到一个包含response数据的本地 response 变量。输入 response.body 将输出response的包体, 输出 response.headers 可以看到response的包头。</p> <p>更为重要的是,当输入 response.selector 时, 您将获取到一个可以用于查询返回数据的selector(选择器), 以及映射到 response.selector.xpath() 、 response.selector.css() 的 快捷方法(shortcut): response.xpath() 和 response.css() 。</p> <p>同时,shell根据response提前初始化了变量 sel 。该selector根据response的类型自动选择最合适的分析规则(XML vs HTML)。</p> <p>来试试:</p> <p>In[1]:sel.xpath(‘//title’)</p> <p>Out[1]:[Open Directory – Computers: Progr’>]</p> <p>In[2]:sel.xpath(‘//title’).extract()</p> <p>Out[2]:[u’<br /> <title>Open Directory – Computers: Programming: Languages: Python: Books‘]
In[3]:sel.xpath(‘//title/text()’)

Out[3]:[]

In[4]:sel.xpath(‘//title/text()’).extract()

Out[4]:[u’Open Directory – Computers: Programming: Languages: Python: Books’]

In[5]:sel.xpath(‘//title/text()’).re(‘(w+):’)

Out[5]:[u’Computers’,u’Programming’,u’Languages’,u’Python’]

提取数据

现在,来尝试从这些页面中提取些有用的数据。

您可以在终端中输入 response.body 来观察HTML源码并确定合适的XPath表达式。不过,这任务非常无聊且不易。您可以考虑使用Firefox的Firebug扩展来使得工作更为轻松。详情请参考 使用Firebug进行爬取 和 借助Firefox来爬取 。

在查看了网页的源码后,您会发现网站的信息是被包含在 第二个 

     元素中。
    可以通过这段代码选择该页面中网站列表里所有 

  •  元素:
    sel.xpath(‘//ul/li’)

    网站的描述:

    sel.xpath(‘//ul/li/text()’).extract()

    网站的标题:

    sel.xpath(‘//ul/li/a/text()’).extract()

    以及网站的链接:

    sel.xpath(‘//ul/li/a/@href’).extract()

    之前提到过,每个 .xpath() 调用返回selector组成的list,因此可以拼接更多的 .xpath() 来进一步获取某个节点。将在下边使用这样的特性:

    forselinresponse.xpath(‘//ul/li’):title=sel.xpath(‘a/text()’).extract()link=sel.xpath(‘a/@href’).extract()desc=sel.xpath(‘text()’).extract()printtitle,link,desc

    注解

    关于嵌套selctor的更多详细信息,请参考 嵌套选择器(selectors) 以及 选择器(Selectors) 文档中的 使用相对XPaths 部分。

    在spider中加入这段代码:

    import    scrapy    

    class    DmozSpider(scrapy.Spider):

            name=”dmoz”allowed_domains=[“dmoz.org”]

            start_urls=    [“http://www.dmoz.org/Computers/Programming/Languages/Python/Books/”,”http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/”]

    def    parse(self,response):

        for    sel    in    response.xpath(‘//ul/li’):

            title=sel.xpath(‘a/text()’).extract()

            link=sel.xpath(‘a/@href’).extract()

            desc=sel.xpath(‘text()’).extract()

            printtitle,link,desc

    现在尝试再次爬取dmoz.org,您将看到爬取到的网站信息被成功输出:

    scrapy    crawl    dmoz

    使用item

    Item 对象是自定义的python字典。 您可以使用标准的字典语法来获取到其每个字段的值。(字段即是之前用Field赋值的属性):

    >>> item=DmozItem()>>> item[‘title’]=’Example title’>>> item[‘title’]’Example title’

    一般来说,Spider将会将爬取到的数据以 Item 对象返回。所以为了将爬取的数据返回,最终的代码将是:

    import    scrapy    

    from    tutorial.items    import    DmozItem    

    class    DmozSpider(scrapy.Spider):

        name=”dmoz”allowed_domains=[“dmoz.org”]

        start_urls=    [“http://www.dmoz.org/Computers/Programming/Languages/Python/Books/”,”http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/”]

    def    parse(self,response):

        for    sel    in    response.xpath(‘//ul/li’):

            item=DmozItem()

            item[‘title’]=sel.xpath(‘a/text()’).extract()

            item[‘link’]=sel.xpath(‘a/@href’).extract()

            item[‘desc’]=sel.xpath(‘text()’).extract()

            yield    item

    注解

    您可以在 dirbot 项目中找到一个具有完整功能的spider。该项目可以通过 https://github.com/scrapy/dirbot 找到。

    现在对dmoz.org进行爬取将会产生 DmozItem 对象:

    [dmoz]DEBUG:Scrapedfrom{‘desc’:[u’ – By David Mertz; Addison Wesley. Book in progress, full text, ASCII format. Asks for feedback. [author website, Gnosis Software, Inc.n],’link’:[u’http://gnosis.cx/TPiP/’],’title’:[u’Text Processing in Python’]}[dmoz]DEBUG:Scrapedfrom{‘desc’:[u’ – By Sean McGrath; Prentice Hall PTR, 2000, ISBN 0130211192, has CD-ROM. Methods to build XML applications fast, Python tutorial, DOM and SAX, new Pyxie open source XML processing library. [Prentice Hall PTR]n’],’link’:[u’http://www.informit.com/store/product.aspx?isbn=0130211192′],’title’:[u’XML Processing with Python’]}

    保存爬取到的数据

    最简单存储爬取的数据的方式是使用 Feed exports:

    scrapy    crawl    dmoz-oitems.json

    该命令将采用 JSON 格式对爬取的数据进行序列化,生成 items.json 文件。

    在类似本篇教程里这样小规模的项目中,这种存储方式已经足够。 如果需要对爬取到的item做更多更为复杂的操作,您可以编写 Item Pipeline 。 类似于我们在创建项目时对Item做的,用于您编写自己的 tutorial/pipelines.py 也被创建。 不过如果您仅仅想要保存item,您不需要实现任何的pipeline。

    推荐阅读更多精彩内容

    • 2021最新爬虫教程
      爬虫框架就是一些爬虫项目的半成品,可以将些爬虫常用的功能写好。然后留下一些接口,在不同的爬虫项目当中,调用适合自己…
      印象python阅读 639评论 0赞 9
    • Python爬虫自动化,帮小姐姐解放双手!
      项目来源: 漂亮学姐因为工作需要,得根据已有的学校名单,采集它们的英文名称,描述,简称有的话也带上。共有 2740…
      爱是一道光_e5f7阅读 85评论 0赞 2
    • Python爬虫:AcFun弹幕视频网!太清晰了!
      单个短视频 获取视频的信息 为了能够方便的解析与说明,就肯定会拿一个例子来才好的哇: 【仙女UP特辑】AcFun …
      爱是一道光_e5f7阅读 115评论 0赞 2
    • 接口测试工具
      Web接口测试工具—Poster与Postman[http://www.cnblogs.com/fnng/p/…
      曹元_阅读 525评论 0赞 6
    • Python网络爬虫——爬取视频网站源视频!
      学习前提 1、了解python基础语法 2、了解re、selenium、BeautifulSoup、os、requ…
      爱是一道光_e5f7阅读 309评论 0赞 3
    评论0
    赞3
    3赞4赞
    赞赏
    下载App

    {“dataManager”:”[]”,”props”:{“isServer”:true,”initialState”:{“global”:{“done”:false,”artFromType”:null,”fontType”:”black”,”modal”:{“ContributeModal”:false,”RewardListModal”:false,”PayModal”:false,”CollectionModal”:false,”LikeListModal”:false,”ReportModal”:false,”QRCodeShareModal”:false,”BookCatalogModal”:false,”RewardModal”:false},”ua”:{“value”:”Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36″,”isIE11″:false,”earlyIE”:null,”chrome”:”58.0″,”firefox”:null,”safari”:null,”isMac”:false},”$diamondRate”:{“displayable”:false,”rate”:0},”readMode”:”day”,”locale”:”zh-CN”,”seoList”:[{“comments_count”:0,”public_abbr”:”爬虫框架就是一些爬虫项目的半成品,可以将些爬虫常用的功能写好。然后留下一些接口,在不同的爬虫项目当中,调用适合自己…”,”share_image_url”:”https://upload-images.jianshu.io/upload_images/19311345-3fd071d5c01cb584″,”slug”:”66244f61164b”,”user”:{“id”:19311345,”nickname”:”印象python”,”slug”:”2a2150308f7c”,”avatar”:”https://upload.jianshu.io/users/upload_avatars/19311345/ddf23056-19a5-467a-9575-ce17c3cae983.jpg”},”likes_count”:9,”title”:”2021最新爬虫教程”,”id”:82034826,”views_count”:639},{“comments_count”:0,”public_abbr”:”项目来源: 漂亮学姐因为工作需要,得根据已有的学校名单,采集它们的英文名称,描述,简称有的话也带上。共有 2740…”,”share_image_url”:”https://upload-images.jianshu.io/upload_images/24596166-33763fa08df97784.png”,”slug”:”6bb23622e9d5″,”user”:{“id”:24596166,”nickname”:”爱是一道光_e5f7″,”slug”:”7e41657d7c21″,”avatar”:”https://upload.jianshu.io/users/upload_avatars/24596166/dc6d513e-c787-446a-9fad-7ebd19480c79″},”likes_count”:2,”title”:”Python爬虫自动化,帮小姐姐解放双手!”,”id”:82292839,”views_count”:85},{“comments_count”:0,”public_abbr”:”单个短视频 获取视频的信息 为了能够方便的解析与说明,就肯定会拿一个例子来才好的哇: 【仙女UP特辑】AcFun …”,”share_image_url”:”https://upload-images.jianshu.io/upload_images/24596166-d1f648da2afaeb26″,”slug”:”33fcfd5ee773″,”user”:{“id”:24596166,”nickname”:”爱是一道光_e5f7″,”slug”:”7e41657d7c21″,”avatar”:”https://upload.jianshu.io/users/upload_avatars/24596166/dc6d513e-c787-446a-9fad-7ebd19480c79″},”likes_count”:2,”title”:”Python爬虫:AcFun弹幕视频网!太清晰了!”,”id”:78716923,”views_count”:115},{“comments_count”:0,”public_abbr”:”Web接口测试工具—Poster与Postman[http://www.cnblogs.com/fnng/p/…”,”share_image_url”:”https://upload-images.jianshu.io/upload_images/23770617-3347eef11edd08d6.png”,”slug”:”b39a40e4401a”,”user”:{“id”:23770617,”nickname”:”曹元_”,”slug”:”3bf86d473626″,”avatar”:”https://upload.jianshu.io/users/upload_avatars/23770617/db472dfb-062c-440e-924b-ba8c3348ecde.jpg”},”likes_count”:6,”title”:”接口测试工具”,”id”:76436630,”views_count”:525},{“comments_count”:0,”public_abbr”:”学习前提 1、了解python基础语法 2、了解re、selenium、BeautifulSoup、os、requ…”,”share_image_url”:”https://upload-images.jianshu.io/upload_images/24596166-30574da02ead246c”,”slug”:”10f9ec10dbef”,”user”:{“id”:24596166,”nickname”:”爱是一道光_e5f7″,”slug”:”7e41657d7c21″,”avatar”:”https://upload.jianshu.io/users/upload_avatars/24596166/dc6d513e-c787-446a-9fad-7ebd19480c79″},”likes_count”:3,”title”:”Python网络爬虫——爬取视频网站源视频!”,”id”:79606925,”views_count”:309}]},”note”:{“data”:{“is_author”:false,”last_updated_at”:1544597770,”public_title”:”爬虫-Scrapy 快速入门指南”,”purchased”:false,”liked_note”:false,”comments_count”:0,”free_content”:”u003ch1u003e简介u003c/h1u003eu003chru003eu003cpu003e    Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。u003c/pu003eu003cpu003e    其最初是为了 页面抓取 (更确切来说, 网络抓取 )所设计的, 也可以应用在获取API所返回的数据或者通用的网络爬虫。u003c/pu003eu003cpu003e使用建议,爬取数据的时候为了防止ip地址被封禁,有以下几个建议:u003c/pu003eu003cpu003e1.修改配置文件伪造session信息。u003c/pu003eu003cpu003e2.抓取间隔时间尽量要长。u003c/pu003eu003cpu003e3.通过代理使用ip地址池,循环使用,避免使用一个地址。u003c/pu003eu003cpu003e4.请求透过Tor Browser,防止自身ip被禁。u003c/pu003eu003chru003eu003ch1u003e安装u003c/h1u003eu003chru003eu003cpu003e    由于scrapy依赖的安装包很多,所以推荐使用pip工具实现快速安装。安装命令如下:pip install Scrapy 。其他安装方式可以参考官方文档。u003c/pu003eu003cpu003e    注:先下载pip安装文件,下载地址:https://bootstrap.pypa.io/get-pip.py,然后运行pip安装命令:python get-pip.py。u003c/pu003eu003chru003eu003ch1u003e实例u003c/h1u003eu003chru003eu003cpu003e      将抓取quotes.toscrape.com网站数据,这是一个列出著名作家引用的网站。u003c/pu003eu003cpu003e    本教程将引导您完成这些任务:u003c/pu003eu003cpu003e    1.创建一个新的Scrapy项目u003c/pu003eu003cpu003e    2.编写爬虫抓取网站并提取数据u003c/pu003eu003cpu003e    3.使用命令行导出抓取的数据u003c/pu003eu003cpu003e    4.更改爬虫递归跟随链接u003c/pu003eu003cpu003e    5.使用爬虫参数u003c/pu003eu003chru003eu003ch1u003e创建Scrapy项目u003c/h1u003eu003chru003eu003cpu003e    选择工程存放目录,创建名为tutorial的工程,然后运行如下命令:scrapy startproject tutorialu003ciu003e.u003c/iu003eu003c/pu003eu003cpu003e这将创建一个包含以下内容的tutorial目录:u003c/pu003eu003cpu003etutorial/u003c/pu003eu003cpu003e    scrapy.cfg  # 部署配置文件u003c/pu003eu003cpu003e    tutorial/ #项目的Python模块,从这里导入你的代码u003c/pu003eu003cpu003e        __init__.pyu003c/pu003eu003cpu003e        items.py  # 项目提取字段定义文件u003c/pu003eu003cpu003e        middlewares.py # 项目中间件文件,用于定义属于自己特殊应用的中间件u003c/pu003eu003cpu003e        pipelines.py # 项目管道文件u003c/pu003eu003cpu003e        settings.py # 项目配置文件u003c/pu003eu003cpu003e        spiders/ #编写自己抓取各种数据方法目录u003c/pu003eu003cpu003e            __init__.pyu003c/pu003eu003chru003eu003ch1u003e编写Spideru003c/h1u003eu003chru003eu003cpu003e    Spiders是自己定义的类,Scrapy用来从网站(或一组网站)上抓取信息。 他们必须对scrapy.Spider进行子类化并定义初始请求,可选择如何关注页面中的链接,以及如何解析下载的页面内容以提取数据。u003c/pu003eu003cpu003e    在tutorial/spiders目录下,创建名为quotes_spider.py的文件,用于编写具体的抓取方法。u003c/pu003eu003cpu003e    实例代码如下:u003c/pu003eu003cpu003eu003cbu003eimportu003c/bu003e scrapyu003c/pu003eu003cpu003eu003cbu003eclassu003c/bu003e u003cbu003eQuotesSpideru003c/bu003e(scrapyu003cbu003e.u003c/bu003eSpider):u003c/pu003eu003cpu003e    nameu003cbu003e=u003c/bu003e”quotes” #爬虫的名称,启动爬虫时需要该爬虫名称。u003c/pu003eu003cpu003e    u003cbu003edef u003c/bu003eu003cbu003estart_requestsu003c/bu003e(self):u003c/pu003eu003cpu003e        urlsu003cbu003e=u003c/bu003e[u003c/pu003eu003cpu003e            ‘http://quotes.toscrape.com/page/1/’,u003c/pu003eu003cpu003e            ‘http://quotes.toscrape.com/page/2/’,u003c/pu003eu003cpu003e        ]u003c/pu003eu003cpu003e        u003cbu003efor u003c/bu003eurl u003cbu003ein u003c/bu003eurls:u003c/pu003eu003cpu003e            u003cbu003eyield u003c/bu003escrapyu003cbu003e.u003c/bu003eRequest(urlu003cbu003e=u003c/bu003eurl, callbacku003cbu003e=u003c/bu003eselfu003cbu003e.u003c/bu003eparse)u003c/pu003eu003cpu003e    u003cbu003edef u003c/bu003eu003cbu003eparseu003c/bu003e(self, response):u003c/pu003eu003cpu003e        pageu003cbu003e=u003c/bu003eresponseu003cbu003e.u003c/bu003eurlu003cbu003e.u003c/bu003esplit(“/”)[u003cbu003e-u003c/bu003e2]u003c/pu003eu003cpu003e        filenameu003cbu003e=u003c/bu003e’quotes-%s.html’u003cbu003e%u003c/bu003epageu003c/pu003eu003cpu003e        u003cbu003ewith u003c/bu003eopen(filename, ‘wb’) u003cbu003eas u003c/bu003ef:u003c/pu003eu003cpu003e            fu003cbu003e.u003c/bu003ewrite(responseu003cbu003e.u003c/bu003ebody)u003c/pu003eu003cpu003e            selfu003cbu003e.u003c/bu003elog(‘Saved file %s’u003cbu003e%u003c/bu003efilename)u003c/pu003eu003cpu003e    为Spider子类(u003cbu003eQuotesSpideru003c/bu003e)scrapy.Spider定义了一些属性和方法:u003c/pu003eu003cpu003e    名称:爬虫名字。 它在项目中必须是唯一的,也就是说,不能为不同的爬虫设置相同的名称。u003c/pu003eu003cpu003e    start_requests():必须返回一个迭代请求(你可以返回一个请求列表或者写一个生成器函数),Spider将开始抓取它。 随后的请求将从这些初始请求中连续生成。u003c/pu003eu003cpu003e    parse():将被调用来处理为每个请求下载的响应的方法。 响应参数是TextResponse的一个实例,用于保存页面内容,并有更多有用的方法来处理它。u003c/pu003eu003cpu003e    parse()方法通常解析响应,将提取的数据提取为字符串,并找到新的URL来跟踪并创建新的请求(Request)。u003c/pu003eu003chru003eu003ch1u003e如何启动爬虫u003c/h1u003eu003chru003eu003cpu003e    在工程的同级目录运行命令:scrapy crawl quotes。u003c/pu003eu003cpu003e     该命令使用刚刚添加的名称引号运行该爬虫,该爬虫将向quotes.toscrape.com域发送一些请求。 你会得到类似于这样的输出:u003c/pu003eu003cpu003eu003cbu003e…u003c/bu003e(omittedu003cbu003eforu003c/bu003ebrevity)u003c/pu003eu003cpu003e2016u003cbu003e-u003c/bu003e12u003cbu003e-u003c/bu003e16 21:24:05[scrapyu003cbu003e.u003c/bu003ecoreu003cbu003e.u003c/bu003eengine] INFO: Spider openedu003c/pu003eu003cpu003e2016u003cbu003e-u003c/bu003e12u003cbu003e-u003c/bu003e16 21:24:05[scrapyu003cbu003e.u003c/bu003eextensionsu003cbu003e.u003c/bu003elogstats] INFO: Crawled 0 pages(at 0 pagesu003cbu003e/u003c/bu003emin), scraped 0 items(at 0 itemsu003cbu003e/u003c/bu003emin)u003c/pu003eu003cpu003e2016u003cbu003e-u003c/bu003e12u003cbu003e-u003c/bu003e16 21:24:05[scrapyu003cbu003e.u003c/bu003eextensionsu003cbu003e.u003c/bu003etelnet] DEBUG: Telnet console listening on 127.0u003cbu003e.u003c/bu003e0.1:6023u003c/pu003eu003cpu003e….u003c/pu003eu003cpu003e    现在,检查当前目录中的文件。 您应该注意到已经创建了两个新文件:quotes-1.html和quotes-2.html,以及相应URL的内容,正如分析方法指示的那样。u003c/pu003eu003chru003eu003ch1u003e爬虫运行的原理u003c/h1u003eu003chru003eu003cpu003e    Scrapy安排由Spider的start_requests方法返回的scrapy.Request对象。 在收到每个响应后,它会实例化Response对象,并调用与请求相关的回调方法(在本例中为parse方法),将响应作为参数传递。u003c/pu003eu003cpu003e    除了实现从URL生成scrapy.Request对象的start_requests()方法外,您还可以使用URL列表定义start_urls类属性。 这个列表将被默认的start_requests()实现用来为你的爬虫创建初始请求:u003c/pu003eu003cpu003eimport    scrapyu003c/pu003eu003cpu003eclass    DmozSpider(scrapy.spiders.Spider):u003c/pu003eu003cpu003e    name=”dmoz”u003c/pu003eu003cpu003e    allowed_domains=[“dmoz.org”]u003c/pu003eu003cpu003e    start_urls=    [“http://www.dmoz.org/Computers/Programming/Languages/Python/Books/”,”http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/”]   u003c/pu003eu003cpu003e    def    parse(self,response):    u003c/pu003eu003cpu003e        filename=response.url.split(“/”)[-2]u003c/pu003eu003cpu003e        with    open(filename,’wb’)asf:u003c/pu003eu003cpu003e                f.write(response.body)u003c/pu003eu003cpu003e    该实例将调用parse()方法来处理这些URL的每个请求,即使没有明确告诉Scrapy这样做。 发生这种情况是因为parse()是Scrapy的默认回调方法,该方法在未显式分配回调的情况下针对请求调用。u003c/pu003eu003chru003eu003ch1u003e提取数据u003c/h1u003eu003chru003eu003cpu003e学习如何使用Scrapy提取数据的最佳方法是使用Scrapy shell,运行:u003c/pu003eu003cpu003escrapy  shell  ‘http://quotes.toscrape.com/page/1/’u003c/pu003eu003cpu003e输出如下:u003c/pu003eu003cpu003e[…Scrapyloghere…]2016-09-1912:09:27[scrapy.core.engine]DEBUG:Crawled(200)u0026lt;GEThttp://quotes.toscrape.com/page/1/u0026gt;(referer:None)[s]AvailableScrapyobjects:[s]scrapyscrapymodule(containsscrapy.Request,scrapy.Selector,etc)[s]crawleru0026lt;scrapy.crawler.Crawlerobjectat0x7fa91d888c90u0026gt;[s]item{}[s]requestu0026lt;GEThttp://quotes.toscrape.com/page/1/u0026gt;[s]responseu0026lt;200http://quotes.toscrape.com/page/1/u0026gt;[s]settingsu0026lt;scrapy.settings.Settingsobjectat0x7fa91d888c10u0026gt;[s]spideru0026lt;DefaultSpider’default’at0x7fa91c8af990u0026gt;[s]Usefulshortcuts:[s]shelp()Shellhelp(printthishelp)[s]fetch(req_or_url)Fetchrequest(orURL)andupdatelocalobjects[s]view(response)Viewresponseinabrowseru0026gt;u0026gt;u0026gt;u003c/pu003eu003cpu003e查看包含 [dmoz] 的输出,可以看到输出的log中包含定义在 start_urls 的初始URL,并且与spider中是一一对应的。在log中可以看到其没有指向其他页面( (referer:None) )。u003c/pu003eu003cpu003e除此之外,更有趣的事情发生了。就像parse 方法指定的那样,有两个包含url所对应的内容的文件被创建了: u003ciu003eBooku003c/iu003e , u003ciu003eResourcesu003c/iu003e 。u003c/pu003eu003ch2u003e刚才发生了什么?u003cbru003enu003c/h2u003eu003cpu003eScrapy为Spider的 start_urls 属性中的每个URL创建了 u003ca href=”https://scrapy-chs.readthedocs.io/zh_CN/latest/topics/request-response.html#scrapy.http.Request” target=”_blank” rel=”nofollow”u003escrapy.Requestu003c/au003e 对象,并将 parse 方法作为回调函数(callback)赋值给了Request。u003c/pu003eu003cpu003eRequest对象经过调度,执行生成 u003ca href=”https://scrapy-chs.readthedocs.io/zh_CN/latest/topics/request-response.html#scrapy.http.Response” target=”_blank” rel=”nofollow”u003escrapy.http.Responseu003c/au003e 对象并送回给spider u003ca href=”https://scrapy-chs.readthedocs.io/zh_CN/latest/topics/spiders.html#scrapy.spider.Spider.parse” target=”_blank” rel=”nofollow”u003eparse()u003c/au003e 方法。u003c/pu003eu003ch2u003e提取Itemu003c/h2u003eu003ch2u003eSelectors选择器简介u003c/h2u003eu003cpu003e从网页中提取数据有很多方法。Scrapy使用了一种基于 u003ca href=”http://www.w3.org/TR/xpath” target=”_blank” rel=”nofollow”u003eXPathu003c/au003e 和 u003ca href=”http://www.w3.org/TR/selectors” target=”_blank” rel=”nofollow”u003eCSSu003c/au003e 表达式机制: u003ca href=”https://scrapy-chs.readthedocs.io/zh_CN/latest/topics/selectors.html#topics-selectors” target=”_blank” rel=”nofollow”u003eScrapy Selectorsu003c/au003e。 关于selector和其他提取机制的信息请参考 u003ca href=”https://scrapy-chs.readthedocs.io/zh_CN/latest/topics/selectors.html#topics-selectors” target=”_blank” rel=”nofollow”u003eSelector文档u003c/au003e 。u003c/pu003eu003cpu003e这里给出XPath表达式的例子及对应的含义:u003c/pu003eu003cpu003e/html/head/title: 选择HTML文档中 u0026lt;headu0026gt; 标签内的 u0026lt;titleu0026gt; 元素u003c/pu003eu003cpu003e/html/head/title/text(): 选择上面提到的 u0026lt;titleu0026gt; 元素的文字u003c/pu003eu003cpu003e//td: 选择所有的 u0026lt;tdu0026gt; 元素u003c/pu003eu003cpu003e//div[@class=”mine”]: 选择所有具有 class=”mine” 属性的 div 元素u003c/pu003eu003cpu003e上边仅仅是几个简单的XPath例子,XPath实际上要比这远远强大的多。 如果您想了解的更多,推荐官方文档。u003c/pu003eu003cpu003e为了配合XPath,Scrapy除了提供了 u003ca href=”https://scrapy-chs.readthedocs.io/zh_CN/latest/topics/selectors.html#scrapy.selector.Selector” target=”_blank” rel=”nofollow”u003eSelectoru003c/au003e 之外,还提供了方法来避免每次从response中提取数据时生成selector的麻烦。u003c/pu003eu003cpu003eSelector有四个基本的方法(点击相应的方法可以看到详细的API文档):u003c/pu003eu003cpu003eu003ca href=”https://scrapy-chs.readthedocs.io/zh_CN/latest/topics/selectors.html#scrapy.selector.Selector.xpath” target=”_blank” rel=”nofollow”u003expath()u003c/au003e: 传入xpath表达式,返回该表达式所对应的所有节点的selector list列表 。u003c/pu003eu003cpu003eu003ca href=”https://scrapy-chs.readthedocs.io/zh_CN/latest/topics/selectors.html#scrapy.selector.Selector.css” target=”_blank” rel=”nofollow”u003ecss()u003c/au003e: 传入CSS表达式,返回该表达式所对应的所有节点的selector list列表.u003c/pu003eu003cpu003eu003ca href=”https://scrapy-chs.readthedocs.io/zh_CN/latest/topics/selectors.html#scrapy.selector.Selector.extract” target=”_blank” rel=”nofollow”u003eextract()u003c/au003e: 序列化该节点为unicode字符串并返回list。u003c/pu003eu003cpu003eu003ca href=”https://scrapy-chs.readthedocs.io/zh_CN/latest/topics/selectors.html#scrapy.selector.Selector.re” target=”_blank” rel=”nofollow”u003ere()u003c/au003e: 根据传入的正则表达式对数据进行提取,返回unicode字符串list列表。u003c/pu003eu003ch2u003e在Shell中尝试Selector选择器u003c/h2u003eu003cpu003e为了介绍Selector的使用方法,接下来将要使用内置的 u003ca href=”https://scrapy-chs.readthedocs.io/zh_CN/latest/topics/shell.html#topics-shell” target=”_blank” rel=”nofollow”u003eScrapy shellu003c/au003e 。Scrapy Shell需要您预装好IPython(一个扩展的Python终端)。u003c/pu003eu003cpu003e您需要进入项目的根目录,执行下列命令来启动shell:u003c/pu003eu003cpu003escrapy    shell    “http://www.dmoz.org/Computers/Programming/Languages/Python/Books/”u003c/pu003eu003cpu003e注解u003c/pu003eu003cpu003e当您在终端运行Scrapy时,请一定记得给url地址加上引号,否则包含参数的url(例如 u0026amp; 字符)会导致Scrapy运行失败。u003c/pu003eu003cpu003eshell的输出类似:u003c/pu003eu003cpu003e[…Scrapyloghere…]2015-01-0722:01:53+0800[domz]DEBUG:Crawled(200)u0026lt;GEThttp://www.dmoz.org/Computers/Programming/Languages/Python/Books/u0026gt;(referer:None)[s]AvailableScrapyobjects:[s]crawleru0026lt;scrapy.crawler.Crawlerobjectat0x02CE2530u0026gt;[s]item{}[s]requestu0026lt;GEThttp://www.dmoz.org/Computers/Programming/Languages/Python/Books/u0026gt;[s]responseu0026lt;200http://www.dmoz.org/Computers/Programming/Languages/Python/Books/u0026gt;[s]selu0026lt;Selectorxpath=Nonedata=u’u0026lt;html lang=”en”u0026gt;\r\nu0026lt;headu0026gt;\r\nu0026lt;meta http-equ’u0026gt;[s]settingsu0026lt;CrawlerSettingsmodule=u0026lt;module’tutorial.settings’from’tutorial\settings.pyc’u0026gt;u0026gt;[s]spideru0026lt;DomzSpider’domz’at0x302e350u0026gt;[s]Usefulshortcuts:[s]shelp()Shellhelp(printthishelp)[s]fetch(req_or_url)Fetchrequest(orURL)andupdatelocalobjects[s]view(response)Viewresponseinabrowseru0026gt;u0026gt;u0026gt;u003c/pu003eu003cpu003e当shell载入后,您将得到一个包含response数据的本地 response 变量。输入 response.body 将输出response的包体, 输出 response.headers 可以看到response的包头。u003c/pu003eu003cpu003e更为重要的是,当输入 response.selector 时, 您将获取到一个可以用于查询返回数据的selector(选择器), 以及映射到 response.selector.xpath() 、 response.selector.css() 的 快捷方法(shortcut): response.xpath() 和 response.css() 。u003c/pu003eu003cpu003e同时,shell根据response提前初始化了变量 sel 。该selector根据response的类型自动选择最合适的分析规则(XML vs HTML)。u003c/pu003eu003cpu003e来试试:u003c/pu003eu003cpu003eIn[1]:sel.xpath(‘//title’)u003c/pu003eu003cpu003eOut[1]:[u0026lt;Selectorxpath=’//title’data=u’u0026lt;titleu0026gt;Open Directory – Computers: Progr’u0026gt;]u003c/pu003eu003cpu003eIn[2]:sel.xpath(‘//title’).extract()u003c/pu003eu003cpu003eOut[2]:[u’u0026lt;titleu0026gt;Open Directory – Computers: Programming: Languages: Python: Booksu0026lt;/titleu0026gt;’]u003c/pu003eu003cpu003eIn[3]:sel.xpath(‘//title/text()’)u003c/pu003eu003cpu003eOut[3]:[u0026lt;Selectorxpath=’//title/text()’data=u’Open Directory – Computers: Programming:’u0026gt;]u003c/pu003eu003cpu003eIn[4]:sel.xpath(‘//title/text()’).extract()u003c/pu003eu003cpu003eOut[4]:[u’Open Directory – Computers: Programming: Languages: Python: Books’]u003c/pu003eu003cpu003eIn[5]:sel.xpath(‘//title/text()’).re(‘(\w+):’)u003c/pu003eu003cpu003eOut[5]:[u’Computers’,u’Programming’,u’Languages’,u’Python’]u003c/pu003eu003ch2u003e提取数据u003c/h2u003eu003cpu003e现在,来尝试从这些页面中提取些有用的数据。u003c/pu003eu003cpu003e您可以在终端中输入 response.body 来观察HTML源码并确定合适的XPath表达式。不过,这任务非常无聊且不易。您可以考虑使用Firefox的Firebug扩展来使得工作更为轻松。详情请参考 u003ca href=”https://scrapy-chs.readthedocs.io/zh_CN/latest/topics/firebug.html#topics-firebug” target=”_blank” rel=”nofollow”u003e使用Firebug进行爬取u003c/au003e 和 u003ca href=”https://scrapy-chs.readthedocs.io/zh_CN/latest/topics/firefox.html#topics-firefox” target=”_blank” rel=”nofollow”u003e借助Firefox来爬取u003c/au003e 。u003c/pu003eu003cpu003e在查看了网页的源码后,您会发现网站的信息是被包含在 u003ciu003e第二个u003c/iu003e u0026lt;ulu0026gt; 元素中。u003c/pu003eu003cpu003e可以通过这段代码选择该页面中网站列表里所有 u0026lt;liu0026gt; 元素:u003c/pu003eu003cpu003esel.xpath(‘//ul/li’)u003c/pu003eu003cpu003e网站的描述:u003c/pu003eu003cpu003esel.xpath(‘//ul/li/text()’).extract()u003c/pu003eu003cpu003e网站的标题:u003c/pu003eu003cpu003esel.xpath(‘//ul/li/a/text()’).extract()u003c/pu003eu003cpu003e以及网站的链接:u003c/pu003eu003cpu003esel.xpath(‘//ul/li/a/@href’).extract()u003c/pu003eu003cpu003e之前提到过,每个 .xpath() 调用返回selector组成的list,因此可以拼接更多的 .xpath() 来进一步获取某个节点。将在下边使用这样的特性:u003c/pu003eu003cpu003eforselinresponse.xpath(‘//ul/li’):title=sel.xpath(‘a/text()’).extract()link=sel.xpath(‘a/@href’).extract()desc=sel.xpath(‘text()’).extract()printtitle,link,descu003c/pu003eu003cpu003e注解u003c/pu003eu003cpu003e关于嵌套selctor的更多详细信息,请参考 u003ca href=”https://scrapy-chs.readthedocs.io/zh_CN/latest/topics/selectors.html#topics-selectors-nesting-selectors” target=”_blank” rel=”nofollow”u003e嵌套选择器(selectors)u003c/au003e 以及 u003ca href=”https://scrapy-chs.readthedocs.io/zh_CN/latest/topics/selectors.html#topics-selectors” target=”_blank” rel=”nofollow”u003e选择器(Selectors)u003c/au003e 文档中的 u003ca href=”https://scrapy-chs.readthedocs.io/zh_CN/latest/topics/selectors.html#topics-selectors-relative-xpaths” target=”_blank” rel=”nofollow”u003e使用相对XPathsu003c/au003e 部分。u003c/pu003eu003cpu003e在spider中加入这段代码:u003c/pu003eu003cpu003eimport    scrapy    u003c/pu003eu003cpu003eclass    DmozSpider(scrapy.Spider):u003c/pu003eu003cpu003e        name=”dmoz”allowed_domains=[“dmoz.org”]u003c/pu003eu003cpu003e        start_urls=    [“http://www.dmoz.org/Computers/Programming/Languages/Python/Books/”,”http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/”]u003c/pu003eu003cpu003edef    parse(self,response):u003c/pu003eu003cpu003e    for    sel    in    response.xpath(‘//ul/li’):u003c/pu003eu003cpu003e        title=sel.xpath(‘a/text()’).extract()u003c/pu003eu003cpu003e        link=sel.xpath(‘a/@href’).extract()u003c/pu003eu003cpu003e        desc=sel.xpath(‘text()’).extract()u003c/pu003eu003cpu003e        printtitle,link,descu003c/pu003eu003cpu003e现在尝试再次爬取dmoz.org,您将看到爬取到的网站信息被成功输出:u003c/pu003eu003cpu003escrapy    crawl    dmozu003c/pu003eu003ch2u003e使用itemu003c/h2u003eu003cpu003eu003ca href=”https://scrapy-chs.readthedocs.io/zh_CN/latest/topics/items.html#scrapy.item.Item” target=”_blank” rel=”nofollow”u003eItemu003c/au003e 对象是自定义的python字典。 您可以使用标准的字典语法来获取到其每个字段的值。(字段即是之前用Field赋值的属性):u003c/pu003eu003cpu003eu0026gt;u0026gt;u0026gt; item=DmozItem()u0026gt;u0026gt;u0026gt; item[‘title’]=’Example title’u0026gt;u0026gt;u0026gt; item[‘title’]’Example title’u003c/pu003eu003cpu003e一般来说,Spider将会将爬取到的数据以 u003ca href=”https://scrapy-chs.readthedocs.io/zh_CN/latest/topics/items.html#scrapy.item.Item” target=”_blank” rel=”nofollow”u003eItemu003c/au003e 对象返回。所以为了将爬取的数据返回,最终的代码将是:u003c/pu003eu003cpu003eimport    scrapy    u003c/pu003eu003cpu003efrom    tutorial.items    import    DmozItem    u003c/pu003eu003cpu003eclass    DmozSpider(scrapy.Spider):u003c/pu003eu003cpu003e    name=”dmoz”allowed_domains=[“dmoz.org”]u003c/pu003eu003cpu003e    start_urls=    [“http://www.dmoz.org/Computers/Programming/Languages/Python/Books/”,”http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/”]u003c/pu003eu003cpu003edef    parse(self,response):u003c/pu003eu003cpu003e    for    sel    in    response.xpath(‘//ul/li’):u003c/pu003eu003cpu003e        item=DmozItem()u003c/pu003eu003cpu003e        item[‘title’]=sel.xpath(‘a/text()’).extract()u003c/pu003eu003cpu003e        item[‘link’]=sel.xpath(‘a/@href’).extract()u003c/pu003eu003cpu003e        item[‘desc’]=sel.xpath(‘text()’).extract()u003c/pu003eu003cpu003e        yield    itemu003c/pu003eu003cpu003e注解u003c/pu003eu003cpu003e您可以在 u003ca href=”https://github.com/scrapy/dirbot” target=”_blank” rel=”nofollow”u003edirbotu003c/au003e 项目中找到一个具有完整功能的spider。该项目可以通过 u003ca href=”https://github.com/scrapy/dirbot” target=”_blank” rel=”nofollow”u003ehttps://github.com/scrapy/dirbotu003c/au003e 找到。u003c/pu003eu003cpu003e现在对dmoz.org进行爬取将会产生 DmozItem 对象:u003c/pu003eu003cpu003e[dmoz]DEBUG:Scrapedfromu0026lt;200http://www.dmoz.org/Computers/Programming/Languages/Python/Books/u0026gt;{‘desc’:[u’ – By David Mertz; Addison Wesley. Book in progress, full text, ASCII format. Asks for feedback. [author website, Gnosis Software, Inc.\n],’link’:[u’http://gnosis.cx/TPiP/’],’title’:[u’Text Processing in Python’]}[dmoz]DEBUG:Scrapedfromu0026lt;200http://www.dmoz.org/Computers/Programming/Languages/Python/Books/u0026gt;{‘desc’:[u’ – By Sean McGrath; Prentice Hall PTR, 2000, ISBN 0130211192, has CD-ROM. Methods to build XML applications fast, Python tutorial, DOM and SAX, new Pyxie open source XML processing library. [Prentice Hall PTR]\n’],’link’:[u’http://www.informit.com/store/product.aspx?isbn=0130211192′],’title’:[u’XML Processing with Python’]}u003c/pu003eu003ch2u003e保存爬取到的数据u003c/h2u003eu003cpu003e最简单存储爬取的数据的方式是使用 u003ca href=”https://scrapy-chs.readthedocs.io/zh_CN/latest/topics/feed-exports.html#topics-feed-exports” target=”_blank” rel=”nofollow”u003eFeed exportsu003c/au003e:u003c/pu003eu003cpu003escrapy    crawl    dmoz-oitems.jsonu003c/pu003eu003cpu003e该命令将采用 u003ca href=”http://en.wikipedia.org/wiki/JSON” target=”_blank” rel=”nofollow”u003eJSONu003c/au003e 格式对爬取的数据进行序列化,生成 items.json 文件。u003c/pu003eu003cpu003e在类似本篇教程里这样小规模的项目中,这种存储方式已经足够。 如果需要对爬取到的item做更多更为复杂的操作,您可以编写 u003ca href=”https://scrapy-chs.readthedocs.io/zh_CN/latest/topics/item-pipeline.html#topics-item-pipeline” target=”_blank” rel=”nofollow”u003eItem Pipelineu003c/au003e 。 类似于我们在创建项目时对Item做的,用于您编写自己的 tutorial/pipelines.py 也被创建。 不过如果您仅仅想要保存item,您不需要实现任何的pipeline。u003c/pu003e”,”voted_down”:false,”rewardable”:true,”show_paid_comment_tips”:false,”share_image_url”:”https://upload.jianshu.io/users/upload_avatars/10069184/77607a74-ab3e-4397-b247-e04244ccbdf4.jpg”,”slug”:”df1f4d894ca7″,”user”:{“liked_by_user”:false,”following_count”:1,”gender”:0,”avatar_widget”:null,”slug”:”f7ebd3cf384b”,”intro”:”好读书,不求甚解?求解就在读书中。”,”likes_count”:9,”nickname”:”losangele”,”badges”:[],”total_fp_amount”:”1220913898494512693″,”wordage”:19816,”avatar”:”https://upload.jianshu.io/users/upload_avatars/10069184/77607a74-ab3e-4397-b247-e04244ccbdf4.jpg”,”id”:10069184,”liked_user”:false},”likes_count”:3,”paid_type”:”free”,”show_ads”:true,”paid_content_accessible”:false,”total_fp_amount”:”80000000000000000″,”trial_open”:false,”reprintable”:true,”bookmarked”:false,”wordage”:3609,”featured_comments_count”:0,”downvotes_count”:0,”wangxin_trial_open”:null,”guideShow”:{“new_money_time_reward_type”:5,”audit_user_nickname_spliter”:0,”pc_note_bottom_btn”:1,”pc_like_author_guidance”:0,”audit_user_background_image_spliter”:0,”audit_note_spliter”:0,”launch_tab”:1,”include_post”:0,”pc_login_guidance”:1,”audit_comment_spliter”:1,”pc_note_bottom_qrcode”:1,”audit_user_avatar_spliter”:0,”flow_ad_check_detail_button_style”:0,”audit_collection_spliter”:0,”pc_top_lottery_guidance”:1,”subscription_guide_entry”:1,”creation_muti_function_on”:1,”explore_score_searcher”:0,”audit_user_spliter”:1,”pc_note_popup”:0},”commentable”:true,”total_rewards_count”:0,”id”:22422655,”notebook”:{“name”:””},”description”:”简介 Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。 其最初是为了页面抓取(更确切来说…”,”first_shared_at”:1520234367,”views_count”:137,”notebook_id”:21067371},”baseList”:{“likeList”:[],”rewardList”:[]},”status”:”success”,”statusCode”:0},”user”:{“isLogin”:false,”userInfo”:{}},”comments”:{“list”:[],”featuredList”:[]}},”initialProps”:{“pageProps”:{“query”:{“slug”:”df1f4d894ca7″}},”localeData”:{“common”:{“jianshu”:”简书”,”diamond”:”简书钻”,”totalAssets”:”总资产{num}”,”diamondValue”:” (约{num}元)”,”login”:”登录”,”logout”:”注销”,”register”:”注册”,”on”:”开”,”off”:”关”,”follow”:”关注”,”followBook”:”关注连载”,”following”:”已关注”,”cancelFollow”:”取消关注”,”publish”:”发布”,”wordage”:”字数”,”audio”:”音频”,”read”:”阅读”,”reward”:”赞赏”,”zan”:”赞”,”comment”:”评论”,”expand”:”展开”,”prevPage”:”上一页”,”nextPage”:”下一页”,”floor”:”楼”,”confirm”:”确定”,”delete”:”删除”,”report”:”举报”,”fontSong”:”宋体”,”fontBlack”:”黑体”,”chs”:”简体”,”cht”:”繁体”,”jianChat”:”简信”,”postRequest”:”投稿请求”,”likeAndZan”:”喜欢和赞”,”rewardAndPay”:”赞赏和付费”,”home”:”我的主页”,”markedNotes”:”收藏的文章”,”likedNotes”:”喜欢的文章”,”paidThings”:”已购内容”,”wallet”:”我的钱包”,”setting”:”设置”,”feedback”:”帮助与反馈”,”loading”:”加载中…”,”needLogin”:”请登录后进行操作”,”trialing”:”文章正在审核中…”,”reprintTip”:”禁止转载,如需转载请通过简信或评论联系作者。”},”error”:{“rewardSelf”:”无法打赏自己的文章哟~”},”message”:{“paidNoteTip”:”付费购买后才可以参与评论哦”,”CommentDisableTip”:”作者关闭了评论功能”,”contentCanNotEmptyTip”:”回复内容不能为空”,”addComment”:”评论发布成功”,”deleteComment”:”评论删除成功”,”likeComment”:”评论点赞成功”,”setReadMode”:”阅读模式设置成功”,”setFontType”:”字体设置成功”,”setLocale”:”显示语言设置成功”,”follow”:”关注成功”,”cancelFollow”:”取消关注成功”,”copySuccess”:”复制代码成功”},”header”:{“homePage”:”首页”,”download”:”下载APP”,”discover”:”发现”,”message”:”消息”,”reward”:”赞赏支持”,”editNote”:”编辑文章”,”writeNote”:”写文章”},”note”:{},”noteMeta”:{“lastModified”:”最后编辑于 “,”wordage”:”字数 {num}”,”viewsCount”:”阅读 {num}”},”divider”:{“selfText”:”以下内容为付费内容,定价 ¥{price}”,”paidText”:”已付费,可查看以下内容”,”notPaidText”:”还有 {percent} 的精彩内容”,”modify”:”点击修改”},”paidPanel”:{“buyNote”:”支付 ¥{price} 继续阅读”,”buyBook”:”立即拿下 ¥{price}”,”freeTitle”:”该作品为付费连载”,”freeText”:”购买即可永久获取连载内的所有内容,包括将来更新的内容”,”paidTitle”:”还没看够?拿下整部连载!”,”paidText”:”永久获得连载内的所有内容, 包括将来更新的内容”},”book”:{“last”:”已是最后”,”lookCatalog”:”查看连载目录”,”header”:”文章来自以下连载”},”action”:{“like”:”{num}人点赞”,”collection”:”收入专题”,”report”:”举报文章”},”comment”:{“allComments”:”全部评论”,”featuredComments”:”精彩评论”,”closed”:”评论已关闭”,”close”:”关闭评论”,”open”:”打开评论”,”desc”:”按时间倒序”,”asc”:”按时间正序”,”disableText1″:”用户已关闭评论,”,”disableText2″:”与Ta简信交流”,”placeholder”:”写下你的评论…”,”publish”:”发表”,”create”:” 添加新评论”,”reply”:” 回复”,”restComments”:”还有{num}条评论,”,”expandImage”:”展开剩余{num}张图”,”deleteText”:”确定要删除评论么?”},”collection”:{“title”:”被以下专题收入,发现更多相似内容”,”putToMyCollection”:”收入我的专题”},”seoList”:{“title”:”推荐阅读”,”more”:”更多精彩内容”},”sideList”:{“title”:”推荐阅读”},”wxShareModal”:{“desc”:”打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮”},”bookChapterModal”:{“try”:”试读”,”toggle”:”切换顺序”},”collectionModal”:{“title”:”收入到我管理的专题”,”search”:”搜索我管理的专题”,”newCollection”:”新建专题”,”create”:”创建”,”nothingFound”:”未找到相关专题”,”loadMore”:”展开查看更多”},”contributeModal”:{“search”:”搜索专题投稿”,”newCollection”:”新建专题”,”addNewOne”:”去新建一个”,”nothingFound”:”未找到相关专题”,”loadMore”:”展开查看更多”,”managed”:”我管理的专题”,”recommend”:”推荐专题”},”QRCodeShow”:{“payTitle”:”微信扫码支付”,”payText”:”支付金额”},”rewardModal”:{“title”:”给作者送糖”,”custom”:”自定义”,”placeholder”:”给Ta留言…”,”choose”:”选择支付方式”,”balance”:”简书余额”,”tooltip”:”网站该功能暂时下线,如需使用,请到简书App操作”,”confirm”:”确认支付”,”success”:”赞赏成功”},”payModal”:{“payBook”:”购买连载”,”payNote”:”购买文章”,”promotion”:”优惠券”,”promotionFetching”:”优惠券获取中…”,”noPromotion”:”无可用优惠券”,”promotionNum”:”{num}张可用”,”noUsePromotion”:”不使用优惠券”,”validPromotion”:”可用优惠券”,”invalidPromotion”:”不可用优惠券”,”total”:”支付总额”,”tip1″:”· 你将购买的商品为虚拟内容服务,购买后不支持退订、转让、退换,请斟酌确认。”,”tip2″:”· 购买后可在“已购内容”中查看和使用。”,”success”:”购买成功”},”reportModal”:{“ad”:”广告及垃圾信息”,”plagiarism”:”抄袭或未授权转载”,”placeholder”:”写下举报的详情情况(选填)”,”success”:”举报成功”},”guidModal”:{“modalAText”:”相似文章推荐”,”subText”:”下载简书APP,浏览更多相似文章”,”btnAText”:”先不下载,下次再说”,”followOkText”:”关注作者成功!”,”followTextTip”:”下载简书APP,作者更多精彩内容更新及时提醒!”,”followBtn”:”下次再说”,”downloadTipText”:”更多精彩内容下载简书APP”,”footerDownLoadText”:”下载简书APP”,”modabTitle”:”免费送你2次抽奖机会”,”modalbTip”:”你有很大概率抽取AirPods Pro”,”modalbFooterTip”:”下载简书APP,天天参与抽大奖”,”modalReward”:”抽奖”,”scanQrtip”:”扫码下载简书APP”,”downloadAppText”:”下载简书APP,随时随地发现和创作内容”,”redText”:”阅读”,”likesText”:”赞”,”downLoadLeft”:”下载App”}},”currentLocale”:”zh-CN”,”asPath”:”/p/df1f4d894ca7″}},”page”:”/p/[slug]”,”query”:{“slug”:”df1f4d894ca7″},”buildId”:”ZJP8vj8XvQ-o-3nKSjb0s”,”assetPrefix”:”https://cdn2.jianshu.io/shakespeare”}


文章来源于互联网:爬虫-Scrapy 快速入门指南

发表评论