Python-玩转数据-Scrapy中Spiders
一、Spiders工作流程:
Spiders是Scrapy中最重要的地方,它定義了如何爬取及解析數據,可以說Spiders是Scrapy框架中的核心所在。
雖然該循環對任何類型的spider都(多少)適用,但scrapy仍然為了不同的需求提供了多種默認spider。 之后將討論這些spider。
二、Spider屬性功能定義
scrapy
最簡單的spider:scrapy.spiders.Spider
scrapy中所有的spider都繼承的它。它提供了spider最主要的屬性和功能 - start_urls,start_requests(),parse()。
name
name - 用于定義spider名字的字符串。spider的名字是scrapy用于定位spider的,因此它的名字必須是唯一的。但是scrapy中沒有任何機制可以防止你多次實例化同一個spider。所以名字是spider最重要的屬性且是必須的。按慣例,如果spider是只爬取單一的域名,那spider名字就以域名來命名。如:爬取mywebsite.com的spider,通常取名為mywebsite。
allowed_domains
allowed_domains - 用于定義spider可以爬取的域名的字符串列表。如果OffsiteMiddleware被啟用了,則不屬于這個列表里的域名的url scrapy不會發送請求及進行相關處理。
start_urls
start_urls - 定義spider開始爬取數據的url列表。隨后生成的其它需要爬取的url都會是從這些url對應的頁面中提取數據生成出來的。
custom_settings
custom_settings - 定義該spider配置的字典。這個配置會在項目范圍內運行這個spider的時候生效。比如我們在setting.py中將 DEFAULT_REQUEST_HEADERS屬性注釋掉,運行爬蟲將報500錯誤。 當執行某個爬蟲時需要進行特定的設置,可以在custom_settings屬性中進行自定義,以此來覆蓋掉全局性的設置。
crawler
crawler - 定義spider實例綁定的crawler對象。這個屬性是在初始化spider類時由from_crawler()方法設置的。crawler對象概括了許多項目的組件。
settings
settings - 運行spider的配置。這是一個settings對象的實例。
logger
logger - 用spider名字創建的python記錄器。可以用來發送日志消息。
from_crawler
from_crawler(crawler, *args, **kwargs) - scrapy用于創建spiders的類方法。一般都不需要重寫這個方法,因為默認的實現是作為一個__init__()方法的代理,傳參數args和kwargs來調用它。這個方法就是用來在新的spider實例中設置crawler和settings屬性的,以便之后在spider的代碼中可以訪問。
參數:
- crawler(crawler實例)- spider將綁定的crawler
- args(list)- 傳遞給__init__()方法的參數
- kwargs(字典)- 傳遞給__init__()方法的關鍵字參數
start_requests()
start_requests() - 這個方法必須返回該spider的可迭代(iterable)的初始requests對象供后續爬取。Scrapy會在該spider開始爬取數據時被調用,且只會被調用一次,因此可以很安全的將start_requests()做為一個生成器來執行。默認的執行會生成每一個在start_urls中的url對應的request對象。
如果想修改開始爬取一個域名的requests對象,以下是重寫的方法(你需要開始用POST請求先登錄系統):
parse(response)
parse(response) - Scrapy默認的回調用來處理下載的response。parse方法負責處理response,返回爬取的數據或者還有繼續爬取的url(request對象)。其他requests回調方法與Spider類有相同的要求。這個方法與其它的request回調一樣,必須返回可迭代的request對象、字典或Item對象。
參數:
- response(Response對象)- 需要解析的response
- log(message[, level, component]) - 通過Spider的記錄器包裝發送的日志信息,保持與之前的兼容性。
- closed(reason) -
當Spider關閉的時候調用的方法。這個方法為spider_closed提供了一個信號給signals.connect()。
看個例子:
一個回調方法返回多個requests對象和items:
如果不使用start_urls,還可以直接使用start_requests()方法;要使數據更具結構化可以使用Items:
Spider的參數
可以通過設置Spider的參數來修改它的某些屬性。一般的用法是定義Spider開始爬取數據的URL或限制爬取網站的指定部分的數據,但是它其實還可以用于設置Spider的任何功能。Spider的參數是通過crawl命令的-a選項來傳遞給Spider的,如:
- (scrapyEnv) MacBook-Pro:~ $ scrapy crawl myspider -a
category=electronics
這些參數都可以在Spider的__init__方法中訪問到:
默認的__init__方法會將傳遞來的參數作為Spider的屬性,所以還可以通過Spider的屬性訪問命令行中設置的Spider參數,如:
注意:Spider的參數只能是字符串格式,對于參數Spider是不會進行任何解析的。如果你在命令行中設置了start_urls參數,那你必須手動的在Spider中將它轉換成list然后把list設置為Spider的屬性,否則Spider會將字符串格式的參數start_urls中的每一個字符當成一個單獨的url去生成Request對象。
一個通過HttpAuthMiddleWare設置http認證證書還有通過UserAgentMiddleware設置user agent的例子:
- (scrapyEnv) MacBook-Pro:~ $ scrapy crawl myspider -a http_user=myuser
-a http_pass=mypassword -a user_agent=mybot
Spider的參數也可以通過Scrapyd的schedule.json API來傳遞。
更多信息請參考官方文檔
https://scrapy-chs.readthedocs.io/zh_CN/latest/topics/spiders.html
總結
以上是生活随笔為你收集整理的Python-玩转数据-Scrapy中Spiders的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 猫和老鼠:博弈论——记忆化搜索
- 下一篇: Scrapy中Spiders的用法