版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第pythonscrapy拆解查看Spider類爬取優(yōu)設(shè)網(wǎng)極細(xì)講解目錄拆解scrapy.Spiderscrapy.Spider屬性值scrapy.Spider實(shí)例方法與類方法爬取優(yōu)設(shè)網(wǎng)Field字段的兩個(gè)參數(shù):
拆解scrapy.Spider
本次采集的目標(biāo)站點(diǎn)為:優(yōu)設(shè)網(wǎng)
每次創(chuàng)建一個(gè)spider文件之后,都會(huì)默認(rèn)生成如下代碼:
importscrapy
classUiSpider(scrapy.Spider):
name='ui'
allowed_domains=['']
start_urls=['/']
defparse(self,response):
self.log()
繼承的基類scrapy.Spider自然就成了我們要研究的第一個(gè)內(nèi)容,進(jìn)入其源碼,發(fā)現(xiàn)如下內(nèi)容。
scrapy.Spider核心實(shí)現(xiàn)的是start_requests方法
Spider主要進(jìn)行的操作就是初始化Request請(qǐng)求,而這些都是通過start_requests實(shí)現(xiàn)的,詳細(xì)代碼為:
forurlinself.start_urls:
yieldRequest(url,dont_filter=True)
對(duì)start_requests方法,你可以自己編寫同名函數(shù)覆蓋修改,編寫時(shí)發(fā)現(xiàn)了make_requests_from_url方法,該方法在最新版本的scrapy中已經(jīng)被廢除。
重寫start_requests方法,需要注意重寫時(shí),必須返回一個(gè)可迭代對(duì)象,并且該對(duì)象包含spider用于爬取的第1個(gè)Request,由于scrapy只調(diào)用一次該方法,所以你可以將登錄站點(diǎn)請(qǐng)求放置到該方法中。
importscrapy
fromscrapy.httpimportRequest
classUiSpider(scrapy.Spider):
name='ui'
allowed_domains=['']
start_urls=['/']
defstart_requests(self):
print("重寫start_requests")
yieldRequest(self.start_urls[0])
defparse(self,response):
print(response)
將登錄信息放置到start_requests中,代碼如下:
importscrapy
fromscrapy.httpimportFormRequest
classUiSpider(scrapy.Spider):
name='ui'
allowed_domains=['']
start_urls=['/']
defstart_requests(self):
print("手動(dòng)start_requests")
yieldFormRequest("/post",formdata={"user":"ca"},callback=self.parse)
defparse(self,response):
print(response.text)
scrapy.Spider屬性值
name屬性:
表示爬蟲名稱,spider的名稱用于scrapy定位爬蟲,所以非常重要,一般常見的名稱方式是使用網(wǎng)站域名(domain),命名spider,例如命名為baidu,但是工作喜歡還是攜帶.com后綴。
allowed_domains屬性:
該屬性需要配置offsiteMiddleware使用,當(dāng)該中間件啟用之后,待采集URL的域名如果不在allowed_domains列表中,會(huì)被禁止訪問。
domains內(nèi)容添加,假設(shè)你的目標(biāo)URL是/123.html,僅填寫即可。
start_urls屬性:
起始的URL列表,主要用于start_request方法進(jìn)行迭代。
custom_settings屬性:
自定義配置,可以覆蓋settings.py的配置,以字典格式賦值。
custom_settings={
"ROBOTSTXT_OBEY":False#不請(qǐng)求robot.txt文件
crawler屬性:
該屬性在爬蟲啟動(dòng)后,由類方法from_crawler()設(shè)置。
settings屬性:
指定配置文件的實(shí)例。
logger屬性:
spider日志輸出對(duì)象,默認(rèn)以spider名稱創(chuàng)建,可以自定義。
('輸出響應(yīng)地址%s',response.url)
('輸出響應(yīng)地址%s',response.url)
補(bǔ)充一下scrapy日志級(jí)別
在settings.py中設(shè)置log級(jí)別,只需要增加一行代碼:
LOG_LEVEL='WARNING'
設(shè)置為WARNING級(jí)別,會(huì)發(fā)現(xiàn)scrapy默認(rèn)的各種調(diào)試信息,都不在控制臺(tái)輸出。
scrapy日志級(jí)別與logging模塊一致。
CRITICAL:嚴(yán)重錯(cuò)誤;
ERROR:一般錯(cuò)誤;
WARNING:警告信息;
INFO:一般信息;
DEBUG:調(diào)試信息。
在scrapy中的settings中關(guān)于日志的配置如下:
LOG_ENABLED:默認(rèn):True,表示啟用logging;
LOG_ENCODING:默認(rèn):utf-8,logging使用的編碼;
LOG_FILE默認(rèn):None,日志保存的文件名;
LOG_LEVEL:默認(rèn)DEBUG,log的最低級(jí)別。
scrapy.Spider實(shí)例方法與類方法
from_crawler類方法
在查看源碼之后,該方法的功能會(huì)比較清晰。
@classmethod
deffrom_crawler(cls,crawler,*args,**kwargs):
spider=cls(*args,**kwargs)
spider._set_crawler(crawler)
returnspider
def_set_crawler(self,crawler):
self.crawler=crawler
self.settings=crawler.settings
crawler.signals.connect(self.close,signals.spider_closed)
該方法設(shè)置了crawler和settings兩個(gè)屬性,該方法在上一篇博客已經(jīng)有所涉及,直接回顧即可。
parse方法
當(dāng)請(qǐng)求(Request)沒有指定回調(diào)參數(shù)(callback)時(shí),該方法是scrapy用來處理響應(yīng)的默認(rèn)回調(diào)方法。
log方法
使用self.log()方法記錄日志。
學(xué)習(xí)到這里,對(duì)Spider模塊有了一個(gè)比較整體的認(rèn)識(shí)。
爬取優(yōu)設(shè)網(wǎng)
接下來進(jìn)入爬蟲采集相關(guān)代碼編寫,有了前文知識(shí)鋪墊之后,采集代碼就變得非常簡單了。
importscrapy
fromuisdc.itemsimportUisdcItem
classUiSpider(scrapy.Spider):
name='ui'
allowed_domains=['']
start_urls=['/archives']
custom_settings={
"ROBOTSTXT_OBEY":False
defparse(self,response):
#print(response.text)
#self.log("測試是否有數(shù)據(jù)輸出",logging.WARNING)
items=response.xpath('//div[@id="archive_list"]/div/div[1]/div[1]/div[contains(@class,"item-article")]')
foriinitems:
item=UisdcItem()
title=i.xpath(".//h2[@]/a/text()").extract_first()
author=i.xpath(".//h3[@]/text()").extract_first()
tag=i.xpath(".//div[@]/a/text()").extract_first()
item["title"]=title
item["author"]=author
item["tag"]=tag
yielditem
接下來修改源碼,增加**ItemLoaders**填充容器機(jī)制。通過fromscrapy.loaderimportItemLoader導(dǎo)入新類,該類的構(gòu)造函數(shù)如下:
def__init__(self,item=None,selector=None,response=None,parent=None,**context)
其中item是容器類,selector為Selector對(duì)象,提取填充數(shù)據(jù)的選擇器,response為Response響應(yīng)對(duì)象。
代碼修改之后得到如下代碼:
importscrapy
fromuisdc.itemsimportUisdcItem
fromscrapy.loaderimportItemLoader
classUiSpider(scrapy.Spider):
name='ui'
allowed_domains=['']
start_urls=['/archives']
custom_settings={
"ROBOTSTXT_OBEY":False
defparse(self,response):
items=response.xpath('//div[@id="archive_list"]/div/div[1]/div[1]/div[contains(@class,"item-article")]')
foriinitems:
l=ItemLoader(item=UisdcItem(),selector=i)
l.add_xpath('title',".//h2[@]/a/text()")
l.add_xpath('author',".//h3[@]/text()")
l.add_xpath('tag',".//div[@]/a/text()")
yieldl.load_item()
其中需要注意l=ItemLoader(item=UisdcItem(),selector=i)使用selector參數(shù),并賦值為迭代變量i,如果使用response會(huì)得到重復(fù)數(shù)據(jù)。
最后,當(dāng)所有數(shù)據(jù)被收集起來之后,調(diào)用ItemLoader.load_item()方法,返回Item對(duì)象。
輸出item對(duì)象,發(fā)現(xiàn)每一個(gè)數(shù)據(jù)都是列表。
{'author':['土撥鼠'],
'tag':['產(chǎn)品設(shè)計(jì)'],
'title':['6000+干貨!資深總監(jiān)的四條產(chǎn)品設(shè)計(jì)工作觀(附私藏神器包)']}
接下來需要處理每一項(xiàng)的值,ItemLoader得到的數(shù)據(jù),在存入item容器前,是支持對(duì)數(shù)據(jù)進(jìn)行預(yù)處理的,即輸入處理器和輸出處理器,修改items.py文件。
fromscrapy.itemimportItem,Field
fromcessorsimportMapCompose,TakeFirst
defext(value):
return"新聞:"+value
classUisdcItem(Item):
#definethefieldsforyouritemherelike:
title=Field(
input_processor=MapCompose(ext),
output_processor=TakeFirst()
author=Field(output_processor=TakeFirst())
tag=Field(output_processor=TakeFirst())
Field字段的
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025云南建水供銷集團(tuán)有限公司招聘4人筆試參考題庫附帶答案詳解
- 2025中國鐵建房地產(chǎn)集團(tuán)有限公司總部公開招聘筆試參考題庫附帶答案詳解
- 2025中國物流所屬中儲(chǔ)智運(yùn)秋季校園招聘筆試參考題庫附帶答案詳解
- 2025中國有色集團(tuán)(廣西)平桂飛碟股份有限公司招聘65人信息筆試歷年常考點(diǎn)試題專練附帶答案詳解
- 2025中國太平洋財(cái)產(chǎn)保險(xiǎn)股份有限公司河北雄安分公司招聘2人筆試歷年備考題庫附帶答案詳解
- 2026年防震減災(zāi)知識(shí)競賽試卷及答案(八)
- 學(xué)習(xí)書法之路議論文(10篇)
- 提升自主創(chuàng)新能力與保護(hù)知識(shí)產(chǎn)權(quán)承諾書(5篇)
- 項(xiàng)目進(jìn)度保障及品質(zhì)承諾責(zé)任書6篇
- 教育公平與質(zhì)量的承諾書4篇
- 2026年官方標(biāo)準(zhǔn)版離婚協(xié)議書
- 2026 年初中英語《狀語從句》專項(xiàng)練習(xí)與答案 (100 題)
- 2026年遼寧省盤錦市高職單招語文真題及參考答案
- 農(nóng)投集團(tuán)安全生產(chǎn)制度
- 近五年貴州中考物理真題及答案2025
- 2025年黑龍江省大慶市中考數(shù)學(xué)試卷
- 2025年國補(bǔ)自查自糾報(bào)告
- 山東煙草2026年招聘(197人)考試備考試題及答案解析
- 二級(jí)醫(yī)院的DRGs培訓(xùn)課件
- 空芯光纖行業(yè)分析報(bào)告
- 2026年湖南中醫(yī)藥高等??茖W(xué)校單招職業(yè)傾向性測試題庫及答案詳解一套
評(píng)論
0/150
提交評(píng)論