3、python開源——scrapy使用

此環節是在MAC OS中進行搭建

安裝scrapy

pip install scrapy即可快速完成安裝

創建項目:

$ scrapy startproject tutorial

輸出如下:

New Scrapy project 'tutorial', using template directory '/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/scrapy/templates/project', created in:

/Users/huilinwang/tutorial

You can start your first spider with:

cd tutorial

scrapy genspider example example.com

該目錄下結構如下:

tutorial/

? ? ?scrapy.cfg

? ? ?tutorial/

? ? ? ? ? __init__.py

? ? ? ? ?items.py

? ? ? ? ?pipelines.py

? ? ? ? ?settings.py

? ? ? ? ?spiders/

? ? ? ? ? ? ? ? __init__.py

? ? ? ? ? ? ? ? ?...

分解說明如下:

scrapy.cfg: 項目的配置文件

tutorial/: 該項目的python模塊。之后您將在此加入代碼。

tutorial/items.py: 項目中的item文件.

tutorial/pipelines.py: 項目中的pipelines文件.

tutorial/settings.py: 項目的設置文件.

tutorial/spiders/: 放置spider代碼的目錄.

定義item

Item 是保存爬取到的數據的容器;其使用方法和python字典類似, 并且提供了額外保護機制來避免拼寫錯誤導致的未定義字段錯誤。

根據需要從dmoz.org獲取到的數據對item進行建模。 我們需要從dmoz中獲取名字,url,以及網站的描述。 對此,在item中定義相應的字段。編輯 tutorial 目錄中的 items.py 文件:

import scrapy

class DmozItem(scrapy.Item):

? ? ? ?title = scrapy.Field()

? ? ? ?link = scrapy.Field()

? ? ? ?desc = scrapy.Field()

編寫第一個爬蟲(Spider)

Spider是用戶編寫用于從單個網站(或者一些網站)爬取數據的類。

其包含了一個用于下載的初始URL,如何跟進網頁中的鏈接以及如何分析頁面中的內容, 提取生成 item 的方法。

為了創建一個Spider,您必須繼承 scrapy.Spider 類, 且定義以下三個屬性:

name: 用于區別Spider。 該名字必須是唯一的,您不可以為不同的Spider設定相同的名字。

start_urls: 包含了Spider在啟動時進行爬取的url列表。 因此,第一個被獲取到的頁面將是其中之一。 后續的URL則從初始的URL獲取到的數據中提取。

parse() 是spider的一個方法。 被調用時,每個初始URL完成下載后生成的 Response 對象將會作為唯一的參數傳遞給該函數。 該方法負責解析返回的數據(response data),提取數據(生成item)以及生成需要進一步處理的URL的 Request 對象。

以下為我們的第一個Spider代碼,保存在 tutorial/spiders 目錄下的 dmoz_spider.py 文件中:

import scrapy

class DmozSpider(scrapy.spiders.Spider):

? ? ?name = "dmoz"

? ? ?allowed_domains = ["dmoz.org"]

? ? ?start_urls = [

? ? ?"http://www.dmoz.org/Computers/Programming/Languages/Python/Books/",

? ? ?"http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/"

? ? ?]

? ? ?def parse(self, response):

? ? ? ? ?filename = response.url.split("/")[-2]

? ? ? ? ?with open(filename, 'wb') as f:

? ? ? ? ?f.write(response.body)

name屬性很重要,不同spider不能使用相同的name

start_urls是spider抓取網頁的起始點,可以包括多個url

parse方法是spider抓到一個網頁以后默認調用的callback,避免使用這個名字來定義自己的方法。

當spider拿到url的內容以后,會調用parse方法,并且傳遞一個response參數給它,response包含了抓到的網頁的內容,在parse方法里,你可以從抓到的網頁里面解析數據。上面的代碼只是簡單地把網頁內容保存到文件。

爬取

進入項目的根目錄,執行下列命令啟動spider:

scrapy crawl dmoz

有兩個包含url所對應的內容的文件被創建了: Book , Resources 。

Scrapy為Spider的 start_urls 屬性中的每個URL創建了 scrapy.Request 對象,并將 parse 方法作為回調函數(callback)賦值給了Request。

Request對象經過調度,執行生成 scrapy.http.Response 對象并送回給spider parse() 方法。

提取Item

