1. 程式人生 > >scrapy爬蟲注意點(2)—— 根據page迴圈遍歷頁面引數問題

scrapy爬蟲注意點(2)—— 根據page迴圈遍歷頁面引數問題

1. 問題背景

  • 在訪問如下這種論壇網頁時,經常會根據頁碼訪問接下來的頁面。很多時候,會將pageIdx帶入帶request中的meta中,以便將這個page資料傳遞下去,但是基於scrapy的yield機制,不同的寫法,會讓帶進去的page不同。
    這裡寫圖片描述

2. 例項分析

  • 程式碼
# -*- coding: utf-8 -*-
import scrapy


class MyclawerSpider(scrapy.Spider):
    name = 'myClawer'
    allowed_domains = ['bbs.fengniao.com']
    start_urls = ['http://bbs.fengniao.com/'
] def start_requests(self): # 全域性變數 pageDict = {'page': 99} pageGlobal = 99 # 關注 pageIdx 迴圈內的變數 for pageIdx in range(1,10): # 關注 pageDict 迴圈外的變數,相對於迴圈來說,是全域性變數(可變) pageDict['page'] = pageIdx # 關注 pageGlobal 迴圈外的變數,相對於迴圈來說,是全域性變數(不可變)
pageGlobal = pageIdx # 關注 pageTemp 迴圈外的變數,相對於迴圈來說,是區域性變數,每輪都會建立一個單獨的變數 pageTemp = pageIdx yield scrapy.Request( url=f'http://bbs.fengniao.com/forum/forumdisplay.php?f=125&type=list&order=desc&sort=lastpost&page={pageIdx}'
, meta={'pageIdx': pageIdx, 'pageTemp': pageTemp, 'pageGlobal': pageGlobal, 'pageDict': pageDict, 'dont_redirect': True}, callback=self.parse, errback=self.error ) def parse(self, response): print(f"parse url={response.url}, status={response.status}, meta={response.meta}") def error(self, response): pass
  • 輸出結果:
parse url=http://bbs.fengniao.com/forum/forumdisplay.php?f=125&type=list&order=desc&sort=lastpost&page=1, status=200, meta={'pageIdx': 1, 'pageTemp': 1, 'pageGlobal': 1, 'pageDict': {'page': 9}, 'dont_redirect': True, 'download_timeout': 180.0, 'download_slot': 'bbs.fengniao.com', 'download_latency': 0.254000186920166}
parse url=http://bbs.fengniao.com/forum/forumdisplay.php?f=125&type=list&order=desc&sort=lastpost&page=4, status=200, meta={'pageIdx': 4, 'pageTemp': 4, 'pageGlobal': 4, 'pageDict': {'page': 9}, 'dont_redirect': True, 'download_timeout': 180.0, 'download_slot': 'bbs.fengniao.com', 'download_latency': 0.2779998779296875}
parse url=http://bbs.fengniao.com/forum/forumdisplay.php?f=125&type=list&order=desc&sort=lastpost&page=6, status=200, meta={'pageIdx': 6, 'pageTemp': 6, 'pageGlobal': 6, 'pageDict': {'page': 9}, 'dont_redirect': True, 'download_timeout': 180.0, 'download_slot': 'bbs.fengniao.com', 'download_latency': 0.2890002727508545}
parse url=http://bbs.fengniao.com/forum/forumdisplay.php?f=125&type=list&order=desc&sort=lastpost&page=7, status=200, meta={'pageIdx': 7, 'pageTemp': 7, 'pageGlobal': 7, 'pageDict': {'page': 9}, 'dont_redirect': True, 'download_timeout': 180.0, 'download_slot': 'bbs.fengniao.com', 'download_latency': 0.30900001525878906}
parse url=http://bbs.fengniao.com/forum/forumdisplay.php?f=125&type=list&order=desc&sort=lastpost&page=2, status=200, meta={'pageIdx': 2, 'pageTemp': 2, 'pageGlobal': 2, 'pageDict': {'page': 9}, 'dont_redirect': True, 'download_timeout': 180.0, 'download_slot': 'bbs.fengniao.com', 'download_latency': 0.3300001621246338}
parse url=http://bbs.fengniao.com/forum/forumdisplay.php?f=125&type=list&order=desc&sort=lastpost&page=8, status=200, meta={'pageIdx': 8, 'pageTemp': 8, 'pageGlobal': 8, 'pageDict': {'page': 9}, 'dont_redirect': True, 'download_timeout': 180.0, 'download_slot': 'bbs.fengniao.com', 'download_latency': 0.3259999752044678}
parse url=http://bbs.fengniao.com/forum/forumdisplay.php?f=125&type=list&order=desc&sort=lastpost&page=5, status=200, meta={'pageIdx': 5, 'pageTemp': 5, 'pageGlobal': 5, 'pageDict': {'page': 9}, 'dont_redirect': True, 'download_timeout': 180.0, 'download_slot': 'bbs.fengniao.com', 'download_latency': 0.3320000171661377}
parse url=http://bbs.fengniao.com/forum/forumdisplay.php?f=125&type=list&order=desc&sort=lastpost&page=3, status=200, meta={'pageIdx': 3, 'pageTemp': 3, 'pageGlobal': 3, 'pageDict': {'page': 9}, 'dont_redirect': True, 'download_timeout': 180.0, 'download_slot': 'bbs.fengniao.com', 'download_latency': 0.3320000171661377}
parse url=http://bbs.fengniao.com/forum/forumdisplay.php?f=125&type=list&order=desc&sort=lastpost&page=9, status=200, meta={'pageIdx': 9, 'pageTemp': 9, 'pageGlobal': 9, 'pageDict': {'page': 9}, 'dont_redirect': True, 'download_timeout': 180.0, 'download_slot': 'bbs.fengniao.com', 'download_latency': 0.2590000629425049}
  • 分析區別:
    這裡寫圖片描述
  • 從上面的結果可以看出:
    • 全域性變數(可變):page = 9 記錄的是迴圈最後的一個值。
    • 全部變數(不可變):page = 1,2…….9,每一輪的賦值,其實事實上是產生了一個新的變數。
    • 區域性變數:page = 1,2…….9,每一輪的賦值,產生了一個新的變數.
  • 原因就在於yield是一個生成器,每次取下一個請求時,就會去找對應的變數。

