wns9778.com_威尼斯wns.9778官网

热门关键词: wns9778.com,威尼斯wns.9778官网
wns9778.com > 计算机教程 > Scrapywns9778.com 爬虫框架入门案例详解

原标题:Scrapywns9778.com 爬虫框架入门案例详解

浏览次数:91 时间:2019-05-10

说明:文章是本人读了崔庆才的Python3---网络爬虫开发实战,做的简单整理,希望能帮助正在学习的小伙伴~~

欢迎大家关注腾讯云技术社区-博客园官方主页,我们将持续在博客园为大家推荐技术精品文章哦~

1. 准备工作:

  安装Scrapy框架、MongoDB和PyMongo库,如果没有安装,google了解一下~~

作者:崔庆才

2. 创建项目:

  使用命令创建Scrapy项目,命令如下:

  scrapy startproject tutorial

  该命令可以在任意文件夹运行,如果提示权限问题,可以加sudo运行。该命令会创建一个名为tutorial的文件夹,结构如下:

  wns9778.com 1

  # scrapy.cfg: Scrapy项目的配置文件,定义了项目的配置文件路径,部署相关信息等

  # item.py: 定义item数据结构(爬取的数据结构)

  # pipeline.py: 定义数据管道

  # settings.py: 配置文件

  # middlewares.py: 定义爬取时的中间件

  # spiders: 放置Spiders的文件夹

Scrapy入门

本篇会通过介绍一个简单的项目,走一遍Scrapy抓取流程,通过这个过程,可以对Scrapy对基本用法和原理有大体的了解,作为入门。

在本篇开始之前,假设已经安装成功了Scrapy,如果尚未安装,请参照上一节安装课程

本节要完成的任务有:

  • 创建一个Scrapy项目

  • 创建一个Spider来抓取站点和处理数据

  • 通过命令行将抓取的内容导出

3. 创建Spider:

  Spider是自己定义的类,Scrapy用它来从网页抓取内容,并解析抓取结果。该类必须继承Scrapy提供的Spider类scrapy.Spider。

  使用命令创建一个Spider,命令如下:

  cd tutorial

  scrapy genspider quotes quotes.toscrape.com

  首先,进入刚才创建的tutorial文件夹,然后执行genspider命令。第一个参数是spider的名称,第二个参数是网络域名(要抓取网络的域名)。执行完毕后,spiders文件夹中多了一个quotes.py,它就是刚刚创建的Spider,内容如下:

  wns9778.com 2

  该类中有三个属性 ------ name、allowed_domains、start_urls,一个方法parse。

  # name,唯一的名字,用来区分不同的Spider。

  # allowed_domains,允许爬取的域名,如果初始或后续的请求链接不是该域名下的,则被过滤掉。

  # start_urls,Spider在启动时爬取的url列表,用来定义初始的请求。

  # parse,它是spider的一个方法,用来处理start_urls里面的请求返回的响应,该方法负责解析返回的响应,提取数据或进一步生成处理的请求。

创建项目

在抓取之前,你必须要先创建一个Scrapy项目,可以直接用scrapy命令生成,命令如下:

scrapy startproject tutorial

 

在任意文件夹运行都可以,如果提示权限问题,可以加sudo运行。这个命令将会创建一个名字为tutorial的文件夹,文件夹结构如下:

|____scrapy.cfg     # Scrapy部署时的配置文件
|____tutorial         # 项目的模块,引入的时候需要从这里引入
| |______init__.py    
| |______pycache__
| |____items.py     # Items的定义,定义爬取的数据结构
| |____middlewares.py   # Middlewares的定义,定义爬取时的中间件
| |____pipelines.py       # Pipelines的定义,定义数据管道
| |____settings.py       # 配置文件
| |____spiders         # 放置Spiders的文件夹
| | |______init__.py
| | |______pycache__

 

4. 创建Item:

  Item是保存爬取数据的容器,使用方法和字典类似。创建Item需要继承scrapy.Item类,并且定义类型为scrapy.Field的字段。

  定义Item,将生成的items.py修改如下:

  wns9778.com 3

  这里定义了三个字段,接下来爬取时我们会用到这个Item。

创建Spider

Spider是由你来定义的Class,Scrapy用它来从网页里抓取内容,并将抓取的结果解析。不过这个Class必须要继承Scrapy提供的Spider类scrapy.Spider,并且你还要定义Spider的名称和起始请求以及怎样处理爬取后的结果的方法。

创建一个Spider也可以用命令生成,比如要生成Quotes这个Spider,可以执行命令。

cd tutorial
scrapy genspider quotes

首先进入到刚才创建的tutorial文件夹,然后执行genspider这个命令,第一个参数是Spider的名称,第二个参数是网站域名。执行完毕之后,你会发现在spiders文件夹中多了一个quotes.py,这就是你刚刚创建的Spider,内容如下:

# -*- coding: utf-8 -*-
import scrapy

class QuotesSpider(scrapy.Spider):
    name = "quotes"
    allowed_domains = ["quotes.toscrape.com"]
    start_urls = ['http://quotes.toscrape.com/']

    def parse(self, response):
        pass

