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、隨機梯度下降:計算偏導數需要的計算量很大,而採用隨機梯度下降(即採用取樣的概念)從中提取一部分樣