Scrapy蜘蛛(Spider)

Spider是負責定義如何遵循通過網站的鏈接並提取網頁中的信息的類。

Scrapy默認的 Spider 如下:

scrapy.Spider

它是所有其他的蜘蛛(spider)都必須繼承的類。它具有以下類:

class scrapy.spiders.Spider

下面的表顯示了 scrapy.Spider 類的字段:

S.N.

字段 & 描述

1

name
這是 spider 的名字

2

allowed_domains

它是允許 spider 抓取域名稱的列表

3

start_urls

這是供以後蜘蛛將開始抓取的URL列表的根

4

custom_settings

這些設置在蜘蛛運行時會從項目範圍內覆蓋配置

5

crawler

它是鏈接到 spider 實例綁定的 Crawler 對象的屬性

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,蜘蛛會打開抓取,Scrapy調用start_requests()方法

10

make_requests_from_url(url)

它是用於將URL網址轉換爲請求方法

11

parse(response)

這個方法處理響應並返回廢棄數據

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.yiibai.com/group/%s" % group\]

通用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類的規則:

S.N.

規則和說明

1

LinkExtractor

它指定蜘蛛如何跟隨鏈接和提取數據;

2

callback

它是在每一頁提取之後被調用; 

3

follow

它指定是否繼續跟蹤鏈接;

parse_start_url(response)

它通過允許解析初步迴應返回項目或請求對象。

注意: 請務必重命名等函數解析而不是編寫規則,因爲解析函數用於CrawlSpider來實現它的邏輯。

例如:

讓我們看看下面的例子開始演示蜘蛛爬行 example.com 首頁,使用 parse_items 方法收集所有頁面上的鏈接和詞組:

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

class DemoSpider(CrawlSpider):
name = "demo"
allowed_domains = ["www.yiibai.com"\]
start_urls = ["http://www.yiibai.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

下表顯示了用於設置iterator和標記名稱的類屬性:

S.N.

屬性和說明

1

iterator

它定義將要使用的迭代器。它可以是iternodes,HTML或XML。默認爲:iternodes

2

itertag

它使用節點名稱的字符串進行迭代

3

namespaces

它是由(prefix, 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文件的選項:

S.N.

選項及說明

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.yiibai.com"\]
start_urls = ["http://www.yiibai.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

站點地圖(sitemap)幫助蜘蛛通過 robots.txt 的定位網址並抓取網站。它有以下類:

class scrapy.spiders.SitemapSpider

下面的表顯示了SitemapSpider的字段:

S.N.

字段及說明

1

sitemap_urls

要抓取指向網站地圖的URL列表

2

sitemap_rules

這是一個元組列表 (regex, callback) ,其中,正則表達式是正則表達式,回調是用來處理的URL匹配的正則表達式

3

sitemap_follow

這是網站地圖的正則表達式的跟蹤列表

4

sitemap_alternate_links

指定要跟蹤一個URL備用鏈路

SitemapSpider 示例:

下面是 SitemapSpider 處理所有的網址:

from scrapy.spiders import SitemapSpider

class DemoSpider(SitemapSpider):
urls = ["http://www.yiibai.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.yiibai.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 SitemapSpider

class DemoSpider(SitemapSpider):
urls = ["http://www.yiibai.com/robots.txt"\]
rules = [
("/company/", "parse_company"),
]
sitemap_follow = ["/sitemap_company"]

def parse\_company(self, response):
    # you can scrap company here

您甚至可以將 SitemapSpider 與其他網址相結合如下圖所示:

from scrapy.spiders import SitemapSpider

class DemoSpider(SitemapSpider):
urls = ["http://www.yiibai.com/robots.txt"\]
rules = [
("/company/", "parse_company"),
]

other\_urls = \["http://www.yiibai.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...