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