开发手册 欢迎您!
软件开发者资料库

Scrapy - 蜘蛛

Scrapy Spiders - 从简单和简单的步骤学习Scrapy,从基本到高级概念,包括概述,环境,命令行工具,蜘蛛,选择器,项目,项目装载程序,外壳,项目管道,Feed导出,请求和响应,链接提取器,设置,例外,创建项目,定义项目,第一个蜘蛛,抓取,提取项目,使用项目,以下链接,Scraped数据,日志记录,统计信息收集,发送电子邮件,Telnet控制台,Web服务。

描述

Spider是一个类,负责定义如何通过网站关注链接并从页面中提取信息.

Scrapy的默认蜘蛛如下:

scrapy.Spider

这是一只蜘蛛,其他所有蜘蛛都必须从中继承.它有以下类 :

  class scrapy.spiders.Spider

下表显示scrapy的字段.Spider类 :

Sr.NoField&说明
1

name

这是你蜘蛛的名字.

2

allowed_domains

这是一个蜘蛛爬行的域名列表.

3

start_urls

这是一个URL列表,它将成为以后抓取的根源,其中蜘蛛将开始爬行.

4

custom_settings

这些设置在运行蜘蛛时将从项目范围的配置中被覆盖.

5

crawler

这是一个链接到蜘蛛实例绑定到的Crawler对象的属性.

6

设置

这些是运行蜘蛛的设置.

7

记录器

这是一个用于发送日志消息的Python记录器.

8

from_crawler(crawler,* args,** kwargs)

这是一个创建蜘蛛的类方法.参数为 :

  • crawler : 蜘蛛实例将绑定到的爬虫.

  • args(list) : 这些参数传递给方法 _init _().

  • kwargs(dict) : 这些关键字参数传递给方法 _init _().

9

start_requests()

当没有指定特定的URL并打开蜘蛛进行报废时,Scrapy会调用 start_requests()方法.

10

make_requests_from_url(url)

这是一种用于将网址转换为请求的方法.

11

解析(响应)

此方法处理响应并返回更多网址后的报废数据.

12

log(消息[,级别,组件])

这是一个发送日志的方法消息通过蜘蛛记录器.

13

关闭(原因)

此方法是通话蜘蛛关闭时编辑.

Spider Arguments

Spider参数用于指定起始URL,并使用带有 -a 选项的crawl命令传递,如下所示 :

  scrapy crawl first_scrapy -a group = accessories

以下代码演示了蜘蛛如何接收参数 :

import scrapy class FirstSpider(scrapy.Spider):    name = "first"       def __init__(self, group = None, *args, **kwargs):       super(FirstSpider, self).__init__(*args, **kwargs)       self.start_urls = ["http://www.example.com/group/%s" % group]

Generic Spiders

您可以使用通用蜘蛛从你的蜘蛛子类.他们的目的是根据某些规则关注网站上的所有链接,从所有页面中提取数据.

对于以下蜘蛛中使用的示例,我们假设我们有一个包含以下内容的项目字段 :

import scrapy from scrapy.item import Item, Field   class First_scrapyItem(scrapy.Item):    product_title = Field()    product_link = Field()    product_description = Field()

CrawlSpider

CrawlSpider定义了一组遵循链接并废弃多个页面的规则.它有以下类 :

  class scrapy.spiders.CrawlSpider

以下是CrawlSpider类和减号的属性;

规则

这是一个规则对象列表,用于定义爬网程序如何跟随链接.

下表显示了CrawlSpider class : 的规则;

Sr.No规则&说明
1

LinkExtractor

它指定蜘蛛如何跟踪链接并提取数据.

2

回调

在每个页面被删除后调用.

3

关注

它指定是否继续关注链接.

parse_start_url(回复)

它返回任一项或通过允许解析初始响应来请求对象.

注意 : 确保在编写规则时重命名除解析之外的解析函数,因为CrawlSpider使用解析函数来实现其逻辑.

让我们看看下面的示例,其中spider开始爬行demoexample.com的主页,使用 parse_items 方法收集所有页面,链接和解析;

import scrapyfrom scrapy.spiders import CrawlSpider, Rulefrom scrapy.linkextractors import LinkExtractorclass DemoSpider(CrawlSpider):   name = "demo"   allowed_domains = ["www.demoexample.com"]   start_urls = ["http://www.demoexample.com"]         rules = (       Rule(LinkExtractor(allow =(), restrict_xpaths = ("//div[@class = 'next']",)),         callback = "parse_item", follow = True),   )      def parse_item(self, response):      item = DemoItem()      item["product_title"] = response.xpath("a/text()").extract()      item["product_link"] = response.xpath("a/@href").extract()      item["product_description"] = response.xpath("div[@class = 'desc']/text()").extract()      return items