可以看到有三个属性,name,allowed_domainsstart_urls,另外还有一个方法parse

  • name,每个项目里名字是唯一的,用来区分不同的Spider。

  • allowed_domains允许爬取的域名,如果初始或后续的请求链接不是这个域名下的,就会被过滤掉。

  • start_urls,包含了Spider在启动时爬取的url列表,初始请求是由它来定义的。

  • parse,是Spider的一个方法,默认情况下,被调用时start_urls里面的链接构成的请求完成下载后,返回的response就会作为唯一的参数传递给这个函数,该方法负责解析返回的response,提取数据或者进一步生成要处理的请求。

5. 解析Response:

  前面我们看到,parse()方法的参数response是start_urls里面的链接爬取后的结果,所以在parse方法中,可以对response变量包含的内容进行解析。网页结构如下:

  wns9778.com 4

  wns9778.com 5

  提取方式可以是CSS选择器或XPath选择器。在这里,使用CSS选择器,parse()方法修改如下:

  wns9778.com 6

  首先,利用选择器选取所有的quote,并将其赋值给quotes变量,然后利用for循环对每一个quote遍历,解析每一个quote的内容。

  对text来说,他的class是text,所以用.text选择器来选取,这个结果实际上是整个带有标签的节点,要获取它的正文内容,可以加::text来获取。这时的结果是长度为1的列表,所以还需要用extract_first()方法来获取第一个元素。

  而对于tags来说,由于我们要获取所有的标签,所以用extract()方法来获取整个列表即可。

创建Item

Item是保存爬取数据的容器,它的使用方法和字典类似,虽然你可以用字典来表示,不过Item相比字典多了额外的保护机制,可以避免拼写错误或者为定义字段错误。

创建Item需要继承scrapy.Item类,并且定义类型为scrapy.Field的类属性来定义一个Item。观察目标网站,我们可以获取到到内容有text, author, tags

所以可以定义如下的Item,修改items.py如下:

import scrapy

class QuoteItem(scrapy.Item):

    text = scrapy.Field()
    author = scrapy.Field()
    tags = scrapy.Field()

定义了三个Field,接下来爬取时我们会使用它。

6. 使用Item:

  上面定义了Item,这边我们就需要用到它。Item可以理解为一个字典,不过在这里需要先实例化,然后将解析的结果赋值给Item的每一个字段,最后返回Item。

wns9778.com,  修改QuotesSpider类如下:

  wns9778.com 7

  至此,首页的所有内容被解析出来了,并将结果赋值给一个个TutorialItem。

解析Response

在上文中说明了parse方法的参数resposne是start_urls里面的链接爬取后的结果。所以在parse方法中,我们可以直接对response包含的内容进行解析,比如看看请求结果的网页源代码,或者进一步分析源代码里面包含什么,或者找出结果中的链接进一步得到下一个请求。

观察网站,我们可以看到网页中既有我们想要的结果,又有下一页的链接,所以两部分我们都要进行处理。

首先看一下网页结构,每一页都有多个class为quote的区块,每个区块内都包含text,author,tags,所以第一部需要找出所有的quote,然后对每一个quote进一步提取其中的内容。

 

提取的方式可以选用CSS选择器或XPath选择器,在这里我们使用CSS选择器进行选择,parse方法改写如下:

def parse(self, response):
    quotes = response.css('.quote')
    for quote in quotes:
        text = quote.css('.text::text').extract_first()
        author = quote.css('.author::text').extract_first()
        tags = quote.css('.tags .tag::text').extract()

在这里使用了CSS选择器的语法,首先利用选择器选取所有的quote赋值为quotes变量。
然后利用for循环对每个quote遍历,解析每个quote的内容。

对text来说,观察到它的class为text,所以可以用.text来选取,这个结果实际上是整个带有标签的元素,要获取它的内容,可以加::text来得到。这时的结果是大小为1的数组,所以还需要用extract_first方法来获取第一个元素,而对于tags来说,由于我们要获取所有的标签,所以用extract方法获取即可。

以第一个quote的结果为例,各个选择方法及结果归类如下:

  • 源码

    “The world as we have created it is a process of our thinking. It cannot be changed without changing our thinking.” by (about)
  • quote.css('.text')

    []

  • quote.css('.text::text')

    []

  • quote.css('.text').extract()

    ['“The world as we have created it is a process of our thinking. It cannot be changed without changing our thinking.”']

  • quote.css('.text::text').extract()

    ['“The world as we have created it is a process of our thinking. It cannot be changed without changing our thinking.”']

  • quote.css('.text::text').extract_first()

    “The world as we have created it is a process of our thinking. It cannot be changed without changing our thinking.”

所以,对于text,要获取第一个元素即可,所以使用extract_first()方法,对于tags,要获取所有元素,使用extract()方法。

本文由wns9778.com发布于计算机教程,转载请注明出处:Scrapywns9778.com 爬虫框架入门案例详解

关键词: wns9778.com

上一篇:C#常用方法使用分享

下一篇:没有了