scrapy爬蟲框架介紹
一為什么選擇scrapy
通過這一篇博客,我致力於對scrapy進行簡單的介紹和簡單的網頁WEB數據抓取能力.Scrapy是一個健壯的web框架,用於從各種數據源抓取數據。
作為一個普通的web用戶,您經常會發現自己希望能夠通過Excel之類的電子表格程序從正在瀏覽的網站上獲取數據(參見第3章基本爬行),以便在脫機或執行計算時訪問這些數據。
作為開發人員,您常常希望能夠組合來自各種數據源的數據,但是您很清楚檢索或提取這些數據源的復雜性。Scrapy可以幫助您完成簡單和復雜的數據提取活動。
1.處理殘缺的HTML
您可以直接從Scrapy使用Beautiful Soup或lxml,但是Scrapy提供了選擇器——lxml之上的高級XPath(主要)接口。它能夠有效地處理損壞的HTML代碼和混亂的編碼。
2.社區
擁有一個強大的社區,在stack overflow上面 http://stackoverflow.com/questions/tagged/scrapy,基本能夠在幾分鍾內解決你提出的問題.更多的社區信息可以訪問 http://scrapy.org/community/.
3.由社區維護的組織良好的代碼
scrapy是一個標准化的大媽格式和框架,您可以編寫名為spider和pipeline的Python小模塊,並且可以自動地從將來對引擎本身的任何改進中獲益。所以,不管有誰加入你的團隊,都不必經歷理解自定義爬行器特性的學習曲線。
二.scrapy需要注意的事項
在某些情況下,不負責任的web抓取可能是惱人的,甚至是非法的。需要避免的兩件最重要的事情是拒絕服務攻擊(DoS),比如行為和侵犯版權。
一個典型的web爬蟲程序可能每秒下載幾十個頁面。這是普通用戶產生流量的十倍多。這可能會讓網站所有者感到不安。使用節流將生成的流量減少到可接受的類似用戶的級別。監控響應時間,如果您看到響應時間在增加,請減少爬行的強度。
在版權方面,很明顯,看看你瀏覽的每一個網站的版權公告,確保你明白什么是允許的,什么是不允許的。為網站管理員提供一種方法來表達他們希望被排除在您的爬蟲之外,這是很好的。
三.理解HTML和XPATH
為了解析來自web頁面的信息,你必須要理解更多關於它的框架.
1.HTML
讓我們花一些時間來理解從用戶在瀏覽器上鍵入URL:
1.在瀏覽器上鍵入URL。URL的第一部分(域名,如gumtree.com)用於在web上找到合適的服務器,URL和其他數據(如cookie)形成一個請求,該請求被發送到該服務器。
2.服務器通過向瀏覽器發送HTML頁面進行響應。注意,服務器還可能返回其他格式,如XML或JSON,但目前我們主要關注HTML。
3.HTML被轉換成瀏覽器中的一個內部樹表示:文檔對象模型(Document Object Model, DOM)。
4.根據一些布局規則,將內部表示呈現為您在屏幕上看到的可視表示。
2.XPath
使用XPath選擇和過濾HTML元素.文檔的層次結構以元素開始,您可以使用元素名稱和斜杠來選擇文檔的元素。例如,以下是從http://example.com/頁面返回的各種表達式:
$x('/html') [ <html>...</html> ] $x('/html/body') [ <body>...</body> ] $x('/html/body/div') [ <div>...</div> ] $x('/html/body/div/h1') [ <h1>Example Domain</h1> ] $x('/html/body/div/p') [ <p>...</p>, <p>...</p> ] $x('/html/body/div/p[1]') [ <p>...</p> ] $x('/html/body/div/p[2]') [ <p>...</p> ]
您還可以選擇屬性。http://example.com/上唯一的屬性是鏈接的href,您可以使用字符@訪問該鏈接,如下所示:
$x('//a/@href') [ href="http://www.iana.org/domains/example" ]
你也能夠永選擇器text():
$x('//a/text()') [ "More information..." ]
實際上,您經常需要在XPath表達式中使用類。在這些情況下,您應該記住,由於一些稱為CSS的樣式元素,您經常會看到HTML元素在它們的class屬性上聲明多個類。
這意味着,例如,在導航系統中,您將看到一些div的類屬性設置為“link”,而另一些div的類屬性設置為“link active”。后者是當前處於活動狀態的鏈接,因此可用特殊顏色(通過CSS)顯示或突出顯示。
在進行抓取時,您通常會對包含特定類的元素感興趣,即前面示例中的“link”和“link active”。contains() XPath函數允許您選擇包含某個類的所有元素。
//table[@class="infobox"]//img[1]/@src //div[starts-with(@class,"reflist")]//a/@href //*[text()="References"]/../following-sibling::div//a
如果它們的HTML以使XPath表達式無效的方式更改,我們將不得不返回爬行器並糾正它們。這通常不會花費很長時間,因為更改通常很小。然而,這肯定是我們寧願避免的事情。一些簡單的規則可以幫助我們降低您的表達式無效的幾率:
//*[@id="myid"]/div/div/div[1]/div[2]/div/div[1]/div[1]/a/img //div[@class="thumbnail"]/a/img //*[@id="more_info"]//text() //[@id="order-F4982322"]
盡管id是惟一的,但是上面的XPath表達式非常糟糕。還要記住,即使id是惟一的,您也會發現許多HTML文檔並不是惟一的。
四.基礎爬蟲
1.安裝scrapy
scrapy是通過python語言作為基礎的,所以在scrapy安裝以前,是要先安裝python的,這里我就不多說python的安裝了,網上有很多教程。
這里我是通過Anaconda進行python包的版本控制,這樣非常的方便管理python的各種包依賴版本問題。
當安裝了Anaconda后,就可以安裝scrapy,scrapy也是python的一個包,所以命令如下:pip install scrapy安裝。
2.創建scrapy項目
scrapy startproject 項目名(demo)
3.簡單爬取網頁(http://jandan.net)為例
1.創建jiandanSpider,作為項目主要入口
2.item
3.pipeline
4.setting
5.測試
進入項目目錄cmd
使用命令:scrapy crawl jiandan,可以再E盤看到我們抓取下來的圖片: