Scrapy架構的一些學習心得
1 scrapy.cfg的作用
一個項目的配置檔案的話在scrapy.cfg裡面,裡面配置了具體的配置檔案所在的路徑,以及一些url端口資訊,預設的話不需要去修改
2 settings.py的作用
這個的話是具體的配置檔案
2.1 爬蟲檔案的存放路徑的話:在下面這裡面配置
SPIDER_MODULES = ['itcast.spiders']
NEWSPIDER_MODULE = 'itcast.spiders'
2.2 下面的這個可以配置AGENT 的一些相關
# Crawl responsibly by identifying yourself (and your website) on the user-agent
USER_AGENT = 'itcast (+http://www.yourdomain.com)'
2.3 預設開啟的線程數為16,可以在下面的這些代碼裡面設定
# Configure maximum concurrent requests performed by Scrapy (default: 16)
CONCURRENT_REQUESTS =
2.4 預設抓取資料是不等待的,可以在下面設定
# Configure a delay for requests for the same website (default: 0)
# See http://scrapy.readthedocs.org/en/latest/topics/settings.html#download-delay
# See also autothrottle settings and docs
DOWNLOAD_DELAY =
2.5 下面的這個是設定怕從是否遵從某個規定的,最好不要遵循不然的話好多資料會抓不到的
# Obey robots.txt rules
# ROBOTSTXT_OBEY = True
2.6未完待續
3 class Spider(scrapy.Spider)具體的爬蟲類解釋
3.1 name = ‘xxxx’
這個表示目前的爬蟲類的唯一表示,一個項目必須唯一,用來啟動爬蟲或者其他的時候用到
3.2 allowed_domains = [‘http://www.xxxx.com‘]
這個則表示目前的爬蟲會在哪些域名下面抓取資料,如果不在這個域名下面的話那麼就不會被抓取資料
3.3 start_urls = [‘http://www.xxxx.com‘]
起始的url位址清單,爬蟲執行後第一批請求,将從這個清單擷取
3.4 def parse(self, response)
這個方法會在start_urls頁面之後被執行,可以在這裡面執行相應的解析頁面的操作,例如:
nodeList = response.xpath("//div[@class='li_txt']")
# itemList = []
for node in nodeList:
# 建立item字段對象,用來存儲資訊
item = ItcastItem()
# 下面的傳回的是一個xpath對象清單,是以需要使用extract()方法來将其轉換成Unicode字元串
name = node.xpath("./h3/text()").extract()
title = node.xpath("./h4/text()").extract()
info = node.xpath("./p/text()").extract()
# 存儲到item字段對象裡面
item['name'] = name[]
item['title'] = title[]
item['info'] = info[]
# 傳回提取的每一個item資料給管道,給管道處理,然後還回來繼續執行目前的for循環裡面的代碼
yield item
上面的代碼使用了xpath來解析頁面的結構,Scrapy預設支援将資料以4中形式輸出,可以通過
scrapy crawl “爬蟲唯一表示名稱” -o itcast.json
scrapy crawl “爬蟲唯一表示名稱” -o itcast.csv
還兩個忘掉了,大概文法就是這樣的
還可以直接将item傳回給相應的管道處理,使用下面的這個代碼實作
yield item
注意如果要傳回給管道的話需要在settings.py檔案裡面将管道的配置開啟
4 管道相關
4.1 pipelines.py檔案的一些方法釋義
def process_item(self, item, spider):
return item
預設的隻有上面這一個方法的,這個方法是用來處理爬蟲類裡面傳遞來的item的,可以在裡面定義自己的處理邏輯,注意下需要代碼最後必須return item,item在管道裡面處理完畢之後需要再傳遞給引擎,return item就是将處理好的item傳遞給引擎的,如果不 return item的話那麼就會在這裡中斷掉,那麼就會出錯,再就是如果存在多個管道類的話那麼return item就表示将item接着傳遞給下一個管道,執行那個管道的業務邏輯
再就是參數清單裡面的spider就是表示傳遞item過來的spider對象,可以通過.name等方法檢視spider的名字等資訊
可以在預設的方法之外添加這個初始化方法,這個方法的話初始化一些需要初始化的東西
還可以添加這個方法,這個方法可以算是一個結束方法,裡面的話可以執行一些關閉某些流等操作,類似的資料庫的關閉等可以在這個方法裡面執行
4.2 自定義管道的配置
可以在settings.py裡面設定自定義的管道
# Configure item pipelines
# See http://scrapy.readthedocs.org/en/latest/topics/item-pipeline.html
ITEM_PIPELINES = {
'itcast.pipelines.ItcastPipeline': ,
}
ITEM_PIPELINES這個是一個字典,可以在裡面添加自定義的管道,其中itcast表示項目名,pipelines這個表示具體的檔案,ItcastPipeline表示具體的管道類,後面的300則表示有限制,範圍在0-1000,值越小優先級越高
item會順序的經過所有的管道類,然後全部經過後下一個item進來,接着進入全部的管道
5 Selectors選擇器的
Selectorts有四個基本的方法,最常用的就是xpath:
xpath():傳入xpath表達式,傳回該清單所對應的所有節點的selectors list清單
extract():序列化該節點為Unicode字元串并傳回list
css():傳入css表達式,傳回該表達式所對應的所有節點的selector list清單,文法同BeautifulSoup4
re():根據傳入的正規表達式對資料進行提取,傳回Unicode字元串list清單
6 各個檔案的作用
1 爬蟲檔案請求是發送請求,處理響應的
2 item檔案是定義字段的
3 管道檔案的話是進一步處理item的
7 scrapy架構的執行順序
1 首先執行爬蟲檔案,爬蟲檔案會根據start_urls的位址發送請求,然後得到響應
2 會執行parse方法,然後我們可以通過xpath或者正則等處理,然後存放到item中
3 可以同過yield來将item傳回給管道,給管道進一步處理,如果存在多個管道的話那麼這個item就會根據settings.py檔案裡面定義的優先級來順序執行,直到執行完畢全部的管道
4 有下一個item的話那麼久執行下一個item
5 沒有的話那麼就會傳回給引擎
8 爬取圖檔注意
1 爬蟲類的話需要将得到的網頁位址存放在item中
2 管道類需要繼承ImagesPipeline類(需要導入),然後重寫get_media_requests方法,類似下面這樣
def get_media_requests(self, item, info):
imageLink = item["imageLink"]
yield scrapy.Request(imageLink)
3 再就是需要在配置檔案中配置圖檔的存放路徑代碼季下面的IMAGES_STORE部分,如果爬取的頁面為手機端的頁面的話那麼需要設定下USER_AGENT,如下面這樣,下面的這個為iphone的USER_AGENT例子
IMAGES_STORE = "/Users/yedeguo/Desktop/鬥魚圖檔"
# Crawl responsibly by identifying yourself (and your website) on the user-agent
USER_AGENT = 'Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML,' \
' like Gecko) Version/6.0 Mobile/10A403 Safari/8536.25'