Scrapy框架 - Spiders
Spiders
Spiders是一個類,決定了一個特定的網站(或者一系列的網站)如何被爬取,包括怎么去執行爬行(跟隨鏈接)然后如何從頁面從提取出一定的數據結構。換句話說,Spider是一個給你自定義你自己的行為對于爬取和解析網頁對于一個特殊的網站(或者有時候,是一系列網站)
對于spiders,爬取循環就像這樣:
即使這個循環(或多或少)適用于任何類型的spiders,也有不同類型的缺省爬行器被綁定到Scrapy中,用于不同的目的。我們將在這里討論這些類型。
scrapy.Spider
class scrapy.spiders.Spider
這是最簡單的spider,其他所有spider都必須繼承它(包括與Scrapy綁定的spider,以及您自己編寫的spider )。它不提供任何特殊功能。它只提供一個默認的start_requests()實現,該實現從start_urls spider屬性發送請求,并為每個結果響應調用spider的方法解析。
name
定義此spider名稱的字符串。spider名稱是通過Scrapy定位(和實例化)spider的方式,因此它必須是惟一的。但是,沒有什么可以阻止您實例化同一個Spider的多個實例。這是最重要的spider屬性,也是必需的
使用域名去命名spider
如果spider抓取單個域,通常的做法是用域的名稱命名spider,無論是否使用TLD。例如,爬行mywebsite.com的蜘蛛通常被稱為mywebsite。
allowed_domains
一個可選的字符串列表,其中包含允許此爬行器爬行的域。如果啟用了OffsiteMiddleware,對于不屬于此列表中指定的域名(或其子域名)的url的請求將不會被跟蹤。
假設您的目標url是https://www.example.com/1.html,然后將“example.com”添加到列表中。
start_urls
當沒有指定特定url時,spider將從其中開始爬行的url列表。因此,下載的第一個頁面將在這里列出。后續請求將從start url中包含的數據依次生成。
custom_settings
運行此spider時將從項目范圍配置中重寫的設置字典。它必須定義為一個類屬性,因為設置在實例化之前更新。
有關可用的內置設置列表,請參見:內置設置引用。
crawler
這個屬性是由from_crawler()類方法在初始化該類之后設置的,并鏈接到這個spider實例綁定到的Crawler對象。
爬蟲程序在項目中封裝了許多組件,用于它們的單個入口訪問(如擴展、中間件、信號管理器等)。有關它們的更多信息,請參見Crawler API。
settings
運行此爬行器的配置。這是一個設置實例,有關此主題的詳細介紹,請參閱設置主題。
logger
用spider的名稱創建的Python日志程序。您可以使用它來發送日志消息,正如spider在日志記錄中描述的那樣。
**from_crawler(crawler, *args, kwargs)
這是Scrapy用來創建爬行器的類方法。
您可能不需要直接覆蓋它,因為默認實現充當了_init__()方法的代理,使用給定的參數arg和命名參數kwarg調用它。
盡管如此,這個方法在新實例中設置爬行器和設置屬性,以便稍后在爬行器的代碼中訪問它們。
參數:
爬蟲程序(crawler實例)——蜘蛛將被綁定到的爬蟲程序
args (list)——傳遞給……init__()方法的參數
kwargs (dict)——傳遞給_init__()方法的關鍵字參數
start_requests ()
此方法必須返回一個迭代器,其中包含第一個為該爬行器抓取的請求。當蜘蛛被打開進行抓取時,它被稱為癢。Scrapy只調用它一次,因此將start_requests()作為生成器實現是安全的。
默認實現為start_urls中的每個url生成請求(url, dont_filter=True)。
如果您想更改用于開始抓取域的請求,這是要覆蓋的方法。例如,如果您需要首先使用POST請求登錄,您可以這樣做:
parse(response)
當用戶的請求沒有指定回調時,這是Scrapy用來處理下載響應的默認回調。
解析方法負責處理響應,并返回所抓取的數據和/或多個url。其他請求回調具有與Spider類相同的需求。
此方法,以及任何其他請求回調,必須返回一個可迭代的請求和/或dicts或Item對象
log(message[, level, component])
通過Spider的日志記錄器發送日志消息的包裝器,用于向后兼容。有關更多信息,請參見spider的日志記錄。
closed(reason)
當蜘蛛關閉時調用。該方法為spider_closed信號提供了一個到signals.connect()的快捷方式。
下面看點例子:
import scrapyclass MySpider(scrapy.Spider):name = 'example.com'allowed_domains = ['example.com']start_urls = ['http://www.example.com/1.html','http://www.example.com/2.html','http://www.example.com/3.html',]def parse(self, response):self.logger.info('A response from %s just arrived!', response.url)返回多個請求和項目從一個回調:
import scrapyclass MySpider(scrapy.Spider):name = 'example.com'allowed_domains = ['example.com']start_urls = ['http://www.example.com/1.html','http://www.example.com/2.html','http://www.example.com/3.html',]def parse(self, response):for h3 in response.xpath('//h3').getall():yield {"title": h3}for href in response.xpath('//a/@href').getall():yield scrapy.Request(response.urljoin(href), self.parse)您可以直接使用start_requests()而不是start_urls;要使數據更具結構,可以使用以下項目:
import scrapy from myproject.items import MyItemclass MySpider(scrapy.Spider):name = 'example.com'allowed_domains = ['example.com']def start_requests(self):yield scrapy.Request('http://www.example.com/1.html', self.parse)yield scrapy.Request('http://www.example.com/2.html', self.parse)yield scrapy.Request('http://www.example.com/3.html', self.parse)def parse(self, response):for h3 in response.xpath('//h3').getall():yield MyItem(title=h3)for href in response.xpath('//a/@href').getall():yield scrapy.Request(response.urljoin(href), self.parse)Spider 參數
Spider可以通過接受參數改變它們的行為。
Spider參數的一些常見用途是定義開始url或將爬行限制在站點的某些部分,但是它們可以用于配置Spider的任何功能。
Spider 參數通過 crawl命令 使用 -a選項來提供:
Spiders可以在__init__方法中獲取參數:
import scrapyclass MySpider(scrapy.Spider):name = 'myspider'def __init__(self, category=None, *args, **kwargs):super(MySpider, self).__init__(*args, **kwargs)self.start_urls = ['http://www.example.com/categories/%s' % category]# ...默認的_init__方法將接受任何spider參數,并將它們作為屬性復制到spider。上面的例子也可以寫成:
import scrapyclass MySpider(scrapy.Spider):name = 'myspider'def start_requests(self):yield scrapy.Request('http://www.example.com/categories/%s' % self.category)請記住,spider參數只是字符串。spider不會自己進行任何解析。如果要從命令行設置start_urls屬性,則必須使用類似于ast.literal_eval或json的方法將其解析為列表。加載并將其設置為屬性。否則,您將導致start_urls字符串(一個非常常見的python陷阱)上的迭代,導致每個字符都被視為一個單獨的url。
一個有效的用例是設置HttpAuthMiddleware使用的http auth憑證或UserAgentMiddleware使用的用戶代理:
scrapy crawl myspider -a http_user=myuser -a http_pass=mypassword -a user_agent=mybotSpider參數也可以通過Scrapyd時間表傳遞。json API。查看Scrapyd文檔。
通用的spiders
Scrapy附帶了一些有用的通用spider,您可以使用它們對spider進行子類化。他們的目標是為一些常見的抓取案例提供方便的功能,比如根據特定的規則跟蹤站點上的所有鏈接、從站點地圖爬行或解析XML/CSV提要。
對于下面spider中使用的示例,我們將假設您有一個在myproject.item模塊中聲明了testItem項目。項目模塊:
CrawlSpider
class scrapy.spiders.CrawlSpider
這是爬取常規網站最常用的spider,因為它通過定義一組規則為跟蹤鏈接提供了一種方便的機制。它可能不是最適合您的特定web站點或項目的,但是對于幾種情況,它是足夠通用的,所以您可以從它開始,并根據需要覆蓋它以獲得更多定制功能,或者只是實現您自己的spider。
除了從Spider繼承的屬性(必須指定)之外,這個類還支持一個新屬性:
rules
它是一個(或多個)規則對象的列表。每個規則都定義了爬行站點的特定行為。規則對象描述如下。如果多個規則匹配相同的鏈接,則根據在此屬性中定義規則的順序使用第一個規則。
新方法:
parse_start_url(response)
此方法用于start_urls響應。它允許解析初始響應,并且必須返回一個Item對象、一個Request對象或一個包含其中任何一個的iterable。
…
總結
以上是生活随笔為你收集整理的Scrapy框架 - Spiders的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Nature综述:宏基因组时代的病毒分类
- 下一篇: System.Reflection.Re