Scrapy - 蜘蛛


描述

Spider 是一个负责定义如何跟踪网站链接并从页面中提取信息的类。

Scrapy 的默认蜘蛛如下 -

scrapy.Spider

它是所有其他蜘蛛都必须继承的蜘蛛。它有以下类别 -

class scrapy.spiders.Spider

下表显示了 scrapy.Spider 类的字段 -

先生编号 字段和描述
1

姓名

这是你的蜘蛛的名字。

2

允许的域

它是蜘蛛爬行的域列表。

3

起始网址

它是一个 URL 列表,它将成为以后爬行的根,蜘蛛将从这里开始爬行。

4

自定义设置

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

5

爬行器

它是链接到蜘蛛实例所绑定的 Crawler 对象的属性。

6

设置

这些是运行蜘蛛的设置。

7

记录器

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

8

from_crawler(爬虫,*args,**kwargs)

它是一个类方法,用于创建蜘蛛。参数是 -

  • crawler - 蜘蛛实例将绑定到的爬虫。

  • args(list) - 这些参数被传递给方法_init_()

  • kwargs(dict) - 这些关键字参数传递给方法_init_()

9

开始请求()

当没有指定特定的 URL 并且打开蜘蛛进行抓取时,Scrapy 会调用start_requests()方法。

10

make_requests_from_url(url)

它是一种用于将 url 转换为请求的方法。

11

解析(响应)

此方法处理响应并返回更多 URL 后的废弃数据。

12

日志(消息[,级别,组件])

它是一种通过蜘蛛记录器发送日志消息的方法。

13

关闭(原因)

当蜘蛛关闭时调用此方法。

蜘蛛争论

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

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]

通用蜘蛛

您可以使用通用蜘蛛来对您的蜘蛛进行子类化。他们的目标是根据一定的规则跟踪网站上的所有链接,从所有页面中提取数据。

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

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

爬行蜘蛛

CrawlSpider 定义了一组规则来跟踪链接并废弃多个页面。它有以下类别 -

class scrapy.spiders.CrawlSpider

以下是 CrawlSpider 类的属性 -

规则

它是一个规则对象列表,定义爬网程序如何跟踪链接。

下表显示了 CrawlSpider 类的规则 -

先生编号 规则及说明
1

链接提取器

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

2

打回来

将在抓取每个页面后调用它。

3

跟随

它指定是否继续跟踪链接。

parse_start_url(响应)

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

注意- 确保在编写规则时重命名解析函数而不是解析函数,因为解析函数被 CrawlSpider 使用来实现其逻辑。

让我们看一下下面的示例,其中蜘蛛开始爬行 demoexample.com 的主页,收集所有页面、链接并使用parse_items方法进行解析 -

import scrapy
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor

class 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

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

先生编号 属性及描述
1

迭代器

它定义要使用的迭代器。它可以是iternodes、htmlxml。默认是iternodes

2

迭代标签

它是一个带有要迭代的节点名称的字符串。

3

命名空间

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

4

适应响应(响应)

它接收响应并在蜘蛛开始解析响应之前从蜘蛛中间件到达响应主体并对其进行修改。

5

parse_node(响应,选择器)

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

注意- 如果您不重写此方法,您的蜘蛛将无法工作。

6

process_results(响应,结果)

它返回蜘蛛返回的结果和响应的列表。

CSVFeedSpider

它迭代每一行,接收 CSV 文件作为响应,并调用parse_row()方法。它有以下类别 -

class scrapy.spiders.CSVFeedSpider

下表显示了可以设置的有关 CSV 文件的选项 -

先生编号 选项和说明
1

分隔符

它是一个字符串,每个字段都包含逗号(',')分隔符。

2

引用字符

它是一个字符串,每个字段都包含引号('"')。

3

标头

它是可以从中提取字段的语句列表。

4

parse_row(响应,行)

它接收响应和每一行以及标题的键。

CSVFeedSpider 示例

from scrapy.spiders import CSVFeedSpider
from 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 在Sitemaps的帮助下通过从 robots.txt 中定位 URL 来抓取网站。它有以下类别 -

class scrapy.spiders.SitemapSpider

下表显示了 SitemapSpider 的字段 -

先生编号 字段和描述
1

站点地图网址

您要抓取的指向站点地图的 URL 列表。

2

站点地图规则

它是一个元组(regex、callback)的列表,其中regex是正则表达式,callback用于处理与正则表达式匹配的URL。

3

站点地图关注

它是要遵循的站点地图正则表达式的列表。

4

站点地图_备用_链接

指定单个 URL 要遵循的备用链接。

站点地图Spider 示例

以下 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 使用回调处理一些 URL -

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 中 url 包含/sitemap_company的站点地图-

from scrapy.spiders import SitemapSpider

class 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...