第三步,利用上面所提到的用戶代理池進行爬取。首先建立用戶代理池,從用戶代理池中隨機選擇一項,設置UA。
import urllib.request import re import random #用戶代理池 uapools=[ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36 Edge/14.14393", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.22 Safari/537.36 SE 2.X MetaSr 1.0", "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Maxthon 2.0)", ] def UA(): opener=urllib.request.build_opener() thisua=random.choice(uapools) ua=("User-Agent",thisua) opener.addheaders=[ua] urllib.request.install_opener(opener) print("當前使用UA:"+str(thisua)) #for循環,爬取第1頁到第36頁的段子內容 for i in range(0,35): UA() #構造不同頁碼對應網址 thisurl="http://www.qiushibaike.com/8hr/page/"+str(i+1)+"/" data=urllib.request.urlopen(thisurl).read().decode("utf-8","ignore") #利用提取段子內容 pat=".*?(.*?).*?" rst=re.compile(pat,re.S).findall(data) for j in range(0,len(rst)): print(rst[j]) print("-------")還可以定時的爬取:
Import time #然后在后面調用time.sleep()方法換言之,學習爬蟲需要靈活變通的思想,針對不同的情況,不同的約束而靈活運用。
三、抓包分析抓包分析可以將網頁中的訪問細節信息取出。有時會發現直接爬網頁時是無法獲取到目標數據的,因為這些數據做了隱藏,此時可以使用抓包分析的手段進行分析,并獲取隱藏數據。
1)Fiddler簡介
抓包分析可以直接使用瀏覽器F12進行,也可以使用一些抓包工具進行,這里推薦Fiddler。Fiddler下載安裝。假設給Fiddler配合的是火狐瀏覽器,打開瀏覽器,如下圖,找到連接設置,選擇手動代理設置并確定。假設打開百度,如下圖,加載的數據包信息就會在Fiddler中左側列表中列出來,那么網站中隱藏相關的數據可以從加載的數據包中找到。
2)第二項練習-騰訊視頻評論爬蟲實戰
目標網站:https://v.qq.com/
需要獲取的數據:某部電影的評論數據,實現自動加載。首先可以發現騰訊視頻中某個視頻的評論,在下面的圖片中,如果點擊”查看更多評論”,網頁地址并無變化,與上面提到的糗事百科中的頁碼變化不同。而且通過查看源代碼,只能看到部分評論。即評論信息是動態加載的,那么該如何爬取多頁的評論數據信息?
第一步,分析騰訊視頻評論網址變化規律。點擊”查看更多評論”,同時打開Fiddler,第一條信息的TextView中,TextView中可以看到對應的content內容是unicode編碼,剛好對應的是某條評論的內容。
解碼出來可以看到對應評論內容。
將第一條信息的網址復制出來進行分析,觀察其中的規律。下圖是兩個緊連著的不同評論的url地址,如下圖,可以發現只有cursor字段發生變化,只要得到cursor,那么評論的地址就可以輕松獲得。如何找到cursor值?
第二步,查找網址中變化的cursor字段值。從上面的第一條評論信息里尋找,發現恰好在last字段值與后一條評論的cursor值相同。即表示cursor的值是迭代方式生成的,每條評論的cursor信息在其上一條評論的數據包中尋找即可。
第三步,完整代碼
a.騰訊視頻評論爬蟲:獲取”深度解讀”評論內容(單頁評論爬蟲)#單頁評論爬蟲 import urllib.request import re #https://video.coral.qq.com/filmreviewr/c/upcomment/[視頻id]?commentid=[評論id]&reqnum=[每次提取的評論的個數] #視頻id vid="j6cgzhtkuonf6te" #評論id cid="6233603654052033588" num="20" #構造當前評論網址 url="https://video.coral.qq.com/filmreviewr/c/upcomment/"+vid+"?commentid="+cid+"&reqnum="+num headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.22 Safari/537.36 SE 2.X MetaSr 1.0", "Content-Type":"application/javascript", } opener=urllib.request.build_opener() headall=[] for key,value in headers.items(): item=(key,value) headall.append(item) opener.addheaders=headall urllib.request.install_opener(opener) #爬取當前評論頁面 data=urllib.request.urlopen(url).read().decode("utf-8") titlepat=""title":"(.*?)"" commentpat=""content":"(.*?)"" titleall=re.compile(titlepat,re.S).findall(data) commentall=re.compile(commentpat,re.S).findall(data) for i in range(0,len(titleall)): try: print("評論標題是:"+eval("u""+titleall[i]+""")) print("評論內容是:"+eval("u""+commentall[i]+""")) print("------") except Exception as err: print(err)b.騰訊視頻評論爬蟲:獲取”深度解讀”評論內容(自動切換下一頁評論的爬蟲)
#自動切換下一頁評論的爬蟲 import urllib.request import re #https://video.coral.qq.com/filmreviewr/c/upcomment/[視頻id]?commentid=[評論id]&reqnum=[每次提取的評論的個數] vid="j6cgzhtkuonf6te" cid="6233603654052033588" num="3" headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.22 Safari/537.36 SE 2.X MetaSr 1.0", "Content-Type":"application/javascript", } opener=urllib.request.build_opener() headall=[] for key,value in headers.items(): item=(key,value) headall.append(item) opener.addheaders=headall urllib.request.install_opener(opener) #for循環,多個頁面切換 for j in range(0,100): #爬取當前評論頁面 print("第"+str(j)+"頁") #構造當前評論網址thisurl="https://video.coral.qq.com/filmreviewr/c/upcomment/"+vid+"?commentid="+cid+ "&reqnum="+num data=urllib.request.urlopen(thisurl).read().decode("utf-8") titlepat=""title":"(.*?)","abstract":"" commentpat=""content":"(.*?)"" titleall=re.compile(titlepat,re.S).findall(data) commentall=re.compile(commentpat,re.S).findall(data) lastpat=""last":"(.*?)"" #獲取last值,賦值給cid,進行評論id切換 cid=re.compile(lastpat,re.S).findall(data)[0] for i in range(0,len(titleall)): try: print("評論標題是:"+eval("u""+titleall[i]+""")) print("評論內容是:"+eval("u""+commentall[i]+""")) print("------") except Exception as err: print(err)四、挑戰案例1)第三項練習-中國裁判文書網爬蟲實戰
目標網站:http://wenshu.court.gov.cn/
需要獲取的數據:2018年上海市的刑事案件接下來進入實戰講解。第一步,觀察換頁之后的網頁地址變化規律。打開中國裁判文書網2018年上海市刑事案件的第一頁,在換頁時,如下圖中的地址,發現網址是完全不變的,這種情況就是屬于隱藏,使用抓包分析進行爬取。
第二步,查找變化字段。從Fiddler中可以找到,獲取某頁的文書數據的地址:http://wenshu.court.gov.cn/Li...
可以發現沒有對應的網頁變換,意味著中國裁判文書網換頁是通過POST進行請求,對應的變化數據不顯示在網址中。通過F12查看網頁代碼,再換頁操作之后,如下圖,查看ListContent,其中有幾個字段需要了解:
Param:檢索條件
Index:頁碼
Page:每頁展示案件數量
...
重要的是最后三個字段(vl5x,number,guid)該如何獲取?首先,guid即uuid,叫全球唯一標識,是利用python中的uuid隨機生成的字段。其次是number字段,找到ListContent上面的GetCode請求,恰好其Response中包含了number字段的值。而GetCode又是通過POST請求的,發現請求的字段只要guid這一項,那么問題便迎刃而解。
最后,難點在于vl5x字段如何獲取?打開Fiddler,在換頁操作后,查看ListContent中的vl5x的值,并在此次ListContent之前出現的數據包中的TextView里尋找這個字段或值,一般的網站可以很容易找到,但中國裁判文書網是政府網站,反爬策略非常高明,尋找的過程需要極高的耐心。
事實上,中國裁判文書網的vl5x字段可以從某個js包中獲得,獲取的方式是通過getKey()函數。從網頁源代碼中找到getKey()函數的js代碼,由于代碼是packed狀態,用unpacked工具, 將其進行解碼,后利用js界面美觀工具可以方便理解。
但無關緊要,只需直接將getKey()函數s代碼復制到unpack_js.html中,就可以解出vl5x字段的值,其中需要用到Cookie中的vjkl5字段值。需要注意提前下載好base64.js和md5.js,并在unpack_js.html加載。第三步,以下是中國裁判文書網爬蟲完整代碼:
import urllib.request import re import http.cookiejar import execjs import uuid #隨機生成guid guid=uuid.uuid4() print("guid:"+str(guid)) fh=open("./base64.js","r") js1=fh.read() fh.close() fh=open("./md5.js","r") js2=fh.read() fh.close() fh=open("./getkey.js","r") js3=fh.read() fh.close() #將完整js代碼都加載進來 js_all=js1+js2+js3 #在生成的CookieJar添加到opner中 cjar=http.cookiejar.CookieJar() opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cjar)) #Referer常用于反爬,指來源網址 opener.addheaders=[("Referer","http://wenshu.court.gov.cn/list/list/?sorttype=1&conditions=searchWord+1+AJLX++%E6%A1%88%E4%BB%B6%E7%B1%BB%E5%9E%8B:%E5%88%91%E4%BA%8B%E6%A1%88%E4%BB%B6&conditions=searchWord+2018+++%E8%A3%81%E5%88%A4%E5%B9%B4%E4%BB%BD:2018&conditions=searchWord+%E4%B8%8A%E6%B5%B7%E5%B8%82+++%E6%B3%95%E9%99%A2%E5%9C%B0%E5%9F%9F:%E4%B8%8A%E6%B5%B7%E5%B8%82")] urllib.request.install_opener(opener) #用戶代理池 import random uapools=[ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36 Edge/14.14393", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.22 Safari/537.36 SE 2.X MetaSr 1.0", "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Maxthon 2.0)", ] #訪問首頁 urllib.request.urlopen("http://wenshu.court.gov.cn/list/list/?sorttype=1&conditions=searchWord+1+AJLX++%E6%A1%88%E4%BB%B6%E7%B1%BB%E5%9E%8B:%E5%88%91%E4%BA%8B%E6%A1%88%E4%BB%B6&conditions=searchWord+2018+++%E8%A3%81%E5%88%A4%E5%B9%B4%E4%BB%BD:2018&conditions=searchWord+%E4%B8%8A%E6%B5%B7%E5%B8%82+++%E6%B3%95%E9%99%A2%E5%9C%B0%E5%9F%9F:%E4%B8%8A%E6%B5%B7%E5%B8%82").read().decode("utf-8","ignore") #將Cookie中的vjkl5字段提取出來 pat="vjkl5=(.*?)s" vjkl5=re.compile(pat,re.S).findall(str(cjar)) if(len(vjkl5)>0): vjkl5=vjkl5[0] else: vjkl5=0 print("vjkl5:"+str(vjkl5)) #將js代碼中的舊Cookie的值替換為新的vjkl5的值 js_all=js_all.replace("ce7c8849dffea151c0179187f85efc9751115a7b",str(vjkl5)) #使用python執行js代碼,請提前安裝好對應模塊(在命令行中執行pip install pyexejs) compile_js=execjs.compile(js_all) #獲得vl5x字段值 vl5x=compile_js.call("getKey") print("vl5x:"+str(vl5x)) url="http://wenshu.court.gov.cn/List/ListContent" #for循環,切換第1頁到10頁 for i in range(0,10): try: #從GetCode中獲取number字段值 codeurl="http://wenshu.court.gov.cn/ValiCode/GetCode" #上面提到,GetCode中,只要guid一個字段,將其獲取到 codedata=urllib.parse.urlencode({ "guid":guid, }).encode("utf-8") codereq = urllib.request.Request(codeurl,codedata) codereq.add_header("User-Agent",random.choice(uapools)) codedata=urllib.request.urlopen(codereq).read().decode("utf-8","ignore") #print(codedata) #構造請求的參數 postdata =urllib.parse.urlencode({ "Param":"案件類型:刑事案件,裁判年份:2018,法院地域:上海市", "Index":str(i+1), "Page":"20", "Order":"法院層級", "Direction":"asc", "number":str(codedata), "guid":guid, "vl5x":vl5x, }).encode("utf-8") #直接發送POST請求 req = urllib.request.Request(url,postdata) req.add_header("User-Agent",random.choice(uapools)) #獲得ListContent中的文書ID值 data=urllib.request.urlopen(req).read().decode("utf-8","ignore") pat="文書ID.*?".*?"(.*?)."" allid=re.compile(pat).findall(data) print(allid) except Exception as err: print(err)如此便可批量獲取中國裁判文書網中的案件信息。友情提示,如果頻繁爬取該網站,需擴充用戶代理池。
五、推薦內容1)常見反爬策略與反爬攻克手段介紹
數據的隱藏可以算是一種反爬策略之一,抓包分析是該反爬策略常見的反爬攻克手段。
當然,反爬還有很多手段,比如通過IP限制、UA限制、驗證碼限制...等等.
2)如何深入學習Python網絡爬蟲(深入學習路線介紹)
通過上述的介紹,相信對網絡爬蟲已經有了基礎的了解,以及能夠寫出一些簡單的爬蟲項目。
以下項目可以提供練習:
淘寶商品圖片爬蟲項目
淘寶商品爬蟲項目
…
3)關于Python爬蟲,推薦書籍
《Python程序設計基礎實戰教程》 . 清華大學出版社.2018年
《精通Python網絡爬蟲》.機械工業出版社.2017年4月閱讀原文
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/41513.html
相關文章
-
精通Python網絡爬蟲(0):網絡爬蟲學習路線
摘要:以上是如果你想精通網絡爬蟲的學習研究路線,按照這些步驟學習下去,可以讓你的爬蟲技術得到非常大的提升。 作者:韋瑋 轉載請注明出處 隨著大數據時代的到來,人們對數據資源的需求越來越多,而爬蟲是一種很好的自動采集數據的手段。 那么,如何才能精通Python網絡爬蟲呢?學習Python網絡爬蟲的路線應該如何進行呢?在此為大家具體進行介紹。 1、選擇一款合適的編程語言 事實上,Python、P...
-
Python爬蟲學習路線
摘要:以下這些項目,你拿來學習學習練練手。當你每個步驟都能做到很優秀的時候,你應該考慮如何組合這四個步驟,使你的爬蟲達到效率最高,也就是所謂的爬蟲策略問題,爬蟲策略學習不是一朝一夕的事情,建議多看看一些比較優秀的爬蟲的設計方案,比如說。 (一)如何學習Python 學習Python大致可以分為以下幾個階段: 1.剛上手的時候肯定是先過一遍Python最基本的知識,比如說:變量、數據結構、語法...
-
我的 Python 高效學習法
摘要:我最開始學習編程的時候也是如此,摸索了非常久的時間,才慢慢找到自己高效學習方法。被動的學習方式聽講閱讀視聽演示,只能讓你做到內容留存率的和的知識。而主動的學習方式,如通過討論實踐教授給他人,會將原來被動學習的內容留存率從提升到和。 showImg(https://segmentfault.com/img/remote/1460000016856679); 閱讀文本大概需要 7 分鐘。 ...
-
爬蟲 - 收藏集 - 掘金
摘要:在這之前,還是有必要對一些概念超輕量級反爬蟲方案后端掘金前言爬蟲和反爬蟲日益成為每家公司的標配系統。 爬蟲修煉之道——從網頁中提取結構化數據并保存(以爬取糗百文本板塊所有糗事為例) - 后端 - 掘金歡迎大家關注我的專題:爬蟲修煉之道 上篇 爬蟲修煉之道——編寫一個爬取多頁面的網絡爬蟲主要講解了如何使用python編寫一個可以下載多頁面的爬蟲,如何將相對URL轉為絕對URL,如何限速,...