天天看點

Scrapy架構的一些學習心得Scrapy架構的一些學習心得

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'