從網頁中提取數據有很多方法。Scrapy使用了一種基于 XPath 和 CSS 表達式機制: Scrapy Selectors 。

Selector有四個基本的方法(點擊相應的方法可以看到詳細的API文檔):

xpath(): 傳入xpath表達式,返回該表達式所對應的所有節點的selector list列表 。

css(): 傳入CSS表達式,返回該表達式所對應的所有節點的selector list列表.

extract(): 序列化該節點為unicode字符串并返回list。

re(): 根據傳入的正則表達式對數據進行提取,返回unicode字符串list列表。

在Shell中嘗試Selector選擇器

進入項目的根目錄,執行下列命令來啟動shell:

scrapy shell "http://www.dmoz.org/Computers/Programming/Languages/Python/Books/"

當shell載入后,您將得到一個包含response數據的本地 response 變量。

輸入response.body將輸出response的包體,

輸出response.headers可以看到response的包頭。

更為重要的是,當輸入response.selector時, 您將獲取到一個可以用于查詢返回數據的selector(選擇器), 以及映射到response.selector.xpath() 、 response.selector.css()的 快捷方法(shortcut):response.xpath()response.css()

同時,shell根據response提前初始化了變量sel。該selector根據response的類型自動選擇最合適的分析規則(XML vs HTML)。

提取數據

嘗試從這些頁面中提取些有用的數據

在終端中輸入 response.body 來觀察HTML源碼并確定合適的XPath表達式。不過,這任務非常無聊且不易。您可以考慮使用Firefox的Firebug擴展來使得工作更為輕松。

查看了網頁的源碼后,您會發現網站的信息是被包含在 第二個

    元素中。

我們可以通過這段代碼選擇該頁面中網站列表里所有

  • 元素:
  • 在我們的spider中加入這段代碼:

    import scrapy

    class DmozSpider(scrapy.Spider):

    ? ? ? ? ?name = "dmoz"

    ? ? ? ? ?allowed_domains = ["dmoz.org"]

    ? ? ? ? ?start_urls = [

    ? ? ? ? "http://www.dmoz.org/Computers/Programming/Languages/Python/Books/",

    ? ? ? ? ?"http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/"

    ? ? ? ? ?]

    ? ? ? ? ?def parse(self, response):

    ? ? ? ? ? ? ? for sel in response.xpath('//ul/li'):

    ? ? ? ? ? ? ? title = sel.xpath('a/text()').extract()

    ? ? ? ? ? ? ? link = sel.xpath('a/@href').extract()

    ? ? ? ? ? ? ? desc = sel.xpath('text()').extract()

    ? ? ? ? ? ? ? print title, link, desc

    現在嘗試再次爬取dmoz.org,您將看到爬取到的網站信息被成功輸出

    /ul/li表示選擇所有的ul標簽下的li標簽

    a/@href表示選擇所有a標簽的href屬性

    a/text()表示選擇a標簽文本

    a[@href="abc"]表示選擇所有href屬性是abc的a標簽

    保存爬取到的數據

    最簡單存儲爬取的數據的方式是使用 Feed exports:

    scrapy crawl dmoz -o items.json

    該命令將采用 JSON 格式對爬取的數據進行序列化,生成 items.json 文件。

    最后編輯于
    ?著作權歸作者所有,轉載或內容合作請聯系作者
    平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

    推薦閱讀更多精彩內容

    • scrapy學習筆記(有示例版) 我的博客 scrapy學習筆記1.使用scrapy1.1創建工程1.2創建爬蟲模...
      陳思煜閱讀 12,780評論 4 46
    • scrapy是python最有名的爬蟲框架之一,可以很方便的進行web抓取,并且提供了很強的定制型,這里記錄簡單學...
      bomo閱讀 2,173評論 1 11
    • 本文希望達到以下目標: 簡要介紹Scarpy 閱讀官網入門文檔并實現文檔中的范例 使用Scarpy優豆瓣爬蟲的抓取...
      Andrew_liu閱讀 82,145評論 30 177
    • 高二成績倒數前三甲,所以每次月考都是最后一個考室。有一次恰逢英語考試,聽力還沒有開始放,大家已經答題完畢,磨拳...
      這個春天來得有點早閱讀 249評論 0 0
    • 思維清晰埋頭干 一進一退手腳忙 抬天老叟在戲鵝 背后農家正殺羊
      大清晨的小太陽閱讀 134評論 0 2