Scrapy-爬虫模板的使用

这篇具有很好参考价值的文章主要介绍了Scrapy-爬虫模板的使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Scrapy,Python开发的一个快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试。

Scrapy吸引人的地方在于它是一个框架,任何人都可以根据需求方便的修改。它也提供了多种类型爬虫的基类,如BaseSpider、sitemap爬虫等,最新版本又提供了web2.0爬虫的支持。

在之前的博文Scrapy常用工具命令中讲到,可以使用scrapy genspider -l来查看Scrapy当前可用的爬虫模板,并且已知现在可用的爬虫模板有basicxmlfeedcsvfeedcrawl。在之前的博文中,所有有关爬虫的例子都使用basic模板,这里将不再作介绍,下面将着重介绍其他三种爬虫模板的使用。

使用XMLFeedSpider来分析XML源

如果想用Scrapy爬虫来处理XML文件,我们可以用XMLFeedSpider来实现。现在有这样一个XML的数据源:http://www.people.com.cn/rss/politics.xml,假如,我们想提取XML文件中的各文章的标题,作者以及发布日期等信息,首先我们在原来的项目上创建一个xmlfeed为模板的爬虫:

scrapy genspider peoplespider -t xmlfeed www.people.com.cn

执行完上面的命令,会发现在原来的spiders目录下多了一个peoplespider.py的爬虫文件。用编辑器打开该爬虫文件,有如下内容:

# -*- coding: utf-8 -*-
from scrapy.spiders import XMLFeedSpider


class PeoplespiderSpider(XMLFeedSpider):
    name = 'peoplespider'
    allowed_domains = ['www.people.com.cn']
    start_urls = ['http://www.people.com.cn/feed.xml']
    iterator = 'iternodes' # you can change this; see the docs
    itertag = 'item' # change it accordingly

    def parse_node(self, response, selector):
        i = {}
        #i['url'] = selector.select('url').extract()
        #i['name'] = selector.select('name').extract()
        #i['description'] = selector.select('description').extract()
        return i

首先我们需要理解一下上述代码,关于nameallowed_domainsstart_urls属性在之前的博文中已有讲到,具体作用情况请查看上一篇博文。下面主要讲讲iteratoritertagparse_node()属性或方法的使用:

  • iterator: 该属性设置的是使用哪个迭代器,默认值为iternodes,这是一个基于正则表达式的高性能迭代器,除了这个默认值以外,还可以设置为htmlxml
  • itertag: 该属性主要用来设置开始迭代的节点
  • parse_node(): 该方法在节点与所提供的标签名相符合的时候会被调用,在该方法中,可以进行一些信息的提取和处理的操作

除此之外,XMLFeedSpider还有一些常见的属性和方法,如下所示:

名称 属性或方法 含义
namespaces 属性 以列表的形式存在,主要定义在文档中会被爬虫处理的可用命名空间
adpt_response(response) 方法 该方法主要在spider分析响应前被调用
process_results(response, results) 方法 该方法主要在spider返回结果时被调用,主要对结果在返回前进行最后处理

随后,我们再创建一个属于peoplespider爬虫的items文件people_items.py,定义要存储的结构化数据,具体代码如下:

import scrapy

class PeopleItems(scrapy.Item):
    title = scrapy.Field()
    author = scrapy.Field()
    date = scrapy.Field()

要提取文章的标题,作者和发布日期,我们需要对该XML文件进行分析。下面,我们将peoplespider.py的爬虫文件进行修改,具体代码如下:

# -*- coding: utf-8 -*-
from scrapy.spiders import XMLFeedSpider
from myfirstspider.people_itms import PeopleItems

