Scrapy – Spider

Scrapy – Spider

描述

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

Scrapy的默认Spider类如下

scrapy.Spider

它是一个Spider,其他的Spider都必须从它那里继承。它有如下的类 –

class scrapy.spiders.Spider

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

序号 字段和描述
1 name 这是你的Spider的名字。
2 allowed_domains 它是一个Spider爬行的域的列表。
3 start_urls 它是一个URL列表,它将成为以后抓取的根,Spider将从那里开始抓取。
4 custom_settings 这些是设置,当运行Spider时,将从项目范围内的配置中被覆盖。
5 crawler 这是一个属性,链接到Spider实例所绑定的爬虫对象。
6 **settings ** 这些是运行Spider程序的设置。
7 logger 它是一个用于发送日志信息的Python日志器。
8 from_crawler(crawler,*args,kwargs)** 这是一个类方法,用来创建你的spider。参数是 –
crawler – 一个爬虫,Spider实例将被绑定到该爬虫。
* args(list) – 这些参数将传递给 __init_()_ 方法 。
*kwargs(dict) – 这些关键字参数被传递给__init_()_ 方法。
9 start_requests() 当没有指定特定的URL,并且Spider被打开进行搜刮时,Scrapy调用 start_requests() 方法。
10 make_requests_from_url(url) 这是一个用于将url转换为请求的方法。
11 parse(response) 这个方法处理响应,并在更多的URL之后返回搜刮的数据。
12 log(message[,level,component]) 这是一个通过spiders logger发送日志信息的方法。
13 closed(reason) 当Spider关闭时,该方法被调用。

Spider参数

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

scrapy crawl first_scrapy -a group = accessories

下面的代码演示了Spider如何接收参数-

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]

通用Spider

你可以使用通用Spider来对你的Spider进行分类。它们的目的是根据某些规则跟踪网站上的所有链接,从所有页面中提取数据。

对于以下Spider使用的例子,让我们假设我们有一个项目,有以下字段 –

import scrapy 
from scrapy.item import Item, Field 

class First_scrapyItem(scrapy.Item): 
   product_title = Field() 
   product_link = Field() 
   product_description = Field() 

CrawlSpider

CrawlSpider定义了一套规则,以跟踪链接和刮除一个以上的页面。It has the following class −

class scrapy.spiders.CrawlSpider

以下是CrawlSpider类的属性-

规则

它是一个规则对象的列表,定义了爬虫如何跟踪链接。

下表显示了CrawlSpider类的规则-

序号 规则和描述
1 LinkExtractor 它规定了Spider如何跟踪链接并提取数据。
2 callback 它将在每一个页面被搜刮后被调用。
3 follow 它指定了是否继续跟踪链接。

parse_start_url( response)

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

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

让我们看一下下面的例子,Spider开始爬行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

它是Spider的基类,可以从XML feeds中搜刮并迭代节点。它有以下的类 –

class scrapy.spiders.XMLFeedSpider

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

序号 属性和描述
1 iterator 它定义了要使用的迭代器。它可以是 iternodes、htmlxml。 默认是 iternodes。
2 itertag 它是一个包含要迭代的节点名称的字符串。
3 namespaces 它由(prefix, uri)图元列表定义,使用 register_namespace() 方法自动注册命名空间。
4 adapt_response(response) 它接收响应,并在spider开始解析之前,尽快修改从spider中间件到达的响应体。
5 parse_node(response,selector) 它接收响应,并为每个与所提供的标签名称相匹配的节点调用一个选择器。 注意 – 如果你不覆盖这个方法,你的Spider就不会工作。
6 process_results(response,results) 它返回由spider返回的结果和响应的列表。

CSVFeedSpider

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

class scrapy.spiders.CSVFeedSpider

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

序号 选项和描述
1 delimiter 它是一个字符串,包含每个字段的逗号(‘,’)分隔符。
2 quotechar 它是一个包含每个字段的引号('”)的字符串。
3 headers 它是一个语句列表,可以从中提取字段。
4 parse_row(response,row) 它接收一个response和每一行,以及一个头的键。

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中的URLs来抓取一个网站。它有以下的类 –

class scrapy.spiders.SitemapSpider

下表显示了SitemapSpider的字段。

序号 字段和描述
1 sitemap_urls 你想抓取的指向网站地图的URL的列表。
2 sitemap_rules 它是一个tuples(regex,callback)的列表,其中regex是一个正则表达式,callback用于处理与正则表达式匹配的URL。
3 sitemap_follow 它是一个sitemap的regexes列表,用于跟踪。
4 sitemap_alternate_links 指定要遵循的单个URL的备用链接。

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处理一些带有回调功能的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... 

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程