Scrapy - 爬蟲



描述

爬蟲是一個類,負責定義如何透過網站跟蹤連結並從頁面中提取資訊。

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(列表) − 這些引數傳遞給 _init_() 方法。

  • kwargs(字典) − 這些關鍵字引數傳遞給 _init_() 方法。

9

start_requests()

當沒有指定特定的 URL 並且爬蟲開啟以進行抓取時,Scrapy 會呼叫 start_requests() 方法。

10

make_requests_from_url(url)

它是一個用於將 URL 轉換為請求的方法。

11

parse(response)

此方法處理響應並返回抓取的資料,以及更多 URL。

12

log(message[,level,component])

它是一個透過爬蟲日誌記錄器傳送日誌訊息的方法。

13

closed(reason)

當爬蟲關閉時,會呼叫此方法。

爬蟲引數

爬蟲引數用於指定起始 URL,並使用 crawl 命令和 -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

CrawlSpider 定義了一組規則來跟蹤連結並抓取多個頁面。它具有以下類:

class scrapy.spiders.CrawlSpider

以下是 CrawlSpider 類的屬性:

rules

它是一個規則物件的列表,定義了爬蟲如何跟蹤連結。

下表顯示了 CrawlSpider 類的規則:

序號 規則 & 描述
1

LinkExtractor

它指定了爬蟲如何跟蹤連結並提取資料。

2

callback

在每個頁面抓取後呼叫。

3

follow

它指定是否繼續跟蹤連結。

parse_start_url(response)

它透過允許解析初始響應返回項或請求物件。

注意 − 編寫規則時,請確保將 parse 函式重新命名為除 parse 之外的其他名稱,因為 parse 函式由 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 feed 抓取並迭代節點的爬蟲的基類。它具有以下類:

class scrapy.spiders.XMLFeedSpider

下表顯示了用於設定迭代器和標籤名稱的類屬性:

序號 屬性 & 描述
1

iterator

它定義了要使用的迭代器。它可以是 iternodes、htmlxml。預設為 iternodes

2

itertag

它是一個包含要迭代的節點名稱的字串。

3

namespaces

它由 (字首,uri) 元組列表定義,這些元組使用 register_namespace() 方法自動註冊名稱空間。

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

它是一個元組 (正則表示式,回撥) 列表,其中正則表示式是正則表示式,回撥用於處理與正則表示式匹配的 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... 
廣告

© . All rights reserved.