class PeoplespiderSpider(XMLFeedSpider):
    name = 'peoplespider'
    allowed_domains = ['www.people.com.cn']
    start_urls = ['http://www.people.com.cn/rss/politics.xml']
    iterator = 'iternodes' # you can change this; see the docs
    # 设置开始迭代的节点,一般设置为文档的第一个节点
    itertag = 'rss' # change it accordingly

    def parse_node(self, response, selector):
        item = PeopleItems()
        item["title"] = selector.xpath("/rss/channel/item/title/text()").extract()
        item["author"] = selector.xpath("/rss/channel/item/author/text()").extract()
        item["date"] = selector.xpath("/rss/channel/item/pubDate/text()").extract()
        
        for i in range(len(item["title"])):
            print("文章的标题为:{},作者为:{},发布日期为:{}".format(item["title"][i], item["author"][i], item["date"][i]))
       
        return item

然后,执行该爬虫scrapy crawl peoplespider --nolog,运行的结果如下所示:

文章的标题为:汪洋会见海协会第四届理事会第一次会议全体代表,作者为:人民网,发布日期为:2018-04-27
...

可以看到,此时成功爬取了该网页对应的信息。

使用CSVFeedSpider来分析CSV源

使用爬虫不仅能够处理XML文件的数据,还能够处理CSV文件的数据。CSV文件是一种被用户广泛应用的相对简单、通用的文件格式,器存储的数据可以轻松的与表格数据互相转化。例如有这样一个CSV文件,如图所示:

Scrapy-爬虫模板的使用

为了方便测试,我先将此CSV文件传入Web项目服务器中,传入后的地址为:http://192.168.10.10/get_file/test.csv。然后,我们在原来的项目上,创建一个以CSVFeedSpider为模板的爬虫:

scrapy genspider csvspider -t csvfeed 192.168.10.10

执行完上面的命令,会发现在原来的spiders目录下多了一个csvspider.py的爬虫文件,用编辑器打开该文件,将会有如下内容:

# -*- coding: utf-8 -*-
from scrapy.spiders import CSVFeedSpider


class CsvspiderSpider(CSVFeedSpider):
    name = 'csvspider'
    allowed_domains = ['192.168.10.10']
    start_urls = ['http://192.168.10.10/feed.csv']
    # headers = ['id', 'name', 'description', 'image_link']
    # delimiter = '\t'

    # Do any adaptations you need here
    #def adapt_response(self, response):
    #    return response

    def parse_row(self, response, row):
        i = {}
        #i['url'] = row['url']
        #i['name'] = row['name']
        #i['description'] = row['description']
        return i

首先我们需要理解一下上述代码,关于nameallowed_domainsstart_urls属性在之前的博文中已有讲到,具体作用情况请查看上一篇博文。代码中headers属性主要存放在CSV文件中包含的用于提取字段的行信息的列表。delimiter属性主要存放字段之间的间隔符,parse_row()方法主要用来接收一个response对象,并进行相应的处理。

观察上面CSV文件,可以得知,该文件具有三个重要属性,nameageaddr,现在我们需要一个容器将这些数据装起来。下面我们创建一个该CSV爬虫的容器文件csv_items.py,具体代码如下:

import scrapy

class CSVItems(scrapy.Item):
    name = scrapy.Field()
    age = scrapy.Field()
    addr = scrapy.Field()

容器中定义了nameageaddr信息,分别对应我们需要爬取的nameageaddr,下面我们将csvspider.py文件进行修改一下:

from scrapy.spiders import CSVFeedSpider
from myfirstspider.csv_items import CSVItems

class CsvspiderSpider(CSVFeedSpider):
    name = 'csvspider'
    allowed_domains = ['192.168.10.10']
    start_urls = ['http://192.168.10.10:5000/get_file/test.csv']
    headers = ['name', 'age', 'addr']
    delimiter = ','
    
    def adapt_response(self, response):
        response = response.replace(encoding="gbk")
        return response
        
    def parse_row(self, response, row):
        item = CSVItems()
        item["name"] = row["name"]
        item["age"] = row["age"]
        item["addr"] = row["addr"]
        
        print(item["name"], item["age"], item["addr"])
        
        return item

运行该爬虫,得到的结果如下所示:

name age addr
张三 18 江西赣州
李四 19 江西南昌
王五 21 广东广州
刘六 20 广东深圳
赵七 18 广东佛山

