標籤:
這幾天為了做課程設計,想起之前學過python,所以想起要去做個爬蟲,於是用上了scrapy架構,當然在這期間也瞭解了一下requests,但是還是沒有scrapy方便,畢竟它沒有處理cookie的機制,需要自己去手動處理,比較麻煩,下面我來先稍微講講自己對scrapy運行原理的理解:
我們可以看到這是scrapy的大致結構,scrapy的運行流程:
1.scrapy engine開啟一個domain,並根據domain找到對應的處理這個domain的spider(spider中介軟體重要作用是為request要求標頭中加入refer,根據對應的response的url)
2.spider處理這個url並返回request,scrapy engine將request放到調度器
3.engine向調度器請求下一個url
4.調度器將這個request傳到下載中間鍵(處理cookies,認證,user-agent),然後下載器會去下載這個request的內容,並將對應的response返回到Spider
5.Spider再根據response產生出item或者request,並將它傳到itempipeline或者調度器中
6.從2步開始重複直到沒有request
在這裡加入一個插曲,Spider中介軟體會對Spider發出的request進行檢查,只有滿足allow_domain才會被允許發出,這裡還有我自己的一個疑惑:scrapy中有一個linkExtractor,我的理解是當它會對response的url進行解析,如果符合,則會送去回調方法,但是這樣的話就有一個疑惑,當你用Request方法建立一個request,同樣可以設定一個callback,那麼此時這個response究竟是被送去哪一個callback去處理呢?還是都被處理呢?(都的話感覺不太合適吧?還是有優先順序?)
scrapy最重要的一點就是它能自動處理cookie,但是我們可以從官方文檔看到一個比較奇怪的地方,
for i, url in enumerate(urls): yield scrapy.Request("http://www.example.com", meta={'cookiejar': i}, callback=self.parse_page)
我在這裡的理解是當我們單個spider中每次只有一個request時候,因為預設是使用一個cookiejar來處理,所以我們在發出request的時候,不需要手動使用meta來給它布置cookiejar,但是當單個spider多個request的時候,因為返回的每個response要求下一個request帶的cookie都不同,所以每一次都要手動給每個request添加cookiejar來記錄
這裡順便說下,我們使用爬蟲類比瀏覽器去訪問,其實主要是帶有cookie和要求標頭中的refer和user-agent資訊,由於scrapy幫我們處理好了這些,所以使我們能夠更專註於商務邏輯,這是非常有趣的,以後有空一定要取看看源碼
再淺談下session和cookie的區別
session和cookie都是一種保持http串連的方式,session是將資訊儲存在伺服器端,cookie是儲存在用戶端
在不禁用cookie的情況下,當用戶端第一次發送請求到伺服器端的時候,伺服器端會產生一個session_id,然後將它設定在響應報文的setcookie選項中,當用戶端收到之後,知道下一次發送請求報文要加上這個cookie,當下一次發送的時候,伺服器會根據這個session_id找到對應的session(由tomcat自行處理),如果禁用了cookie,那麼一般則會採取放在url後面或者使用input hidden的形式傳入session_id
用戶端每次發送cookie的時候,都會在本地搜尋有效範圍大於這次請求資源的cookie,然後加在request中的cookie裡面,發送出去,這裡必須注意的是response其實是沒有cookie這個選項的,所以我們看響應報文頭也是沒有cookie選項的,它只有一個setcookie選項告訴下一次發送的請求應該有什麼樣的cookie而已
願各位能有所收穫,順便求大神解救下我的疑惑~
最後附上我的github裡面用scrapy建立的小項目 https://github.com/yue060904/Spider
python scrapy的一點雜談