XMLFeedSpider

它是蜘蛛的基类,可以从XML提要中获取并通过节点进行迭代.它有以下类 :

  class scrapy.spiders.XMLFeedSpider

下表显示了用于设置迭代器的类属性和标记名称 :

Sr.No属性&说明
1

迭代器

它定义了要使用的迭代器.它可以是 iternodes,html xml .默认为 iternodes .

2

itertag

这是一个包含要迭代的节点名的字符串.

3

名称空间

它由(prefix,uri)元组列表定义,这些元组使用 register_namespace()方法自动注册名称空间.

4

adapt_response(响应)

它会在蜘蛛开始解析之前收到响应,并在它从蜘蛛中间件到达时修改响应正文.

5

parse_node(响应,选择器)

当为与提供的标记名称匹配的每个节点调用时,它会收到响应和选择器.

注意 : 如果你不重写这个方法,你的蜘蛛将无法工作.

6

process_results(响应,结果)

它返回结果列表,蜘蛛返回的响应.

CSVFeedSpider

它遍历每一行,接收CSV文件作为响应,并调用 parse_row()方法.它有以下类 :

  class scrapy.spiders.CSVFeedSpider

下表显示了可以设置的关于CSV文件和减号的选项;

Sr.No选项&说明
1

分隔符

这是一个字符串,包含每个字段的逗号(',')分隔符.

2

quotechar

这是一个包含每个字段的引号('"')的字符串.

3

标题

这是一个列表可以从中提取字段的语句.

4

parse_row(响应,行)

它收到一个响应,每行都有一个标题键.

CSVFeedSpider示例

from scrapy.spiders import CSVFeedSpiderfrom demoproject.items import DemoItem  class DemoSpider(CSVFeedSpider):    name = "demo"    allowed_domains = ["www.demoexample.com"]    start_urls = ["http://www.demoexample.com/feed.csv"]    delimiter = ";"    quotechar = "'"    headers = ["product_title", "product_link", "product_description"]        def parse_row(self, response, row):       self.logger.info("This is row: %r", row)        item = DemoItem()       item["product_title"] = row["product_title"]       item["product_link"] = row["product_link"]       item["product_description"] = row["product_description"]       return item

SitemapSpider

SitemapSpider在站点地图的帮助下,通过查找网址抓取网站来自robots.txt.它有以下类 :

  class scrapy.spiders.SitemapSpider

下表显示了SitemapSpider : 的字段;

Sr.NoField&说明
1

sitemap_urls

您要抓取指向站点地图的网址列表.

2

sitemap_rules

这是一个元组列表(正则表达式,回调),其中正则表达式是正则表达式,回调用于处理与正则表达式匹配的URL.

3

sitemap_follow

这是一个站点地图的正则表格列表.

4

sitemap_alternate_links

指定单个网址要遵循的备用链接.

SitemapSpider示例

以下SitemapSpider处理所有URL :

from scrapy.spiders import SitemapSpider  class DemoSpider(SitemapSpider):    urls = ["http://www.demoexample.com/sitemap.xml"]        def parse(self, response):       # You can scrap items here

以下SitemapSpider处理一些带回调和减号的网址;

from scrapy.spiders import SitemapSpider  class DemoSpider(SitemapSpider):    urls = ["http://www.demoexample.com/sitemap.xml"]       rules = [       ("/item/", "parse_item"),       ("/group/", "parse_group"),    ]        def parse_item(self, response):       # you can scrap item here        def parse_group(self, response):       # you can scrap group here

以下代码显示了robots.txt中的网址地图,其网址为/sitemap_company :

from scrapy.spiders import SitemapSpiderclass DemoSpider(SitemapSpider):    urls = ["http://www.demoexample.com/robots.txt"]    rules = [       ("/company/", "parse_company"),    ]    sitemap_follow = ["/sitemap_company"]        def parse_company(self, response):       # you can scrap company here

您甚至可以将SitemapSpider与其他URL结合使用,如以下命令所示.

from scrapy.spiders import SitemapSpider  class DemoSpider(SitemapSpider):    urls = ["http://www.demoexample.com/robots.txt"]    rules = [       ("/company/", "parse_company"),    ]        other_urls = ["http://www.demoexample.com/contact-us"]    def start_requests(self):       requests = list(super(DemoSpider, self).start_requests())       requests += [scrapy.Request(x, self.parse_other) for x in self.other_urls]       return requests    def parse_company(self, response):       # you can scrap company here...    def parse_other(self, response):       # you can scrap other here...