相關推薦

scrapy爬蟲注意2—— 根據page迴圈頁面引數問題

1. 問題背景 在訪問如下這種論壇網頁時,經常會根據頁碼訪問接下來的頁面。很多時候,會將pageIdx帶入帶request中的meta中,以便將這個page資料傳遞下去,但是基於scrapy的yield機制,不同的寫法,會讓帶進去的page不同。

怎樣學好爬蟲的,選取爬蟲入手的瀏覽器,爬蟲認知篇2

  選取一個瀏覽器,小白,網上得出結論谷歌瀏覽器OK!不是不讓用了嗎?怎麼還用谷歌?? 為什麼爬蟲要用Chrome? 為什麼大家似乎都值得header應該怎麼寫? 為什麼大家都知道怎麼爬取網頁的路線? 為什麼....

python爬蟲讀書筆記2

1.網站地圖爬蟲 def crawl_sitemap(url): #下載網站地圖檔案 sitemap=download(url) #正則表示式,從<loc>標籤中提取出URL,獲得網站地圖連結 links=re.findall('<loc>

vue中mixins的使用方法和注意

mixins基礎概況 vue中的解釋是這樣的,如果覺得語言枯燥的可以自行跳過嘿~ 混入 (mixins): 是一種分發 Vue 元件中可複用功能的非常靈活的方式。混入物件可以包含任意元件選項。當元件使用混入物件時,所有混入物件的選項將被混入該元件本身的選項。 怎麼用? 舉個栗子: 定義一個混入

Python Scrapy 爬蟲框架例項

之前有介紹 scrapy 的相關知識,但是沒有介紹相關例項,在這裡做個小例,供大家參考學習。 注:後續不強調python 版本,預設即為python3.x。 爬取目標 這裡簡單找一個圖片網站,獲取圖片的先關資訊。 該網站網址: http://www.58pic.com/c/ 建立專案 終端命令列執

python基礎注意

類(Class): 用來描述具有相同的屬性和方法的物件的集合。它定義了該集合中每個物件所共有的屬性和方法。物件是類的例項。 方法:類中定義的函式。 類變數:類變數在整個例項化的物件中是公用的。類變數定義在類中且在函式體之外。類變數通常不作為例項變數使用。 資料成員:類變數或者例

python基礎注意

 每個模組都有一個__name__屬性,當其值是'__main__'時,表明該模組自身在執行,否則是被引入。 說明:__name__ 與 __main__ 底下是雙下劃線, _ _ 是這樣去掉中間的那個空格。 內建的函式 dir()

python基礎注意

Python使用\事項多行語句 String[0:-1]是第一個到倒數第二個 一行顯示多條語句的話,語句之間使用分號(;)分割 if elif else Print函式預設換行,在函式裡寫end=””就不會換行了 不可變資料(3 個):Number(數字)、String(字串)、

