標籤:scrapy python
Scrapy 是什嗎?
Scrapy 是一個開源的基於Twisted的python爬蟲架構,我們只要定製幾個簡單的模組就能實現網路資料的爬取。
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列表