大數(shù)據(jù)采集與預(yù)處理課件:Scrapy框架采集汽車之家靜態(tài)數(shù)據(jù)_第1頁(yè)
大數(shù)據(jù)采集與預(yù)處理課件:Scrapy框架采集汽車之家靜態(tài)數(shù)據(jù)_第2頁(yè)
大數(shù)據(jù)采集與預(yù)處理課件:Scrapy框架采集汽車之家靜態(tài)數(shù)據(jù)_第3頁(yè)
大數(shù)據(jù)采集與預(yù)處理課件:Scrapy框架采集汽車之家靜態(tài)數(shù)據(jù)_第4頁(yè)
大數(shù)據(jù)采集與預(yù)處理課件:Scrapy框架采集汽車之家靜態(tài)數(shù)據(jù)_第5頁(yè)
已閱讀5頁(yè),還剩15頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

使用Scrapy爬蟲(chóng)框架采集數(shù)據(jù)——爬取汽車之家數(shù)據(jù) 本章學(xué)習(xí)目標(biāo)了解Scrapy爬蟲(chóng)框架的工作原理了解Scrapy爬蟲(chóng)框架的安裝過(guò)程以及各組件的基本含義和用法掌握Scrapy爬蟲(chóng)框架采集數(shù)據(jù)的實(shí)例6.4任務(wù)實(shí)現(xiàn) 【實(shí)例6-8】這里將使用Scrapy爬蟲(chóng)框架創(chuàng)建一個(gè)Scrapy項(xiàng)目,編寫(xiě)網(wǎng)絡(luò)爬蟲(chóng)爬取和抽取汽車之家的文章標(biāo)題和內(nèi)容數(shù)據(jù),如圖6-4所示,并將數(shù)據(jù)輸出為JSON格式,同時(shí)存入MySQL中。圖6-4汽車之家文章欄目的標(biāo)題和內(nèi)容頁(yè)面現(xiàn)在需要在操作系統(tǒng)控制臺(tái)或PyCharm控制臺(tái),使用scrapy命令:scrapystartprojectDemoAuto創(chuàng)建一個(gè)名為DemoAuto的項(xiàng)目,其中scrapystartproject為創(chuàng)建項(xiàng)目的固定語(yǔ)句,DemoAuto為自定義的項(xiàng)目名稱,如圖6-5所示。圖6-5創(chuàng)建Scrapy項(xiàng)目通過(guò)觀察,可以看見(jiàn)該項(xiàng)目被創(chuàng)建在createdin:C:\Users\Administrator\DemoAuto文件路徑中。因此,使用PyCharm將其打開(kāi)。打開(kāi)之后,即可看見(jiàn)DemoAuto的項(xiàng)目目錄。這和前面闡述的內(nèi)容完全一致,包括:spiders,item.py,middlewares.py,pipeline.py,settings.py,如圖6-6所示。scrapy.cfg:項(xiàng)目的配置文件DemoAuto/:該項(xiàng)目的名稱。DemoAuto/items.py:項(xiàng)目中的item文件,用于實(shí)例化數(shù)據(jù)模型item。DemoAuto/pipelines.py:項(xiàng)目中的pipelines文件,用于處理數(shù)據(jù)的存。DemoAuto/settings.py:項(xiàng)目的設(shè)置文件。DemoAuto/spiders/:放置spider代碼的目錄,用于自定義爬蟲(chóng)的位置。圖6-6Scrapy項(xiàng)目目錄執(zhí)行“File”→“Settings”菜單命令,在彈出的“Settings”對(duì)話框的左側(cè)窗格中依次選擇“ProjectDemoAuto”→“ProjectInterpreter”選項(xiàng),然后選擇Anaconda的包環(huán)境即可。這樣就完成Scrapy項(xiàng)目的建立和Anaconda包環(huán)境的配置,如圖6-7所示。圖6-7配置Anaconda包環(huán)境執(zhí)行“File”→“Settings”菜單命令,在彈出的“Settings”對(duì)話框的左側(cè)窗格中依次選擇“ProjectDemoAuto”→“ProjectInterpreter”選項(xiàng),然后選擇Anaconda的包環(huán)境即可。這樣就完成Scrapy項(xiàng)目的建立和Anaconda包環(huán)境的配置,如圖6-7所示。圖6-7配置Anaconda包環(huán)境現(xiàn)在在工程文件中的spiders目錄中創(chuàng)建一個(gè)名為SpiderDemo.py的文件。該文件的作用是編寫(xiě)自定義的spider代碼。代碼如下。引入scrapy模塊importscrapy引入本地DemoAutoField中的AutoItem模板用于存儲(chǔ)指定的數(shù)據(jù)。fromDemoAuto.DemoAutoFieldimportAutoItem自定義一個(gè)類,并將scrapy模塊的Spider作為參數(shù)傳入。類scrapy.spiders.Spider是最簡(jiǎn)單的spider,所有的spider包括自己定義的和scrapy提供的都會(huì)繼承它。它只是提供最基本的特性,也是最常用的Spider類。

classMyScr(scrapy.Spider):

設(shè)置全局唯一的name,作為啟動(dòng)該spider的時(shí)候的識(shí)別名稱。

name='DemoAuto'