專案經理注意事項2——敏捷開發中的頭兒

俗話說兵熊熊一個將熊熊一窩,跟對頭兒絕對是一件振奮人心的事兒。之前寫過一篇關於《專案經理注意事項》(千萬別要點)的部落格,當時所在團隊的開發模式是一般的瀑布模式開發,其實說白了就是類似於作坊式的開發,經理去和客戶談需求(我會告訴你主要是去談錢嗎?)然後拿回來一堆他(她)認為的需求就開始讓我們做了,很多時候無理

Swift開發中遇到的注意

這段時間開發專案的同時在看第三方庫Kingfisher的實現,感覺有一些東西也需要記錄和總結一下。 6. public private(set),public fileprivate(set) 這和weak一樣是變數的一種修飾,意思是該變數可以public訪

Swift開發中遇到的注意

最近的專案是使用Swift進行的開發,在開發過程中,有一些東西和OC是不太一樣的,需要特別的注意,這裡也就簡單的介紹和記錄一下。 1. 單例模式 在OC中的單例模式一般都是使用dispatch_once來實現的,可是在Swift4中,該方法已經被廢棄,也

cocosCreator注意暫時

1、一般會將場景中的所有負責影象顯示的節點都放在Canvas下面。這樣當Canvas的scale(縮放)屬性改變時,所有作為其子節點的影象也會跟著一起縮放以適應不同螢幕的大小。 2、Cocos Creator 中指令碼名稱就是元件的名稱,這個命名是大小寫敏感的!如果元件名稱

淺談服務埋2——Metrics

還是那個話題:為什麼要做服務埋點?   就像我們作業系統裡面的資源管理器一樣,如果能夠實時或者準實時的看到整個系統耗費的CPU,記憶體等資源,對我們快速對系統做出響應,以及優化很重要。同樣,對於對外提供介面或者服務的WebService的監控,比如在哪個地方,

JavaScript中的小技巧和注意

tip:自己收集的一些前端注意事項 1.函式優先 函式宣告和變數宣告都會被提升,但是一個值得注意的細節是函式會首先被提升,然後才是變數 foo();//1 var foo; function foo(){ console.log(1);

併發注意事項2併發工具優先於wait和notify

自jdk1.5以後java提供了更為高階的併發工具,他們可以完成wait和notify所能完成的工作。 在java.util.conturrent包中更高階的併發工具分成三類:Executor Framework,併發集合(Concurrent Collection)以及同

Python爬蟲---提取資料2--beautifulsoup

Beautiful Soup 是一個可以從HTML或XML檔案中提取資料的Python庫.它能夠通過你喜歡的轉換器實現慣用的文件導航,查詢,修改文件的方式.Beautiful Soup會幫你節省數小時甚至數天的工作時間. 文件地址:http://beaut

平時上機練習的注意NOIP2018

一、比賽 A考前階段 1、提前15分鐘入場,利用好這幾分鐘的時間,做好準備工作。 2、靜坐調整心態,適當的深呼吸,不要緊張、坐立不安等。 3、設定編輯器IDE:i.預設路徑 ii.視窗大小 iii.TAB寬度 iv.編譯功能 v.重啟IDE

Android中Service的使用詳解和注意LocalService

開始,先稍稍講一點android中Service的概念和用途吧~ Service分為本地服務(LocalService)和遠端服務(RemoteService): 1、本地服務依附在主程序上而不是獨立的程序,這樣在一定程度上節約了資源,另外Local服務因為是在同一程序因此

2.6 使用for迴圈檔案 2.7 使用while迴圈檔案 2.8 統計系統剩餘的記憶體 2.9 資料型別轉換計算計算mac地址 3.0 資料型別轉換列表與字典相互轉換

2.6 使用for迴圈遍歷檔案 open r:以只讀方式開啟 w: 以寫方式開啟 a: 以追加模式開啟 r+: 以讀寫模式開啟 w+: 以讀寫模式開啟(參見w) a+: 以讀寫模式開啟(參見a) rb: 以二進位制模式開啟 read 我們先寫一個檔案,叫1.txt 內容如下 111 22

《白話深度學習與Tensorflow》學習筆記2梯度下降、梯度消失、引數、歸一化

1、CUDA(compute unified device architecture)可用於平行計算: GTX1060 CUDA核心數:1280 視訊記憶體大小:6G 2、隨機梯度下降:計算偏導數需要的計算量很大,而採用隨機梯度下降(即採用取樣的概念)從中提取一部分樣