python3網路爬蟲開發實戰_Python3 爬蟲實戰

weixin_39519798發表於2022-01-24

背景

62a87b4224ee746cedaa4eb1fdc0cf12.png
b7a9a5bef500c9819d03ad43bbe36dfd.png

媳婦說考試這個題庫不方便作弊無法查詢,需要把題庫全部弄下來,然後可檢索。。

過程

想辦法檢視網頁原始碼

66cb540670ce9ade2122cf56ea92ade5.png

PC微信很快就開啟了網頁。思考如此,直接谷歌瀏覽器開啟網頁即可··然後在瀏覽器直接檢視網頁原始碼,看network。。

1a400ca663959723a420c4097ff63cde.png

現實狠狠的打了一記耳光。

無奈只能抓包。。

WireShark的邂逅

網上查詢抓包軟體,大名鼎鼎的WireShark 映入眼簾,下載安裝WireShark,過程很順利。激動萬分開啟WireShark,複雜的介面,操作不知所措。。

6af92e30c653380a14a9ff6f95726ddd.png

這麼多網路連線,不知所措,大膽猜測,估計是得挑個我上網的網路卡名稱。一陣猛烈猜測過後盡然每個網路卡上都有資料

6292dc3eca023cde5b48d8e25606840a.png

點了個WLAN,只有這個是物理無限網路卡連線著的,應該不會錯。。

點選進入後:

1ae6f29ecfa4907627083970a069575d.png

不停的刷,這個似乎無法分析問題,得去檢視如何寫過濾器,本次要過濾的是http協議。經過百度,查到一篇http協議寶典https://blog.csdn.net/zzy0609/article/details/95455136

88d60dcf421e19b9f93ced1e3768f8c2.png
88d60dcf421e19b9f93ced1e3768f8c2.png

瞬間少了很多無用的資料包。。。然後再次從微信瀏覽器裡面發起,請求,精準得到ip地址,然後再在過濾器上加入伺服器ip。

41d77ab928dda30e8360dd62015436a9.png

很精準的得到過濾請求。經過此過濾,竟然只能看到http的 reques 無法看到response,這WireShark著實頭大啊,再次求助度娘。。

https://blog.csdn.net/boling_cavalry/article/details/82925463

縱觀抓包PostMan驗證分析結論

很好,此類微信公眾號中的頁面,基本都已捨棄jsp,前後分離了,兩個介面歷歷在目,直接過濾在了Wire Shark上。 一個目錄介面,顯示目錄和章節,還有個題目詳情介面。

返回格式如下:

cc759fca956325c3e5ab3e4f8649f2c9.png
3e02908000f5c73ccfcf07a5cd26df47.png

介面1:

http://www.y1da.com/v2/edu/chapterlist?uopid=ox705w3ahlEKvMXNq0w8qaZgb_BU&start=0&limit=150&ebid=401&token=eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiI1MDMxMzMzMDA2NTAwODY0In0.hnKUbEs6Zp_etp6dbTSJp5HPHAlOq7gCOLKcekm65MfMA5fI_WTTlYRdOq0nf2xypyCGUA4T38zE8tIkfggEPQ

驗證估計在url上,不需要加任何http頭,直接可訪問。

介面2:

http://www.y1da.com/publicApi/edu/getQuestion?partNo=000079001001&pageSize=0&questionNo=000079001001000005

url引數上很容易看到同第一個列表上返回回來的引數溫和,partNo為章節,questionNo為遞增題目編號,但是看著似乎有點眉目,凡是還需要驗證,同時為程式碼做準備。

下一步 postman驗證 如何構造介面2請求。

WireShark中把所有請求頭都貼到請求頭中去。

54d207550f063f13dcd4767fcd5f2aa5.png

如此一大串,全部貼入postman中測試

55570f6784e768a72d2059e58e42f9a4.png

當全加上的時候,竟然請求不到資料,然後嘗試去掉部分,當把cookie去掉的時候,直接能夠返回資料了,然後開始減少到最少,最終留下Authorization,Host。

經過幾次測試發現構造第二個請求以下規律

http://www.y1da.com/publicApi/edu/getQuestion?partNo=000079001001&pageSize=0&questionNo=

第一次questionNo不給值,返回第一條,然後再返回的結果中,直接採用nextQuestionNo,總數為第一個介面裡面返回的total。至此完事具備,只待碼程式碼。

思考採用何種語言

