scrapy爬蟲框架介紹


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盤看到我們抓取下來的圖片:

    

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM