版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
使用Scrapy爬蟲框架采集數(shù)據(jù)——爬取汽車之家數(shù)據(jù) 本章學(xué)習(xí)目標(biāo)了解Scrapy爬蟲框架的工作原理了解Scrapy爬蟲框架的安裝過程以及各組件的基本含義和用法掌握Scrapy爬蟲框架采集數(shù)據(jù)的實例6.4任務(wù)實現(xiàn) 【實例6-8】這里將使用Scrapy爬蟲框架創(chuàng)建一個Scrapy項目,編寫網(wǎng)絡(luò)爬蟲爬取和抽取汽車之家的文章標(biāo)題和內(nèi)容數(shù)據(jù),如圖6-4所示,并將數(shù)據(jù)輸出為JSON格式,同時存入MySQL中。圖6-4汽車之家文章欄目的標(biāo)題和內(nèi)容頁面現(xiàn)在需要在操作系統(tǒng)控制臺或PyCharm控制臺,使用scrapy命令:scrapystartprojectDemoAuto創(chuàng)建一個名為DemoAuto的項目,其中scrapystartproject為創(chuàng)建項目的固定語句,DemoAuto為自定義的項目名稱,如圖6-5所示。圖6-5創(chuàng)建Scrapy項目通過觀察,可以看見該項目被創(chuàng)建在createdin:C:\Users\Administrator\DemoAuto文件路徑中。因此,使用PyCharm將其打開。打開之后,即可看見DemoAuto的項目目錄。這和前面闡述的內(nèi)容完全一致,包括:spiders,item.py,middlewares.py,pipeline.py,settings.py,如圖6-6所示。scrapy.cfg:項目的配置文件DemoAuto/:該項目的名稱。DemoAuto/items.py:項目中的item文件,用于實例化數(shù)據(jù)模型item。DemoAuto/pipelines.py:項目中的pipelines文件,用于處理數(shù)據(jù)的存。DemoAuto/settings.py:項目的設(shè)置文件。DemoAuto/spiders/:放置spider代碼的目錄,用于自定義爬蟲的位置。圖6-6Scrapy項目目錄執(zhí)行“File”→“Settings”菜單命令,在彈出的“Settings”對話框的左側(cè)窗格中依次選擇“ProjectDemoAuto”→“ProjectInterpreter”選項,然后選擇Anaconda的包環(huán)境即可。這樣就完成Scrapy項目的建立和Anaconda包環(huán)境的配置,如圖6-7所示。圖6-7配置Anaconda包環(huán)境執(zhí)行“File”→“Settings”菜單命令,在彈出的“Settings”對話框的左側(cè)窗格中依次選擇“ProjectDemoAuto”→“ProjectInterpreter”選項,然后選擇Anaconda的包環(huán)境即可。這樣就完成Scrapy項目的建立和Anaconda包環(huán)境的配置,如圖6-7所示。圖6-7配置Anaconda包環(huán)境現(xiàn)在在工程文件中的spiders目錄中創(chuàng)建一個名為SpiderDemo.py的文件。該文件的作用是編寫自定義的spider代碼。代碼如下。引入scrapy模塊importscrapy引入本地DemoAutoField中的AutoItem模板用于存儲指定的數(shù)據(jù)。fromDemoAuto.DemoAutoFieldimportAutoItem自定義一個類,并將scrapy模塊的Spider作為參數(shù)傳入。類scrapy.spiders.Spider是最簡單的spider,所有的spider包括自己定義的和scrapy提供的都會繼承它。它只是提供最基本的特性,也是最常用的Spider類。
classMyScr(scrapy.Spider):
設(shè)置全局唯一的name,作為啟動該spider的時候的識別名稱。
name='DemoAuto'
填寫爬取地址,作為該spider第一次爬取的url。start_urls=['./all/#pvareaid=3311229‘]編寫自定義爬取方法。這里使用parse方法傳入self和response作為參數(shù),其中,response作為從start_urls返回的響應(yīng)數(shù)據(jù)。
defparse(self,response):
實例化一個容器item,并保存爬取的信息
item=AutoItem()
這部分是爬取部分,使用xpath的方式選擇信息,具體方法根據(jù)網(wǎng)頁結(jié)構(gòu)而定,這里將爬去汽車之家的文章標(biāo)題和內(nèi)容。先獲取每個課程的div。
forboxinresponse.xpath('//*[@id="auto-channel-lazyload-article"]/ul/li/a'):獲取指定的標(biāo)題和內(nèi)容,并賦值給item容器的兩個字段。這里使用了extract()[0].strip()表示在循環(huán)中每次只抽取第一個元素的內(nèi)容,并除去左右空白。
item['title']=box.xpath('.//h3/text()').extract()[0].strip()item['content']=box.xpath('.//p/text()').extract()[0].strip()
返回信息
yielditem
在與items.py的同級目錄中創(chuàng)建一個名為DemoAutoField.py的文件。該文件的作用是替代items.py,用于實例化數(shù)據(jù)模型item。代碼如下。引入scrapy模塊importscrapy
編寫model模板
classAutoItem(scrapy.Item):
儲存標(biāo)題。這里使用scrapy.Field()創(chuàng)建兩個字段模型,title和content給item。
title=scrapy.Field()content=scrapy.Field()在與pipelines.py的同級目錄中創(chuàng)建一個名為DemoAutoPipelines.py的文件。該文件的作用是替代pipelines.py,用于處理數(shù)據(jù)的存儲。代碼如下。引入scrapy模塊importjson自定義一個名為AutoPipeline的類,并接受一個object對象作為參數(shù)。classAutoPipeline(object):def__init__(self):打開文件。如果沒有創(chuàng)建該文件則自動創(chuàng)建一個名為data.json的文件。并使用utf-8作為字符集編碼格式。
self.file=open('data.json','w',encoding='utf-8')process_item方法用于處理數(shù)據(jù)。這里處理的數(shù)據(jù)是傳進來的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"
寫入文件
self.file.write(line)
返回itemreturnitemopen_spider方法在spider被開啟時被調(diào)用。
defopen_spider(self,spider):passclose_spider方法在spider被關(guān)閉時被調(diào)用。
defclose_spider(self,spider):pass到此已經(jīng)完成了一個簡單的scrapy爬蟲的編寫。在控制臺中使用scrapycrawlDemoAuto來運行一下,如圖6-8所示。圖6-8爬取的文章標(biāo)題和內(nèi)容
在獲得了指定的數(shù)據(jù)之后,現(xiàn)在需要將數(shù)據(jù)持久化保存到MySQL中。之前,需要先在MySQL中創(chuàng)建一個名為file123的數(shù)據(jù)庫以及數(shù)據(jù)表table123,其中包含字段title,content,如圖6-9所示。圖6-9創(chuàng)建數(shù)據(jù)庫和表a)創(chuàng)建指定數(shù)據(jù)庫和表的SQL語句b)數(shù)據(jù)庫目錄a)b)在與pipelines.py的同級目錄中創(chuàng)建一個名為MySQLPipelines.py的文件。該文件的作用是替代pipelines.py,用于將數(shù)據(jù)持久化保存到MySQL。代碼如下。引入pymysql模塊importpymysql自定義一個方法dbHandle用于連接MySQL。defdbHandle():conn=pymysql.connect("localhost","root","xxxx","file123")returnconn自定義一個名為MySQLPipeline的類,并傳入一個object參數(shù)。classMySQLPipeline(object):使用process_item方法打開MySQL數(shù)據(jù)庫連接,并執(zhí)行SQL語句。
defprocess_item(self,item,spider):dbObject=dbHandle()#實例化一個MySQL連接對象
cursor=dbObject.cursor()#使用游標(biāo)操作數(shù)據(jù)庫向數(shù)據(jù)庫中插入指定的數(shù)據(jù)。
sql='insertintotable123(title,content)values(%s,%s)'try:執(zhí)行SQL語句,并傳入?yún)?shù)。
cursor.execute(sql,(item['title'],item['content']))dbObjectmit()except:dbObject.rollback()returnitem運行結(jié)果如圖6-10所示。圖6-10將數(shù)據(jù)存入MySQL在寫好了DemoAutoPipelines.py和MySQLPipelines.py之后,還需要在settings.py中進行配置。代碼如下。這里的數(shù)字范圍是在1-1000,表示Pipeline執(zhí)行的優(yōu)先級,數(shù)字越小優(yōu)先級越大。ITEM_PIPELINES={'DemoAuto.DemoAutoPipelines.AutoPipeline':300,#保存到文件中
'DemoAuto.MySQLPipeline.MySQLPipeline':300,#保存到mysql數(shù)據(jù)庫}到此實現(xiàn)了scrapy爬取汽車之家文章
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度個人向個人應(yīng)急借款合同范本8篇
- 湖南2024年湖南省體育運動醫(yī)療??漆t(yī)院招聘5人筆試歷年參考題庫附帶答案詳解
- 瀘州四川瀘州市住房和城鄉(xiāng)建設(shè)局招聘編外人員筆試歷年參考題庫附帶答案詳解
- 河源廣東河源市消防救援支隊2025年第一批政府專職消防員招聘86人筆試歷年參考題庫附帶答案詳解
- 科技在提升養(yǎng)寵體驗中的重要作用
- 曲靖2025年云南曲靖市馬龍區(qū)司法局司法協(xié)理員招聘6人筆試歷年參考題庫附帶答案詳解
- 二零二五年度車庫車位租賃合同續(xù)約協(xié)議3篇
- 2025年教科新版選擇性必修1歷史上冊階段測試試卷含答案
- 2025年滬科版必修3生物上冊階段測試試卷含答案
- 2025年粵人版七年級地理下冊月考試卷含答案
- 中國末端執(zhí)行器(靈巧手)行業(yè)市場發(fā)展態(tài)勢及前景戰(zhàn)略研判報告
- 北京離婚協(xié)議書(2篇)(2篇)
- 2025中國聯(lián)通北京市分公司春季校園招聘高頻重點提升(共500題)附帶答案詳解
- 康復(fù)醫(yī)學(xué)科患者隱私保護制度
- Samsung三星SMARTCAMERANX2000(20-50mm)中文說明書200
- 2024年藥品質(zhì)量信息管理制度(2篇)
- 2024年安徽省高考地理試卷真題(含答案逐題解析)
- 廣東省廣州市2024年中考數(shù)學(xué)真題試卷(含答案)
- 高中學(xué)校開學(xué)典禮方案
- 內(nèi)審檢查表完整版本
- 3級人工智能訓(xùn)練師(高級)國家職業(yè)技能鑒定考試題及答案
評論
0/150
提交評論