日常開發過程中,採用了最多的為C++,JS,這兩種語言,C++雖然所有工具類都具備,總覺得用來抓包遭嫌棄,寫的雖然很快,但是到除錯的時候,可能讓我崩潰。 JS,這個語言要寫,還得要用nodejs,還要加檔案模組,還要弄代理服務解決跨域問題,麻煩。。 然後剩下C#,Java,這語言雖然好,便捷方便,但是也覺得還是得編譯執行。想到了Python了,這個曾經曾經曾經看過,寫過點例子的語言,現在都不知道發展到python幾版本了,但是這個確實用來寫爬蟲的最快語言,沒得挑了。。

隨便找個python3版本,安裝配好環境變數,開啟vscode,直接擼··

第一步求助度娘,找到python3 http client 示例

3332884e1ec882cf59d72924184360d5.png

https://blog.csdn.net/sinat_29173167/article/details/80891129

直接拷貝成我的fuck.py檔案,新增一個testFuck方法修改拷貝getDemo方法。

按照示例,直接敲入http頭,以及第一個請求地址。

網路請求返回編碼問題

a37a53a4f6883d323c5b10ec4d6091ec.png

額,遇到了第一個問題,這個不是gbk估計就是utf-8了,也沒啥好問度孃的,直接嘗試修改為utf-8。果不其然,成功列印了。

Json字串python物件問題

首戰告捷,下一步,解析返回內容,現在轉成了字串,需要把字串轉成python3中字典物件,百度python中採用什麼方法轉換字典

https://www.cnblogs.com/fuyuteng/p/12060768.html

2d3ca3d2ea0992697289dfa2d1ce4a90.png

eval,嘗試下

e21016a3dc9f9c4e62899abd2dba2b5e.png

額,無盡的思考,難道python的字典沒有true和false··· 對於python著實不熟悉,發起靈魂拷問,難道python中json和字典不是一回事?直接百度 python3 json false 關鍵字,得到以下文章:

https://blog.csdn.net/kongsuhongbaby/article/details/84729547

經過幾秒瀏覽,習得json.loads 大法

db4b89659eaed2f60b87f25aaa6f1e26.png

立馬嘗試修改程式碼:

f45d96fc17d87cc499f29fd08d11f722.png

成功輸出。。

python3 基本語法學習

陣列遍歷寫法, 簡單的for(int i=0;i<10;i++) python中寫法。。

https://blog.csdn.net/weixin_40943549/article/details/82949393

請求返回異常問題考慮

Python try catch 異常模組,由於當前採用的為我微信的認證,所以訪問到第六個問題的時候,直接回返回code 4010,讓後購買章節。所以遇到此類異常,需要跳出訪問。 異常模組經過度娘習得:

https://www.cnblogs.com/Lival/p/6203111.html

689568f286d957cffd5796d567859060.png

請求報錯遠端伺服器主動關閉連線

經過多次請求後,返回遠端伺服器主動關閉錯誤,經過思考,http為短連結,conn = http.client.HTTPConnection("www.y1da.com", timeout=10)後一直使用 conn,http頭中,未加入keep-alive 標識,修改程式碼。

6be117a367f01bcb4aa7a75bd43a322f.png

執行,成功讀到五個問題,返回告訴我需要購買章節,異常捕獲。

PC微信重新登陸媳婦微信

登陸媳婦微信,重新抓包,檢視授權字串。發現坑爹驚天微信大bug,我登入我媳婦微信後,還是無法檢視其他章節,發現授權碼還是我之前的,這是什麼逆天bug。無奈,百般重試,依舊如此。然後查詢微信任何刪除快取,清空快取的功能,未果。。最終無奈,解除安裝重灌,搞定。。

最後寫入檔案

查詢python3寫檔案方法。

https://www.cnblogs.com/yunlong-study/p/9592926.html

修改程式碼如下:

0b3cb0159f734eb087eb621c26492bd8.png

暗中竊喜,大功告成,執行。帥不過十秒···

35e423331c5643965403e8149f3453cb.png

這個錯誤,乍一看還是和編碼相關,思考半天,最後就新增了檔案寫入,檔案寫入採用windows預設編碼,windows預設編碼為gbk,似乎這邊沒錯,這錯誤好像是gbk特殊字元無法編碼,我瞅瞅是什麼特殊字元,似乎就是這個Fe²⁺ 搗鬼。那檔案開啟理論上是應該能指定編碼,換成萬能utf-8應該就沒問題。繼續度娘,關鍵字,python3 寫檔案 指定編碼,

https://www.cnblogs.com/lmygbl/p/10121909.html,修改程式碼。

e49b283d37795b6e4a25b14752b51115.png

至此檔案成功輸出···

成果

37adc68a6b4f3bf68a2d299d6924610a.png
cedf43e1c40dd79414c3642c60f0c602.png

相關文章