Glidedsky第二關詳細解答(結合程序池)

2021-10-19 22:35:42 字數 1457 閱讀 9860

第二關是解決1000個分頁數字加減的問題,比第一關多了乙個翻頁的步驟。

翻頁只要用到requests.get的params引數即可。不多說,直接上**:

import requests

from lxml import etree

import re

number_lists =

url=

''headers=

for i in

range(1

,1001):

params =

html=requests.get(url,headers=headers,params=params)

.content.decode(

)

cookie處依然是從瀏覽器複製,注意cookie具有時效性,如果隔幾天要再次執行需要更新cookie。

接著使用xpath定位到數字:

tree = etree.html(html)

find_num = tree.xpath(

) find_nums =

"".join(find_num)

number_list = re.findall(

'\d+'

, find_nums)

number_lists.extend(number_list)

print

('正在匯入第%s頁的資料'

%i)

匯入的過程比較漫長,所以我們可以寫乙個print來檢視到底進行到哪一步。

最後就是製作乙個計數器來得出結果:

sum=0

for number in number_lists:

number=

int(number)

#轉化為長整型才可以加減

sum=number+

sumprint(%

sum)

但是!對於1000次請求,耗費的時間非常漫長,我們可以試著使用程序池加快效率。

縱觀整個程式,發現get請求是乙個阻塞的操作,我們把它放進程式池,多個程序同時進行。

from multiprocessing.dummy import pool

i_list=

for i in

range(0

,1001):

pool = pool(6)

number_lists = pool.

map(get_num, i_list)

先把i做成可迭代物件,然後使用map函式進行程序池搭建,最後得到的number_lists是乙個巢狀列表,處理後即可使用。

關於巢狀列表的遍歷,可以檢視我寫的另一篇文章。

程序池能夠明顯縮短程式執行的時間,具體開放的個數視個人電腦的效能而定。注意慎用,過度使用程序池可能對目標伺服器造成壓力從而影響其他使用者的訪問。

黑板客爬蟲闖關第二關

這一關相比第一關反而更容易,因為不需要進行複雜的正則判斷,只需要用迴圈嘗試密碼即可。這裡需要用到requests的post請求,並在請求裡加上使用者名稱和密碼即可。coding utf 8 import requests wrongnotify 您輸入的密碼錯誤,請重新輸入 website inde...

黑板客爬蟲闖關第二關

檢視原始碼 post傳輸的內容名 username,password.根據題目要求,範圍在30之內,while 迴圈即可,沒必要雙迴圈 且passeord提示輸入的是數字,直接用i即可,不用 coding utf 8 import urllib2 import urllib import re i ...

Linux命令練習第二關(1)

解答 根據顏色區分檔案和目錄 藍色 ls l結果中以d開頭的就是目錄。通過給目錄加標識,然後通過過濾標識就過濾出目錄 ls f或ls p 通過find直接查詢指定型別的檔案 d 就是目錄 實驗資料 d開頭的是目錄 方法二 基礎正規表示式字元 表示以 開頭,如 ian,以ian開頭的那一行。過濾出以d...