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...