Scrapy 入門教程 --爬去ITunes app列表

來源:互聯網
上載者:User

標籤:scrapy   python   

  1. Scrapy 是什嗎?

    Scrapy 是一個開源的基於Twisted的python爬蟲架構,我們只要定製幾個簡單的模組就能實現網路資料的爬取。

  2. Scrapy 的整體架構

簡單的解釋一下上面的圖: 
爬蟲處理的原材料是一個或多個url,爬取時Sheduler會把一個url分配給Downloader來進行一次網路的request請求,請求完成後Downloader再把所得到的response傳到Spiders,如果返回的資料是我們需要的,資料就會被處理成相應的Item交給ItemPipeline來進行儲存等處理。如果返回的仍然是要處理的url,那麼就要交由Scheduler就行再一次的處理過程。

3.Scrapy的安裝

sudo pip_install scrapy   或 sudo easy_intall scrapy

輸入密碼安裝完成。輸用 scrapy 如果沒有 command not found 就表示已經安裝成功。

4.建立項目

scrapy startproject project_name

如果看到上面的提示,那麼我們的項目就建立成功了。切換到項目錄下,我們會看到如下的目錄結構

appScrapy/ 
scrapy.cfg 整個項目的配製資訊 
appScrapy/ 存放所有python定製模組的檔案夾 
init.py 
items.py 儲存爬取到的的資料的資料結構 
pipelines.py 資料流處理檔案,對爬取的資料流進行處理 
settings.py 設定檔案,在這裡設定資料庫等 
spiders/ 存放我們定製的爬蟲 
init.py 
… 
我們來找全目標,appStore的娛樂熱門排行榜https://itunes.apple.com/cn/genre/ios-yu-le/id6016?mt=8 

我們要爬取的資料就是列表中的app名字跟其相應的具體資訊的url。

首先我們來定製我們用來儲存資料類型的 items.py,開啟items.py,境加後的代碼如下:

import scrapyclass AppscrapyItem(scrapy.Item):    # define the fields for your item here like:    name = scrapy.Field()    url = scrapy.Field()

簡單說明一下,所有item都繼承於scrapy.Item,裡面的欄位都是scrapy.Field()類型,scrapy.Field()可以接收任何資料類型。

現在該定製我們的爬蟲了。

在spiders 檔案夾下建立一個AppScrapy.py,然後開啟添加如下代碼

from scrapy.spider import BaseSpiderfrom appScrapy.items import AppscrapyItemclass AppScrapy(BaseSpider):    name = ‘app_scrapy‘    start_urls = ["https://itunes.apple.com/cn/genre/ios-yu-le/id6016?mt=8"]    def parse(self, response):        result = []        lis = response.xpath("//div[@class=‘grid3-column‘]/div")        for li in lis:            array = li.xpath("./ul/li")            for node in array:                item = AppscrapyItem()                item["name"] = node.xpath("./a/text()").extract()                item["url"] = node.xpath("./a/@href").extract()                result.append(item)        return result

所有爬蟲類都需要繼承自 BaseSpider,並且必須定義一個name,因為啟動爬蟲時我們要靠這個名字來啟動。一個url的數組,必須的這個爬蟲才能知道自己應該去哪,最後必須實現parse方法,在這裡對爬回來的資料真行篩選得到我們想要的。

當我們啟動這個爬蟲時 (scrapy crawl app_scrapy),scrapy會從start_urls中取出第一條url,並且用這個url發起一個request,並且把parse作為該request的回呼函數,在回呼函數中的response就是該request請求後得到的響應。 

對於內容的選取我們用xpath方法,xpath方法中要求輸入一個路徑返回一個selector數組。

對於路徑我們可以使用Chrome的開發人員工具得到,如所示。 我們想要擷取內容時,只要在Element選項卡下選中內容,然後右鍵選擇 copy xPath

lis = response.xpath("//div[@class=‘grid3-column‘]/div")

首先我們利用xpath獲得 class = ‘grid3-column’的div 中所有的div,返回的值一個數組。從上面的圖片中我們可以看數組中應該是3個表示div 的selector.


每個div中的內容如所示。我們取出每一個div對其內容再解析。

              for li in lis:            array = li.xpath("./ul/li")            for node in array:                item = AppscrapyItem()                item["name"] = node.xpath("./a/text()").extract()                item["url"] = node.xpath("./a/@href").extract()                result.append(item)

首先用for 迴圈取出每一個div,然後在當前的div下擷取所有的ul下的所有li,所所示,我們會得到一個表示li的selector數組。我們再看一下li的結構 

中間的文字我們通過text()來獲得,所以當前li的文字路徑為”./a/text()” “.”表示當前的selector開始。如果這樣返回,xpath返回的是一個selector.我們想要擷取其真正的值還需要調用extract(),這樣就會返回一個其真實字面值的數組。 
要想擷取欄位的屬性值,需要使用 @,如上面的@href,然後把這些值賦給我們寫好的item就ok了。

資料當然要把儲存了,未完待續,下次寫怎麼儲存到資料庫。

Scrapy 入門教程 --爬去ITunes app列表

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.