值得注意的是,我在adapt_response()做了一步进行转码的操作,是因为我的CSV文件中包含了中文,没有这步转码操作,我输出的中文信息变成了乱码。如果有遇到CSV爬虫在爬取过程中,遇到中文乱码问题,可以像我一样尝试进行一下响应流转码。

CrawlSpider的使用

CrawlSpider与之前使用的几种爬虫模板都不太一样,我们要学会使用CrawlSpider,就必须先了解CrawlSpider的工作流程,CrawlSpider的主要工作流程如下所示:

Scrapy-爬虫模板的使用

可以看到,CrawlSpider爬虫会根据链接提取器中设置的规则自动的提取符合条件的网页链接,提取之后再自动对这些链接进行爬行,行程一个循环,如果链接设置为跟进,则会一直循环下去,如果链接设置为不跟进,则第一次循环后就会断开,链接是否跟进可以通过rules中的follow参数的值为True表示跟进,否则表示不跟进,基于爬虫模板创建CrawlSpider后,默认情况为跟进链接。

我们仍然以我的博客为例,创建一个爬虫项目来爬取博客信息。

scrapy startproject blog --nolog

创建好项目之后,我们需要编写爬虫项目中的items.py文件,加入我们想提取博客的标题、阅读数量和发布时间,可以将items.py文件修改为如下所示:

import scrapy

class BlogItem(scrapy.Item):
    title = scrapy.Field()
    page_views = scrapy.Field()
    published_date = scrapy.Field()

然后我们再创建一个名为blog的CrawlSpider,如下:

scrapy genspider -t crawl blog csdn.net --nolog

创建完爬虫文件之后,就开始在爬虫文件中编写相关的代码了,blog.py修改后如下:

from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from sport.items import BlogItem


class NewsSpider(CrawlSpider):
    name = "news"
    allowed_domains = ["csdn.net"]
    start_urls = ["https://blog.csdn.net/y472360651"]

    rules = (
        # 此url为翻页链接的正则匹配
        Rule(LinkExtractor(allow=r'/article/list/\d+'), callback='parse_item', follow=True),
    )

    def parse_item(self, response):
        item = BlogItem()
        res = response.xpath(
            '//*[@id="articleMeList-blog"]/div[2]/div/h4/a/text()').extract()
        item['title'] = []
        for i in res:
            i = i.replace('\n', '').replace(' ', '')
            if i:
                item['title'].append(i)

        item['page_views'] = response.xpath(
            '//*[@id="articleMeList-blog"]/div[2]/div/div[1]/p/span[2]/text()').extract()
        item['published_date'] = response.xpath(
            '//*[@id="articleMeList-blog"]/div[2]/div/div[1]/p/span[1]/text()').extract()
        print(item)
        return item

由代码可以看出,CrawlSpider主要是通过LinkExtractor链接提取器来实现链接的过滤和提取,以实现翻页自动爬取的效果。其中LinkExtractor中对应的参数及含义如下:文章来源地址https://www.toymoban.com/news/detail-407536.html

参数名 参数含义
allow 提取符合正则表达式的链接
deny 不提取符合正则表达式的链接
restrict_xpaths 使用XPath表达式与allow共同作用提取同时符合对应XPath表达式和对应正则表达式的链接
allow_domains 允许提取的域名,比如我们想只提取某个域名下的链接时会用到
deny_domains 进制提取的域名

