Scrapy 爬取网页内容范例-翻译整理自官方文档

By | April 3, 2016

最后更新时间: 2020-06-13 14:35:09

Scrapy 爬取网页内容范例-翻译整理自官方文档

Updated On: 2020-06-13

Created On: 不详

Scrapy是用Python开发的一个爬取网站以及获取结构化数据的应用框架,也就是一个爬虫框架。Scrapy易学习、易使用,官方资料详实。虽然本人是新手,但使用它抓取到想要的数据,感受到它的便利,由此不得不说,Scrapy是抓取网站数据的必备良品。

本文使用的Scrapy版本是1.0.5,至于各平台怎样安装Scrapy,请参阅《官方用户手册》:http://doc.scrapy.org/en/1.0/intro/install.html ,找个时间我会把在Fedora下的安装过程贴在博客上。这里的例子是抓取问答网站StackOverflow.com的问题。

余话少说,转入正题:

首先是创建一个Scrapy项目:

$ scrapy startproject testprojg

执行以上shell命令后,将在本目录中创建一个名为testproj的目录,这是项目的根目录,该目录下有一个部署配置文件(scrapy.cfg)和与项目同名的Python模块目录(其实就是编写爬虫代码所在的目录),于是默认的项目目录结构如下:

    tutorial/
        scrapy.cfg            # deploy configuration file

        tutorial/             # project's Python module, 
                               you'll import your code 
                               from here
            __init__.py

            items.py          # project items file

            pipelines.py      # project pipelines file

            settings.py       # project settings file

            spiders/          # a directory where you'll 
                               later put your spiders
                __init__.py
                ...g

定义Item(Item保存你想要获得的数据项):

文件位置:testproj/items.py(提示:以下所示的相对路径均相对于根目录)

class StackItem(scrapy.Item) :
    title = scrapy.Field()
    votes = scrapy.Field()
    tags = scrapy.Field()
    link = scrapy.Field()

现在可以编写需要执行的真正爬虫代码了:

文件位置:testproj/spiders/stackoverflow_spider.py

import scrapy
from tutorial.items import StackItem
class StackOverflowSpider(scrapy.Spider) :
   name = 'stack'
   allowed_domains = ['stackoverflow.com']
   start_urls = [
      'http://stackoverflow.com/questions?sort=votes'
   ]
   def parse(self, response) :
      yield scrapy.Request(response.url, callback=self.parse_question_every_page)
   def parse_question_every_page(self, response) :
      for href in response.css('.question-summary h3 a::attr(href)') :
         full_url = response.urljoin(href.extract())
         yield scrapy.Request(full_url, callback=self.parse_question)
      next_page_link = response.css('.pager.fl a[rel="next"]::attr(href)')
      if next_page_link :
         full_url = response.urljoin(next_page_link.extract()[0])
         yield scrapy.Request(full_url, callback=self.parse_question_every_page)
   def parse_question(self, response) :
      item = StackItem()
      item['title'] = response.css('h1 a::text').extract()[0],
      item['votes']= response.css('.question .vote-count-post::text').extract()[0],
      item['tags'] = response.css('.question .post-tag::text').extract(),
      item['link'] =  response.url
      yield itemg

代码解析:

类中的name属性是该爬虫在这个Scrapy项目中的唯一标识,取名不能与同项目的其他爬虫相同。

start_urls属性指定要爬取的起始网络地址(域名或IP),可沿着从这些地址获取的内容提取出下一批需要爬取的地址,也可以从获取的内容中提取出需要的资料

parse()方法:是Scrapy爬虫默认的方法(可在配置HTTP请求的时候指定处理该请求对应的响应的类方法)。用于解析响应数据和提取信息,以及可以把其他的网络目标放进地址池(通过Request对象)

现在已经完成爬虫的搭建,接下来是运行爬虫

运行爬虫:

切换到项目的根目录,然后:

$ scrapy crawl stack -o stackoverflow.json

参数解析:
* -o参数表示将item的结果以XML、JSON或CSV格式输出到文件中,默认是JSON。
* -o后面的是文件名,如不指定位置,则保存在项目根目录。

注意注意:该爬虫会抓取StackOverflow网站的所有在排行榜单上的问答条目的相关信息,由于上面有很多很多的问答,一般来说是不可能全部爬取的,而程序会不停地抓取,即使他们不阻止你的爬取,你的硬盘也吃不消,全部问答也没什么用,所以请适当退出爬取,如果运行过程中想退出,请使用Ctrl+c组合键,一次按不停,按两次。

鉴于本人的相关知识储备以及能力有限,本博客的观点和描述如有错漏或是有考虑不周到的地方还请多多包涵,也欢迎指正,一起学习,共同进步。如果本文对您有帮助,而且让您觉得值得为内容付费,那么就请赞助(打赏)一下本人,这不强制。打赏支持微信支付,方法是使劲地戳一下下方的“打赏”按钮,然后得到微信收款的二维码,再用微信支付扫一下,就像买菜那样。祝好!