填寫(xiě)爬取地址,作為該spider第一次爬取的url。start_urls=['./all/#pvareaid=3311229‘]編寫(xiě)自定義爬取方法。這里使用parse方法傳入self和response作為參數(shù),其中,response作為從start_urls返回的響應(yīng)數(shù)據(jù)。

defparse(self,response):

實(shí)例化一個(gè)容器item,并保存爬取的信息

item=AutoItem()

這部分是爬取部分,使用xpath的方式選擇信息,具體方法根據(jù)網(wǎng)頁(yè)結(jié)構(gòu)而定,這里將爬去汽車之家的文章標(biāo)題和內(nèi)容。先獲取每個(gè)課程的div。

forboxinresponse.xpath('//*[@id="auto-channel-lazyload-article"]/ul/li/a'):獲取指定的標(biāo)題和內(nèi)容,并賦值給item容器的兩個(gè)字段。這里使用了extract()[0].strip()表示在循環(huán)中每次只抽取第一個(gè)元素的內(nèi)容,并除去左右空白。

item['title']=box.xpath('.//h3/text()').extract()[0].strip()item['content']=box.xpath('.//p/text()').extract()[0].strip()

返回信息

yielditem

在與items.py的同級(jí)目錄中創(chuàng)建一個(gè)名為DemoAutoField.py的文件。該文件的作用是替代items.py,用于實(shí)例化數(shù)據(jù)模型item。代碼如下。引入scrapy模塊importscrapy

編寫(xiě)model模板

classAutoItem(scrapy.Item):

儲(chǔ)存標(biāo)題。這里使用scrapy.Field()創(chuàng)建兩個(gè)字段模型,title和content給item。

title=scrapy.Field()content=scrapy.Field()在與pipelines.py的同級(jí)目錄中創(chuàng)建一個(gè)名為DemoAutoPipelines.py的文件。該文件的作用是替代pipelines.py,用于處理數(shù)據(jù)的存儲(chǔ)。代碼如下。引入scrapy模塊importjson自定義一個(gè)名為AutoPipeline的類,并接受一個(gè)object對(duì)象作為參數(shù)。classAutoPipeline(object):def__init__(self):打開(kāi)文件。如果沒(méi)有創(chuàng)建該文件則自動(dòng)創(chuàng)建一個(gè)名為data.json的文件。并使用utf-8作為字符集編碼格式。

self.file=open('data.json','w',encoding='utf-8')process_item方法用于處理數(shù)據(jù)。這里處理的數(shù)據(jù)是傳進(jìn)來(lái)的item容器數(shù)據(jù)。

defprocess_item(self,item,spider):讀取item中的數(shù)據(jù)。使用json.dumps將item轉(zhuǎn)為JSON格式,之前先使用dict轉(zhuǎn)為字典數(shù)據(jù)。

line=json.dumps(dict(item),ensure_ascii=False)+"\n"

寫(xiě)入文件

self.file.write(line)

返回itemreturnitemopen_spider方法在spider被開(kāi)啟時(shí)被調(diào)用。

defopen_spider(self,spider):passclose_spider方法在spider被關(guān)閉時(shí)被調(diào)用。

defclose_spider(self,spider):pass到此已經(jīng)完成了一個(gè)簡(jiǎn)單的scrapy爬蟲(chóng)的編寫(xiě)。在控制臺(tái)中使用scrapycrawlDemoAuto來(lái)運(yùn)行一下,如圖6-8所示。圖6-8爬取的文章標(biāo)題和內(nèi)容

在獲得了指定的數(shù)據(jù)之后,現(xiàn)在需要將數(shù)據(jù)持久化保存到MySQL中。之前,需要先在MySQL中創(chuàng)建一個(gè)名為file123的數(shù)據(jù)庫(kù)以及數(shù)據(jù)表table123,其中包含字段title,content,如圖6-9所示。圖6-9創(chuàng)建數(shù)據(jù)庫(kù)和表a)創(chuàng)建指定數(shù)據(jù)庫(kù)和表的SQL語(yǔ)句b)數(shù)據(jù)庫(kù)目錄a)b)在與pipelines.py的同級(jí)目錄中創(chuàng)建一個(gè)名為MySQLPipelines.py的文件。該文件的作用是替代pipelines.py,用于將數(shù)據(jù)持久化保存到MySQL。代碼如下。引入pymysql模塊importpymysql自定義一個(gè)方法dbHandle用于連接MySQL。defdbHandle():conn=pymysql.connect("localhost","root","xxxx","file123")returnconn自定義一個(gè)名為MySQLPipeline的類,并傳入一個(gè)object參數(shù)。classMySQLPipeline(object):使用process_item方法打開(kāi)MySQL數(shù)據(jù)庫(kù)連接,并執(zhí)行SQL語(yǔ)句。

defprocess_item(self,item,spider):dbObject=dbHandle()#實(shí)例化一個(gè)MySQL連接對(duì)象

cursor=dbObject.cursor()#使用游標(biāo)操作數(shù)據(jù)庫(kù)向數(shù)據(jù)庫(kù)中插入指定的數(shù)據(jù)。

sql='insertintotable123(title,content)values(%s,%s)'try:執(zhí)行SQL語(yǔ)句,并傳入?yún)?shù)。

cursor.execute(sql,(item['title'],item['content']))dbObjectmit()except:dbObject.rollback()returnitem運(yùn)行結(jié)果如圖6-10所示。圖6-10將數(shù)據(jù)存入MySQL在寫(xiě)好了DemoAutoPipelines.py和MySQLPipelines.py之后,還需要在settings.py中進(jìn)行配置。代碼如下。這里的數(shù)字范圍是在1-1000,表示Pipeline執(zhí)行的優(yōu)先級(jí),數(shù)字越小優(yōu)先級(jí)越大。ITEM_PIPELINES={'DemoAuto.DemoAutoPipelines.AutoPipeline':300,#保存到文件中

'DemoAuto.MySQLPipeline.MySQLPipeline':300,#保存到mysql數(shù)據(jù)庫(kù)}到此實(shí)現(xiàn)了scrapy爬取汽車之家文章

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論