教程 > scrapy 教程 > 阅读:31

scrapy spider 蜘蛛——迹忆客-ag捕鱼王app官网

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

scrapy默认的爬虫如下

scrapy.spider

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

class scrapy.spiders.spider

下表是 scrapy.spider 类的字段

序号 字段 描述
1 name 这是你的蜘蛛的名字。
2 allowed_domains 它是蜘蛛爬行的域列表。
3 start_urls 它是一个 url 列表,这将是以后爬行的根,蜘蛛将从那里开始爬行。
4 custom_settings 这些是设置,当运行蜘蛛时,将从项目范围的配置中覆盖。
5 crawler 它是一个链接到蜘蛛实例绑定到的 crawler 对象的属性。
6 settings 这些是运行蜘蛛的设置。
7 logger 它是一个用于发送日志消息的 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 转换为请求的方法。
11 parse(response) 此方法处理响应并返回跟随更多 url 的报废数据。
12 log(message[,level,component]) 它是一种通过蜘蛛记录器发送日志消息的方法。
13 closed(reason) 当蜘蛛关闭时调用此方法。

spider 参数

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]

通用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 定义了一组规则来跟踪链接并废弃多个页面。 它有以下类

class scrapy.spiders.crawlspider

以下是 crawlspider 类的属性

rules

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

crawlspider类规则如下表

序号 规则 描述
1 linkextractor 它指定蜘蛛如何跟踪链接并提取数据。
2 callback 在抓取每个页面后调用它。
3 follow 它指定是否继续跟踪链接。

parse_start_

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

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

我们看下面的例子,spider开始爬取 demoexample.com 的ag捕鱼王app官网主页,收集所有的页面,链接,用 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 iterator 它定义了要使用的迭代器。 它可以是 iternodes、html 或 xml。 默认是迭代节点。
2 itertag 它是一个带有要迭代的节点名称的字符串。
3 namespaces 它由使用 register_namespace() 方法自动注册命名空间的 (prefix, uri) 元组列表定义。
4 adapt_response(response) 它接收响应并在响应主体从蜘蛛中间件到达后立即修改响应主体,然后蜘蛛开始解析它。
5 parse_node(response,selector) 当为匹配提供的标签名称的每个节点调用时,它会接收响应和选择器。

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

6 process_results(response,results) 它返回蜘蛛返回的结果和响应列表。

csvfeedspider

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

class scrapy.spiders.csvfeedspider

下表显示了可以针对 csv 文件设置的选项

序号 选项 描述
1 delimiter 它是一个包含每个字段的逗号 (',') 分隔符的字符串。
2 quotechar 它是一个包含每个字段的引号 ('"') 的字符串。
3 headers 它是可以从中提取字段的语句列表。
4 parse_row(response,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

sitemapspider 在站点地图的帮助下通过从 robots.txt 中定位 url 来抓取网站。 它有以下类

class scrapy.spiders.sitemapspider

sitemapspider 的字段如下表

序号 字段 描述
1 sitemap_urls 要抓取的指向站点地图的 url 列表。
2 sitemap_rules 它是一个元组列表(regex, callback),其中regex是正则表达式,callback用于处理匹配正则表达式的url。
3 sitemap_follow 它是要遵循的站点地图正则表达式列表。
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... 

查看笔记

扫码一下
查看教程更方便
网站地图