版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
大數(shù)據(jù)采集與預(yù)處理技術(shù)*
*項(xiàng)目二圖書信息數(shù)據(jù)采集與預(yù)處理序號(hào)軟件配置要求1scrapy最新版本2redis最新版本一、項(xiàng)目目標(biāo):1、完成圖書信息數(shù)據(jù)分布式采集環(huán)境安裝配置;2、完成圖書信息數(shù)據(jù)采集程序設(shè)計(jì)和數(shù)據(jù)采集;3、完成圖書信息數(shù)據(jù)預(yù)處理清洗。4、完成圖書信息數(shù)據(jù)文本標(biāo)注。二、環(huán)境要求:任務(wù)一分布式采集環(huán)境安裝配置一、任務(wù)目標(biāo)1、掌握Scrapy和Scrapy-redis組件的安裝配置方法;2、了解Scrapy的工作機(jī)制和常見程序編寫;3、會(huì)使用Scrapy-redis編寫數(shù)據(jù)抓取程序;4、掌握常見的自然語(yǔ)言公開數(shù)據(jù)集獲取方法;5、編寫分布式爬蟲程序完成圖書信息數(shù)據(jù)采集。二、Scrapy爬蟲框架1、簡(jiǎn)介:Scrapy是一個(gè)用于爬取網(wǎng)站并從頁(yè)面中提取結(jié)構(gòu)化數(shù)據(jù)的開源和協(xié)作框架,被廣泛應(yīng)用于數(shù)據(jù)挖掘、信息處理或存儲(chǔ)歷史數(shù)據(jù)等領(lǐng)域。ScrapyEngineSchedulerItemPipelineDownloaderSpiderSpiderMiddleware
DownloaderMiddleware
返回responses給Spider發(fā)送Items發(fā)送Requests發(fā)送Requests用于存放URL存放數(shù)據(jù)隊(duì)列提取數(shù)據(jù)、URL發(fā)送請(qǐng)求自定義設(shè)置自定義請(qǐng)求①ScrapyEngine:控制整個(gè)系統(tǒng)的數(shù)據(jù)流處理,負(fù)責(zé)Spider、ItemPipeline、Downloader、Scheduler之間通訊、信號(hào)、數(shù)據(jù)傳遞等。②Spider:用來定義要爬取的網(wǎng)站、如何解析網(wǎng)頁(yè)內(nèi)容等,從引擎接收URL并返回解析結(jié)果,處理所有Responses,獲取Item字段,將需要跟進(jìn)的URL提交給引擎,再次進(jìn)入調(diào)度器。③Scheduler:負(fù)責(zé)接收引擎發(fā)送過來的請(qǐng)求,管理待執(zhí)行的請(qǐng)求隊(duì)列,決定下一個(gè)請(qǐng)求是什么,確保每個(gè)請(qǐng)求都只執(zhí)行一次。④ItemPipeline:Item定義了要抓取的數(shù)據(jù)結(jié)構(gòu),類似于Python字典。Pipeline在Spider之后執(zhí)行,對(duì)Spider返回結(jié)果處理,包括清理、存儲(chǔ)等。⑤DownloaderMiddleware:即下載中間件,主要功能是處理ScrapyEngine與Downloader之間的請(qǐng)求及響應(yīng)⑥D(zhuǎn)ownloader:在Scheduler發(fā)送Request給Downloader之前修改Request,在Response發(fā)送到Spider之前對(duì)其進(jìn)行修改,負(fù)責(zé)下載網(wǎng)頁(yè)內(nèi)容,并將下載的內(nèi)容返回給Spider。⑦SpiderMiddleware:可以自定義擴(kuò)展ScrapyEngine和Spiders中間通信的功能組件,用來處理Spiders輸入的響應(yīng)和輸出的請(qǐng)求。2、安裝:pipinstallscrapy-i/simple使用如下命令測(cè)試是否正確安裝:scrapyversion3、scrapy爬取數(shù)據(jù)步驟1、創(chuàng)建項(xiàng)目2、編寫爬蟲3、運(yùn)行爬蟲4、提取數(shù)據(jù)scrapystartprojectmyproject1)__init__.py:用于標(biāo)識(shí)該目錄為Python包,可以包含項(xiàng)目的初始化代碼。2)Items.py:定義數(shù)據(jù)結(jié)構(gòu)的文件,通常在這里創(chuàng)建Item類,用于存儲(chǔ)爬取到的數(shù)據(jù)字段。3)Middlewares.py:包含自定義的請(qǐng)求和響應(yīng)處理邏輯,用于修改請(qǐng)求、處理響應(yīng)、處理錯(cuò)誤等。4)Pipelines.py:負(fù)責(zé)處理爬取到的數(shù)據(jù),例如清洗、驗(yàn)證和存儲(chǔ)到數(shù)據(jù)庫(kù)或文件中。5)Settings.py:項(xiàng)目的設(shè)置文件,用于配置全局選項(xiàng),如用戶代理、延遲、并發(fā)請(qǐng)求數(shù)等。6)Scrapy.cfg:項(xiàng)目配置文件,定義項(xiàng)目的路徑和部署信息,方便管理多個(gè)Scrapy項(xiàng)目。7)Spiders:spiders目錄是放置爬蟲程序的,例如編寫爬取網(wǎng)站規(guī)則。1、創(chuàng)建項(xiàng)目2、編寫爬蟲3、運(yùn)行爬蟲4、提取數(shù)據(jù)1)進(jìn)入項(xiàng)目目錄cdmyproject2)創(chuàng)建爬蟲,“example”是爬蟲名稱,是目標(biāo)網(wǎng)站。scrapygenspiderexample3)定義Itemimportscrapy#自動(dòng)生成的ltem類classMyspiderItem(scrapy.Item):#definethefieldsforyouritemherelike:#name=scrapy.Field()pass#自定義類classMyItem(scrapy.Item):title=scrapy.Field()time=scrapy.Field()4)創(chuàng)建spiders/example.py文件,修改parse方法,定義如何提取數(shù)據(jù),須繼承“scrapy.Spider”類,并且需要定義以下三個(gè)屬性:name:爬蟲的名字,屬于必須定義字段,可以使用要爬取的網(wǎng)站名。start_urls:初始的UR列表,也就是要爬取網(wǎng)站,是數(shù)組類型。parse(self,response):每個(gè)初始的URL完成下載后都調(diào)用該函數(shù),解析返回的網(wǎng)頁(yè)數(shù)據(jù),然后生成下一頁(yè)的請(qǐng)求URL。#導(dǎo)入自定義的Item數(shù)據(jù)結(jié)構(gòu)(以豆瓣圖書為例)frommyproject.itemsimportMyItemclassExampleSpider(scrapy.Spider):name='example’ #爬蟲名字start_urls=['/'] #初始URL列表defparse(self,response):item=MyItem() #使用xpath獲取要爬取的字段title=response.xpath('//div[@class="nav-logo"]/a/text()').get()item['title']=title[0]print(item['title'])1、創(chuàng)建項(xiàng)目2、編寫爬蟲3、運(yùn)行爬蟲4、提取數(shù)據(jù)5)在項(xiàng)目根目錄下,例如本例中需要先使用“cdmyproject”切換目錄,再運(yùn)行以下命令啟動(dòng)爬蟲:scrapycrawlexample執(zhí)行過程:Scrapy會(huì)為Spider的start_urls屬性中的每個(gè)URL創(chuàng)建scrapy.Request對(duì)象,并將parse方法作為回調(diào)函數(shù)賦值給Request。Request對(duì)象經(jīng)過調(diào)度,生成scrapy.http.Response對(duì)象并送回給parse()方法。如果要將提取的數(shù)據(jù)保存到文件中,可以使用命令:scrapycrawlexample-ooutput.json在python代碼中執(zhí)行使用如下代碼:if__name__=='__main__':fromscrapyimportcmdlinecmdline.execute(f'scrapycrawlbookinfo'.split())#格式cmdline.execute(f'scrapycrawl{ExampleS}'.split())6)項(xiàng)目設(shè)置有些網(wǎng)站會(huì)對(duì)爬蟲做限制,需要在settings.py文件做設(shè)置以規(guī)避限制。常見設(shè)置如下:BOT_NAME=“myproject” #項(xiàng)目名稱,自動(dòng)生成SPIDER_MODULES=[‘myproject.spiders’] #
spider所在路徑NEWSPIDER_MODULE=‘myproject.spiders’ #新spider默認(rèn)所在路徑DOWNLOAD_DELAY=2 #每次請(qǐng)求之間等待時(shí)間(秒)RANDOMIZE_DOWNLOAD_DELAY=True #DOWNLOAD_DELAY上隨機(jī)添加一個(gè)范圍為0.5倍的延遲,防止被目標(biāo)網(wǎng)站識(shí)別為爬蟲CONCURRENT_REQUESTS=3 #控制Scrapy并發(fā)請(qǐng)求的數(shù)量CONCURRENT_REQUESTS_PER_DOMAIN=4#每個(gè)域名的并發(fā)請(qǐng)求數(shù)量限制CONCURRENT_REQUESTS_PER_IP=4 #每個(gè)IP的并發(fā)請(qǐng)求數(shù)量限制DEFAULT_REQUEST_HEADERS={ #設(shè)置全局的默認(rèn)請(qǐng)求頭'User-Agent':'Mozilla/5.0(WindowsNT6.1;WOW64)AppleWebKit/534.57.2(KHTML,likeGecko)Version/5.1.7Safari/534.57.2',"Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8","Accept-Language":"en",……} 沒有爬到數(shù)據(jù)?反爬機(jī)制,沒有設(shè)置User-agent1、創(chuàng)建項(xiàng)目2、編寫爬蟲3、運(yùn)行爬蟲4、提取數(shù)據(jù)6)項(xiàng)目設(shè)置settings.py。常見設(shè)置如下:USER_AGENT=‘Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/87.0.4280.88Safari/537.36’ #請(qǐng)求設(shè)置USER_AGENT_LIST=[ #一個(gè)瀏覽器可能被禁止,可以改使用一個(gè)用戶代理列表'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/87.0.4280.88Safari/537.36','Mozilla/5.0(Macintosh;IntelMacOSX10_15_7)AppleWebKit/605.1.15(KHTML,likeGecko)Version/14.0.3Safari/605.1.15',...]RETRY_ENABLED=True #啟用請(qǐng)求重試機(jī)制,處理超時(shí)、服務(wù)器錯(cuò)誤等情況RETRY_TIMES=3 #RETRY_TIMES=3DOWNLOAD_TIMEOUT=15 #設(shè)置下載超時(shí)時(shí)間,單位為秒DEPTH_LIMIT=3 #限制爬取的頁(yè)面深度,url中的鏈接還有子連接,這里是最多幾層子連接DEPTH_PRIORITY=1 #使用優(yōu)先級(jí)隊(duì)列處理請(qǐng)求,深度優(yōu)先級(jí)COOKIES_ENABLED=True #設(shè)置是否啟用Cookies,默認(rèn)為啟用COOKIES_DEBUG=True #顯示Cookies調(diào)試信息,用于調(diào)試與目標(biāo)網(wǎng)站的Cookies交互LOG_LEVEL='INFO' #設(shè)置日志輸出級(jí)別,可選擇DEBUG、INFO、WARNING、ERROR、CRITICALHTTP_PROXY='xy.server:port' #代理設(shè)置HTTPS_PROXY='xy.server:port' #代理設(shè)置#其他設(shè)置還包括下載器中間件DOWNLOADER_MIDDLEWARES,爬蟲中間件SPIDER_MIDDLEWARES設(shè)置,請(qǐng)參考配套教材選擇是否使用。1、創(chuàng)建項(xiàng)目2、編寫爬蟲3、運(yùn)行爬蟲4、提取數(shù)據(jù)7)數(shù)據(jù)封裝Item類用于定義和封裝爬蟲提取的數(shù)據(jù)結(jié)構(gòu),定義在Scrapy項(xiàng)目的items.py文件中,可以將爬蟲從網(wǎng)頁(yè)提取的數(shù)據(jù)字段定義在該類中。例如,定義Item類如下:classBookItem(scrapy.Item):#定義字段
name=scrapy.Field() #書的名稱
price=scrapy.Field() #書的價(jià)格url=scrapy.Field() #書的鏈接scrapy.Field():每個(gè)Item的字段使用scrapy.Field()來定義,它本質(zhì)上是一個(gè)占位符,可以存儲(chǔ)任何類型的數(shù)據(jù),如字符串、數(shù)字、列表、字典等。1、創(chuàng)建項(xiàng)目2、編寫爬蟲3、運(yùn)行爬蟲4、提取數(shù)據(jù)使用Item類:frommyproject.itemsimportBookItem
classBookinfoSpider(scrapy.Spider):name="bookinfo"allowed_domains=[""]start_urls=[‘/latest?subcat=%E5%85%A8%E9%83%A8’]#初始URL列表,“subcat=全部”
item=BookItem()defparse(self,response):books=response.xpath('//li[@class="mediaclearfix"]')forbookinbooks:self.item['name']=book.xpath('./div[@class="media__body"]/h2/a/text()').get()self.item['price']=book.xpath('./div[@class="media__body"]/div//a/text()').get()self.item['url']=book.xpath('./div[@class="media__body"]/h2/a/@href').get()#將封裝好的item返回給管道,通過yield語(yǔ)句將item返回給ItemPipeline處理yieldself.itemif__name__=='__main__':fromscrapyimportcmdlinecmdline.execute(f'scrapycrawlbookinfo'.split())1、創(chuàng)建項(xiàng)目2、編寫爬蟲3、運(yùn)行爬蟲4、提取數(shù)據(jù)定義Item類(更新):可以在Field()中添加元數(shù)據(jù),這些元數(shù)據(jù)不會(huì)影響爬蟲的行為,但可以用于說明字段的用途或存儲(chǔ)相關(guān)信息。classBookItem(scrapy.Item):name=scrapy.Field(serializer=str)#指定序列化方式
price=scrapy.Field(description="priceinUSD")#添加描述url=scrapy.Field(output_processor=str.upper)#定義輸出處理器定義ItemPipeline處理邏輯。在pipelines.py中,可以定義對(duì)Item進(jìn)行處理的管道,例如數(shù)據(jù)清洗、保存等。classBookPipeline:defprocess_item(self,item,spider):#對(duì)價(jià)格字段進(jìn)行清洗item['price']=float(item['price'].replace('$',''))#將數(shù)據(jù)打印、存儲(chǔ)到數(shù)據(jù)庫(kù)或文件#...returnitem1、創(chuàng)建項(xiàng)目2、編寫爬蟲3、運(yùn)行爬蟲4、提取數(shù)據(jù)多級(jí)嵌套Item類(更新):某個(gè)Item的字段本身也是一個(gè)定義的Item類型,這在實(shí)際當(dāng)中較常見。如下例子中,BookItem包含了一個(gè)reviews字段,該字段可以是一個(gè)ReviewItem列表,表示用戶對(duì)書的評(píng)價(jià)。importscrapyclassReviewItem(scrapy.Item):rating=scrapy.Field()comment=scrapy.Field()classBookItem(scrapy.Item):#定義字段
name=scrapy.Field() #書的名稱
price=scrapy.Field() #書的價(jià)格
url=scrapy.Field() #書的鏈接
reviews=scrapy.Field() #評(píng)價(jià),嵌套R(shí)eviewItem1、創(chuàng)建項(xiàng)目2、編寫爬蟲3、運(yùn)行爬蟲4、提取數(shù)據(jù)多級(jí)嵌套Item類使用:classBookinfoSpider(scrapy.Spider):name="bookinfo"allowed_domains=[""]start_urls=['/latest?subcat=%E5%85%A8%E9%83%A8']#初始URL列表
item=BookItem()defparse(self,response):books=response.xpath('//li[@class="mediaclearfix"]')forbookinbooks:self.item['name']=book.xpath('./div[@class="media__body"]/h2/a/text()').get()self.item['price']=book.xpath('./div[@class="media__body"]/div//a/text()').get()self.item['url']=book.xpath('./div[@class="media__body"]/h2/a/@href').get()review_item=ReviewItem()review_item['rating']=book.xpath('./div[@class="media__body"]//span[@class="font-smallfleft"]/text()').get()review_item['comment']=book.xpath('./div[@class="media__body"]//span[@class="fleftml8color-gray"]/text()').get()#將封裝好的item返回給管道,通過yield語(yǔ)句將item返回給ItemPipeline處理self.item['reviews']=review_itemyieldself.itemif__name__=='__main__':fromscrapyimportcmdlinecmdline.execute(f'scrapycrawlbookinfo'.split())1、創(chuàng)建項(xiàng)目2、編寫爬蟲3、運(yùn)行爬蟲4、提取數(shù)據(jù)8)中間件Scrapy中間件(Middleware)是在Scrapy執(zhí)行請(qǐng)求和響應(yīng)的過程中,用于對(duì)請(qǐng)求、響應(yīng)和其他數(shù)據(jù)進(jìn)行處理的組件。中間件處于引擎和爬蟲之間,提供了鉤子函數(shù),允許在請(qǐng)求發(fā)出或響應(yīng)接收前后進(jìn)行修改和處理。包括:①DownloaderMiddlewares(下載器中間件):處理請(qǐng)求和響應(yīng)的流動(dòng),位于Scrapy引擎和下載器之間??梢杂盟鼇硇薷恼?qǐng)求頭、處理代理、處理重定向等。其主要鉤子方法包括:process_request(self,request,spider):在Scrapy調(diào)度器將request傳遞給下載器之前被調(diào)用??梢孕薷恼?qǐng)求,添加自定義請(qǐng)求頭、代理等。process_response(self,request,response,spider):在Scrapy從下載器接收到響應(yīng)后調(diào)用??梢栽诖颂幚砘蛐薷捻憫?yīng),然后再傳遞給爬蟲。process_exception(self,request,exception,spider):當(dāng)下載器或中間件在處理請(qǐng)求時(shí)拋出異常時(shí)調(diào)用。②SpiderMiddlewares(爬蟲中間件):處理爬蟲和引擎之間的輸入輸出,位于Scrapy引擎和爬蟲之間。用它來修改或過濾從響應(yīng)生成的Item或Response,或者處理爬蟲生成的Response。常見的鉤子方法包括:process_spider_input(self,response,spider):在response傳遞給爬蟲之前調(diào)用,可以用來過濾或修改響應(yīng)。process_spider_output(self,response,result,spider):在response被爬蟲解析之后,生成的result(通常是Request或Item)傳遞給引擎之前調(diào)用,可以修改或過濾這些結(jié)果。Process_spider_exception(self,response,exception,spider):在爬蟲解析response過程中拋出異常時(shí)調(diào)用,可以用來處理異常。Process_start_Requests(self,start_Requests,spider):處理爬蟲的初始請(qǐng)求,通常用于修改或擴(kuò)展初始請(qǐng)求。1、創(chuàng)建項(xiàng)目2、編寫爬蟲3、運(yùn)行爬蟲4、提取數(shù)據(jù)下載器中間件示例:classCustomUserAgentMiddleware:defprocess_request(self,request,spide
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 生物標(biāo)志物在藥物臨床試驗(yàn)中的精準(zhǔn)醫(yī)療策略-1
- 生物打印技術(shù)在牙周組織再生中的細(xì)胞因子調(diào)控
- 生物制劑失應(yīng)答后IBD的快速反應(yīng)評(píng)估方法
- 生物3D打印墨水的細(xì)胞凋亡抑制策略
- 生活質(zhì)量終點(diǎn)在慢性病藥物早期研發(fā)中的預(yù)測(cè)價(jià)值
- 人力資源崗面試題集及答案詳解
- 深度解析(2026)《GBT 19465-2004工業(yè)用異丁烷 (HC-600a)》
- 深度解析(2026)《GBT 19401-2003客運(yùn)拖牽索道技術(shù)規(guī)范》
- 瓣膜病合并感染性心內(nèi)膜炎治療策略
- 電商行業(yè)運(yùn)營(yíng)經(jīng)理面試技巧與題庫(kù)
- 內(nèi)分泌科糖尿病足管理指南
- 2026年江西楓林涉外經(jīng)貿(mào)職業(yè)學(xué)院?jiǎn)握芯C合素質(zhì)考試題庫(kù)及答案詳解一套
- 西藏吊橋施工方案(3篇)
- 2025中智信通第三批社會(huì)招聘(公共基礎(chǔ)知識(shí))綜合能力測(cè)試題附答案解析
- 全國(guó)人大機(jī)關(guān)直屬事業(yè)單位2026年度公開招聘工作人員備考題庫(kù)附答案解析
- 2026年內(nèi)蒙古自治區(qū)招收事業(yè)編制行政執(zhí)法人員1991人考試歷年真題匯編及答案解析(奪冠)
- GB/T 46469-2025皮革物理和機(jī)械試驗(yàn)抗張強(qiáng)度和伸長(zhǎng)率的測(cè)定
- 新生兒奶量計(jì)算與喂養(yǎng)頻率
- 快遞員外包合同范本
- 工程居間費(fèi)合同范本
- 合伙飯店協(xié)議書模板
評(píng)論
0/150
提交評(píng)論