到了这里,关于Scrapy-爬虫模板的使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python爬虫进阶:使用Scrapy库进行数据提取和处理

    在我们的初级教程中,我们介绍了如何使用Scrapy创建和运行一个简单的爬虫。在这篇文章中,我们将深入了解Scrapy的强大功能,学习如何使用Scrapy提取和处理数据。 在Scrapy中,提取数据主要通过Selectors来完成。Selectors基于XPath或CSS表达式的查询语言来选取HTML文档中的元素。你

    2024年02月09日
    浏览(47)
  • 07_scrapy的应用——获取电影数据(通过excel保存静态页面scrapy爬虫数据的模板/通过数据库保存)

    一般我们自己创建的一些python项目,我们都需要创建虚拟环境,其中会下载很多包,也叫做依赖。但是我们在给他人分享我们的项目时,不能把虚拟环境打包发送给别人,因为每个人电脑系统不同,我们可以把依赖导出为依赖清单,然后别人有了我们的依赖清单,就可以用一

    2024年02月09日
    浏览(38)
  • python爬虫进阶篇:Scrapy中使用Selenium模拟Firefox火狐浏览器爬取网页信息

    接着上一篇的笔记,Scrapy爬取普通无反爬、静态页面的网页时可以顺利爬取我们要的信息。但是大部分情况下我们要的数据所在的网页它是动态加载出来的(ajax请求后传回前端页面渲染、js调用function等)。这种情况下需要使用selenium进行模拟人工操作浏览器行为,实现自动化

    2024年02月04日
    浏览(73)
  • python爬虫进阶篇:Scrapy中使用Selenium+Firefox浏览器爬取沪深A股股票行情

    上篇记录了Scrapy搭配selenium的使用方法,有了基本的了解后我们可以将这项技术落实到实际需求中。目前很多股票网站的行情信息都是动态数据,我们可以用Scrapy+selenium对股票进行实时采集并持久化,再进行数据分析、邮件通知等操作。 详情请看上篇笔记 items middlewares setti

    2024年02月04日
    浏览(63)
  • Python 爬虫—scrapy

    scrapy用于从网站中提取所需数据的开源协作框架。以一种快速、简单但可扩展的方式。 该爬虫框架适合于那种静态页面, js 加载的话,如果你无法模拟它的 API 请求,可能就需要使用 selenium 这种使用无头浏览器的方式来完成你的需求了 运行 代码中通过 main 方式运行调试 简

    2024年02月10日
    浏览(37)
  • Python爬虫---Scrapy架构组成

    Scrapy是一个Python编写的开源网络爬虫框架,它由五大核心组件构成:引擎(Engine)、调度器(Scheduler)、下载器(Downloader)、爬虫(Spider)和实体管道(Item Pipeline)。 引擎(Engine):它是Scrapy的核心,负责控制整个爬虫流程的运行,包括调度器、下载器和管道等组件的协调

    2024年01月16日
    浏览(38)
  • 【python爬虫】14.Scrapy框架讲解

    前两关,我们学习了能提升爬虫速度的进阶知识——协程,并且通过项目实操,将协程运用于抓取薄荷网的食物数据。 可能你在体验开发一个爬虫项目的完整流程时,会有这样的感觉:原来要完成一个完整的爬虫程序需要做这么多琐碎的工作。 比如,要导入不同功能的模块

    2024年02月09日
    浏览(49)
  • Python爬虫---scrapy shell 调试

    Scrapy shell 是Scrapy提供的一个交互式shell工具,它可以帮助我们进行爬虫的开发和调试。可以使用它来测试xpath或css表达式,查看它们是如何工作的,以及它们从你试图抓取的网页中提取的数据。它允许你在编写spider时交互地测试表达式,而无需运行spider来测试每个更改。 使用

    2024年01月16日
    浏览(41)
  • Python爬虫——scrapy_工作原理

    引擎向spiders要url 引擎把将要爬取的url给调度器 调度器会将url生成的请求对象放入到指定的队列中 从队列中出队一个请求 引擎将请求交给下载器进行处理 下载器发送请求获取互联网数据 下载器将数据返回给引擎 引擎将数据再次给到spiders spiders通过xpath解析该数据,得到数据

    2024年02月12日
    浏览(43)
  • 网络爬虫(Python:Selenium、Scrapy框架;爬虫与反爬虫笔记)

    Selenium是一个模拟浏览器浏览网页的工具,主要用于测试网站的自动化测试工具。 Selenium需要安装浏览器驱动,才能调用浏览器进行自动爬取或自动化测试,常见的包括Chrome、Firefox、IE、PhantomJS等浏览器。 注意:驱动下载解压后,置于Python的安装目录下;然后将Python的安装目

    2024年01月18日
    浏览(60)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包