




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
使用Scrapy爬蟲框架采集數據——爬取汽車之家數據 本章學習目標了解Scrapy爬蟲框架的工作原理了解Scrapy爬蟲框架的安裝過程以及各組件的基本含義和用法掌握Scrapy爬蟲框架采集數據的實例6.3.1Selector
在抓取web頁面時,需要執行的最常見任務是從HTML源提取數據。有幾個庫可以實現這一點。BeautifulSoup是Python程序員中非常流行的web抓取庫,它根據HTML代碼的結構構造Python對象,并合理地處理不好的標記,但它有一個缺點:速度慢。lxml是一個基于ElementTree的pythonAPI的XML解析庫(它也解析HTML)。(lxml不是Python標準庫的一部分。)Scrapy有自己的數據提取機制。它們之所以稱為選擇器,是因為它們“選擇”由XPath或CSS表達式指定的HTML文檔的某些部分。6.3Scrapy各組件的用法XPath是一種用于在XML文檔中選擇節點的語言,也可以與HTML一起使用。CSS是一種用于向HTML文檔應用樣式的語言。它定義了選擇器來將這些樣式與特定的HTML元素關聯起來。Scrapy選擇器是在lxml庫之上構建的,這意味著它們在速度和解析精度方面非常相似。Scrapy選擇器是通過傳遞文本或文本響應對象構造的Selector類的實例。它根據輸入類型自動選擇最佳解析規則(XML或HTML),以下幾種構建選擇器selector的方式。>>>fromscrapy.selectorimportSelector>>>fromscrapy.httpimportHtmlResponse從文本構建實例:>>>body='<html><body><span>good</span></body></html>'>>>Selector(text=body).xpath('//span/text()').extract()[u'good']從響應構建實例:>>>response=HtmlResponse(url='http://example',body=body)>>>Selector(response=response).xpath('//span/text()').extract()[u'good']了方便起見,響應對象含有一個selector屬性,完全可以使用這個快捷方式:>>>response.selector.xpath('//span/text()').extract()[u'good']實例【6-1】將使用一個HTML代碼作為案例,進一步地介紹如何使用selector選擇器。這里將是Scrapy的shell程序進行交互和測試。<html><head><basehref='http://example/'/><title>Examplewebsite</title></head><body><divid='images'><ahref='image1.html'>Name:Myimage1<br/><imgsrc='image1_thumb.jpg'/></a><ahref='image2.html'>Name:Myimage2<br/><imgsrc='image2_thumb.jpg'/></a><ahref='image3.html'>Name:Myimage3<br/><imgsrc='image3_thumb.jpg'/></a><ahref='image4.html'>Name:Myimage4<br/><imgsrc='image4_thumb.jpg'/></a><ahref='image5.html'>Name:Myimage5<br/><imgsrc='image5_thumb.jpg'/></a></div></body></html>1)首先是打開Scrapy的shell程序:scrapyshellurl(這里的url是指要使用的url)2)然后在shell加載之后,您將擁有響應response作為變量可用,以及響應中附加的選擇器屬性response.selector。由于這里處理的是HTML,選擇器將自動使用HTML解析器。因此,通過查看頁面的HTML代碼,可以構造一個XPath來選擇標題標記中的文本。>>>response.selector.xpath('//title/text()’)[<Selector(text)xpath=//title/text()>]3)使用XPath和CSS查詢響應非常常見,響應包括兩個方便的快捷方式:response.xpath()和response.css()。>>>response.xpath('//title/text()')[<Selector(text)xpath=//title/text()>]>>>response.css('title::text')[<Selector(text)xpath=//title/text()>]如您所見,.xpath()和.css()方法返回一個SelectorList實例,這是一個新的選擇器列表。該API可用于快速選擇嵌套數據。>>>response.css('img').xpath('@src').extract()[u'image1_thumb.jpg',u'image2_thumb.jpg',u'image3_thumb.jpg',u'image4_thumb.jpg',u'image5_thumb.jpg']要實際提取文本數據,必須調用selector.extract()方法,如下所示。>>>response.xpath('//title/text()').extract()[u'Examplewebsite']如果只想提取第一個匹配的元素,可以調用選擇器.extract_first()。>>>response.xpath('//div[@id="images"]/a/text()').extract_first()u'Name:Myimage1'如果沒有找到元素,則返回None。>>>response.xpath('//div[@id="not-exists"]/text()').extract_first()isNoneTrue可以提供一個默認返回值作為參數。>>>response.xpath('//div[@id="not-exists"]/text()').extract_first(default='not-found')'not-found'CSS選擇器可以使用CSS3偽元素選擇文本或屬性節點。>>>response.css('title::text').extract()[u'Examplewebsite']選擇方法(.xpath()或.css())返回相同類型的選擇器列表,因此您也可以調用這些選擇器的選擇方法。這里有一個例子。>>>links=response.xpath('//a[contains(@href,"image")]')>>>links.extract()[u'<ahref="image1.html">Name:Myimage1<br><imgsrc="image1_thumb.jpg"></a>',u'<ahref="image2.html">Name:Myimage2<br><imgsrc="image2_thumb.jpg"></a>',u'<ahref="image3.html">Name:Myimage3<br><imgsrc="image3_thumb.jpg"></a>',u'<ahref="image4.html">Name:Myimage4<br><imgsrc="image4_thumb.jpg"></a>',u'<ahref="image5.html">Name:Myimage5<br><imgsrc="image5_thumb.jpg"></a>']>>>forindex,linkinenumerate(links):...args=(index,link.xpath('@href').extract(),link.xpath('img/@src').extract())...print'Linknumber%dpointstourl%sandimage%s'%argsLinknumber0pointstourl[u'image1.html']andimage[u'image1_thumb.jpg']Linknumber1pointstourl[u'image2.html']andimage[u'image2_thumb.jpg']Linknumber2pointstourl[u'image3.html']andimage[u'image3_thumb.jpg']Linknumber3pointstourl[u'image4.html']andimage[u'image4_thumb.jpg']Linknumber4pointstourl[u'image5.html']andimage[u'image5_thumb.jpg']選擇器selector有一個.re()方法用來使用正則表達式獲取數據,該方法返回一個unicode字符串的列表。>>>response.xpath('//a[contains(@href,"image")]/text()').re(r'Name:\s*(.*)') [u'Myimage1',u'Myimage2',u'Myimage3',u'Myimage4',u'Myimage5']6.3.2Spider Spider類是定義如何對某個站點(或一組站點)進行抓取的類,包括如何執行抓取(即跟蹤鏈接)以及如何從其頁面中提取結構化數據(即抓取項)。換句話說,spider是為爬取和解析頁面特定站點(或者在某些情況下是一組站點)的自定義行為的地方。對于Spider來說,一個抓取周期的具體過程如下。首先生成初始請求來抓取第一個url,然后指定一個回調函數,使用從這些請求下載的響應來調用該回調函數。要執行的第一個請求是通過調用start_requests()方法獲得的,該方法(默認設置)為start_urls中指定的url生成請求,并將解析方法作為請求的回調函數。在回調函數中,解析響應(web頁面)并返回帶有提取的數據、Item對象、請求對象的dicts或可迭代的對象。這些請求還將包含一個回調(可能是相同的),然后由Scrapy下載,之后由指定的回調函數處理它們的響應。在回調函數中,您解析頁面內容,通常使用選擇器Selectors(但是您也可以使用BeautifulSoup、lxml或您喜歡的任何機制)并使用解析后的數據生成項目Items。最后從爬蟲返回的item通常會持久化到數據庫(在某個項管道中ItemPipeline),或者使用Feedexports將其寫入文件。這是一個最簡單的Spider周期,也是所有其他Spider都必須繼承的Spider(包括與Scrapy捆綁在一起的Spider,以及你自己編寫的Spider)。它不提供任何特殊功能。它只是提供了一個默認的start_requests()實現,該實現從start_urlsspider屬性發送請求,并為每個結果響應調用爬行器的方法解析。Spider中包含一些重要的屬性如下。1.name定義此爬蟲名稱的字符串。爬蟲名稱是Scrapy定位(和實例化)爬蟲的方式,因此它必須是惟一的。這是最重要的Spider屬性,也是必需的。2.allowed_domains一個可選的字符串列表,其中包含允許爬蟲爬取的域。如果啟用OffsiteMiddleware,那么對不屬于此列表中指定的域名(或其子域名)的url的請求將不會被跟蹤。3.start_urls當指定非特定url時,爬蟲將從其中開始爬取的url列表。因此,下載的第一個頁面將在這里列出。后續請求將從開始的url中獲得連續的生成數據。4.custom_settings運行此爬蟲時將從項目wideconfiguration中重寫的設置字典。它必須定義為classattribute,因為在實例化之前會更新設置。在運行Spider的時候,一個字典類型的設置將被從整個項目的配置范圍內重寫。它必須被定義為一個類屬性,因為在實例化之前會更新設置。5.crawler這個屬性是在初始化類之后由from_crawler()類方法設置的,并鏈接到這個爬蟲實例綁定到的crawler對象。6.settings運行此爬蟲的配置。這是一個實例。7.logger用爬蟲的名稱創建的Python日志記錄器。您可以使用它發送日志消息。8.from_crawler(crawler,*args,**kwargs)這是Scrapy用來創建爬蟲的類方法。您可能不需要直接重寫它,因為它默認作為__init__()方法的代理,通過使用給定參數args和命名參數kwargs調用它。盡管如此,該方法在新實例中設置spider和settings屬性,以便稍后可以在spider的代碼中訪問它們。9.start_requests()實例【6-2】這個方法必須返回一個可迭代的,并帶有第一個請求來爬取的爬蟲。當spider被打開時,它被稱為Scrapy。Scrapy只調用它一次,所以將start_requests()實現為生成器是安全的。classMySpider(scrapy.Spider):name='myspider'defstart_requests(self):return[scrapy.FormRequest("http://www.example/login",formdata={'user':'john','pass':'secret'},callback=self.logged_in)]deflogged_in(self,response):#在這里,您將提取鏈接以跟蹤它們,并使用另一個回調返回每個鏈接的請求
pass10.parse(response)
當請求沒有指定的回調函數時,這是Scrapy用來處理下載后的響應數據的默認回調函數。解析方法負責處理響應,并返回收集的數據或更多url。其他請求回調具有與Spider類相同的要求。此方法以及任何其他請求回調函數都必須返回可迭代的請求,dicts或Item對象。11.closed(reason)當spider關閉時。這個方法為spider_closed信號提供了一個快捷方式。實例【6-3】下面的實例是從一個回調中返回多個請求和項目。importscrapyclassMySpider(scrapy.Spider):name='example'allowed_domains=['example']
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 工業智能化與人力資源的變革
- 工業安全與智能制造的關系
- 工業設計在制造業的未來應用
- 工業設計數字化創新實踐案例分享
- 4s店電銷管理制度
- 柴油叉車使用管理制度
- 標本采集應急管理制度
- 校內托管收支管理制度
- 校園會議設備管理制度
- 校園各類陣地管理制度
- 重慶市渝北區名校2025屆生物七下期末復習檢測模擬試題含解析
- 2025年5月12日陜西省公務員面試真題及答案解析
- 《臨床研究論文撰寫》課件
- 隱匿性陰莖的護理
- 扳手訂單合同協議
- 購買居間協議書范本
- 瀝青路面施工方案
- 【西安交通大學】2025年電力人工智能多模態大模型創新技術及應用報告
- 2025年上海國企中鐵十五局集團有限公司招聘筆試參考題庫含答案解析
- 2025電梯年檢項目整改合同田王
- 臨床教學師資培訓
評論
0/150
提交評論