Python学习笔记之Scrapy框架入门

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python学习笔记之Scrapy框架入门相关的知识,希望对你有一定的参考价值。

创建一个新的Scrapy项目

定义提取的Item

写一个Spider用来爬行站点,并提取Items

写一个Item Pipeline用来存储提取出的Items

新建工程

在抓取之前,你需要新建一个Scrapy工程。进入一个你想用来保存代码的目录,然后执行:scrapy startproject tutorial 

这个命令会在当前目录下创建一个新目录tutorial,它的结构如下:

  1. T:. 
  2. │  scrapy.cfg 
  3. │ 
  4. └─tutorial 
  5.     │  items.py 
  6.     │  pipelines.py 
  7.     │  settings.py 
  8.     │  __init__.py 
  9.     │ 
  10.     └─spiders 
  11.             __init__.py

这些文件主要是:

scrapy.cfg: 项目配置文件

tutorial/: 项目python模块, 呆会代码将从这里导入

tutorial/items.py: 项目items文件

tutorial/pipelines.py: 项目管道文件

tutorial/settings.py: 项目配置文件

tutorial/spiders: 放置spider的目录

定义Item

Items是将要装载抓取的数据的容器,它工作方式像python里面的字典,但它提供更多的保护,比如对未定义的字段填充以防止拼写错误。

它通过创建一个scrapy.item.Item类来声明,定义它的属性为scrpiy.item.Field对象,就像是一个对象关系映射(ORM). 

我们通过将需要的item模型化,来控制从dmoz.org获得的站点数据,比如我们要获得站点的名字,url和网站描述,我们定义这三种属性的域。要做到这点,我们编辑在tutorial目录下的items.py文件,我们的Item类将会是这样

  1. from scrapy.item import Item, Field  
  2. class DmozItem(Item): 
  3.     title = Field() 
  4.     link = Field() 
  5.     desc = Field() 

刚开始看起来可能会有些困惑,但是定义这些item能让你用其他Scrapy组件的时候知道你的 items到底是什么。

第一个爬虫(Spider)

Spider是用户编写的类,用于从一个域(或域组)中抓取信息。

他们定义了用于下载的URL的初步列表,如何跟踪链接,以及如何来解析这些网页的内容用于提取items。

要建立一个Spider,你必须为scrapy.spider.BaseSpider创建一个子类,并确定三个主要的、强制的属性:

name:爬虫的识别名,它必须是唯一的,在不同的爬虫中你必须定义不同的名字.

start_urls:爬虫开始爬的一个URL列表。爬虫从这里开始抓取数据,所以,第一次下载的数据将会从这些URLS开始。其他子URL将会从这些起始URL中继承性生成。

parse():爬虫的方法,调用时候传入从每一个URL传回的Response对象作为参数,response将会是parse方法的唯一的一个参数,

这个方法负责解析返回的数据、匹配抓取的数据(解析为item)并跟踪更多的URL。

下面是我们第一个爬虫代码,创建 ./tutorial/spiders/dmoz_spider.py

import scrapy
from scrapy.spiders import Spider
from scrapy.selector import Selector
from tutorial.items import DmozItem

class DmozSpider(scrapy.Spider):
    name = "dmoz"
    allowed_domains = ["dmoz.org"]
    start_urls = [
        "http://club.jd.com/review/1601991-1-1-0.html/",
        "http://club.jd.com/review/1601991-1-2-0.html"
    ]
    def parse(self, response):
        sel = Selector(response)
        sites = sel.xpath(‘//ul/li‘)
        items = []
        for i in range(0, 1 + 1):
            divs = response.xpath(‘//div[@id="‘ + str(i) + ‘"]‘)
            for zz in divs.xpath(‘.//dl‘):
                item = DmozItem()
                item[‘prodid‘] = ‘1601991‘
                item[‘userid‘] = ‘userid‘
                item[‘type‘] = zz.xpath(‘.//dt/text()‘).extract_first().replace("\r\n", ‘‘)
                item[‘desc‘] = zz.xpath(‘.//dd/text()‘).extract_first().replace("\r\n", ‘‘)
                items.append(item)
        return items

为了让我们的爬虫工作,我们返回项目主目录执行以下命令

.\tutorial>scrapy crawl dmoz

crawl dmoz 命令从dmoz.org域启动爬虫。 

注意包含 [dmoz]的行 ,那对应着我们的爬虫。你可以看到start_urls中定义的每个URL都有日志行。因为这些URL是起始页面,所以他们没有引用(referrers),所以在每行的末尾你会看到 (referer: <None>). 

在我们的 parse  方法的作用下,两个文件被创建:分别是 Books 和 Resources,这两个文件中有URL的页面内容。 

发生了什么事情?

Scrapy为爬虫的 start_urls属性中的每个URL创建了一个 scrapy.http.Request 对象 ,并将爬虫的parse 方法指定为回调函数。 

这些 Request首先被调度,然后被执行,之后通过parse()方法,scrapy.http.Response 对象被返回,结果也被反馈给爬虫。

 

 

要开始shell,首先进入项目顶层目录,然后输入

T:\tutorial>scrapy shell  http://club.jd.com/review/1601991-1-1-0.html

 

保存抓取的数据

保存信息的最简单的方法是通过Feed exports,命令如下:

T:\tutorial>scrapy crawl dmoz -o items.json -t json

所有抓取的items将以JSON格式被保存在新生成的items.json 文件中

在像本教程一样的小型项目中,这些已经足够。然而,如果你想用抓取的items做更复杂的事情,你可以写一个 Item Pipeline(条目管道)。因为在项目创建的时候,一个专门用于条目管道的占位符文件已经随着items一起被建立,目录在tutorial/pipelines.py。如果你只需要存取这些抓取后的items的话,就不需要去实现任何的条目管道。

结束语

本教程简要介绍了Scrapy的使用,但是许多其他特性并没有提及。

深入了解,请访问  初窥Scrapy — Scrapy 0.24.1 文档 http://scrapy-chs.readthedocs.io/zh_CN/latest/intro/overview.html#intro-overview-item

 

部分参考于

Python抓取框架Scrapy入门教程 http://developer.51cto.com/art/201207/348012.htm

使用Python Scrapy抓取京东商城上商品评论 https://ask.hellobi.com/blog/seng/3216

以上是关于Python学习笔记之Scrapy框架入门的主要内容,如果未能解决你的问题,请参考以下文章

python scrapy学习笔记

转载Python爬虫框架Scrapy学习笔记

scrapy学习笔记

python学习笔记目录

Scrapy框架学习笔记

爬虫学习笔记—— Scrapy框架