周末乘粒,永恒君和一位B站網(wǎng)友討論交流了一下關于web scraper爬取網(wǎng)頁的問題豌注。今天來和各位分享一下,希望能給大家有幫助灯萍。
需求
1轧铁、爬取的網(wǎng)站地址:
http://wenshu.court.gov.cn/website/wenshu/181217BMTKHNT2W0/index.html?pageId=7bcf3b0574e320a487ada1f504759be4&s21=%E8%B5%94%E5%81%BF
2、需要抓取的信息
爬取文書列表內容旦棉,報告標題齿风、文號、日期绑洛、摘要等等信息救斑。
3、需要抓取多頁诊笤,比如說前10頁系谐。
分析網(wǎng)站的情況
1巾陕、抓取的頁面翻頁的時候讨跟,url是不會變的。而在頁面的源碼當中又找不到內容鄙煤,說明網(wǎng)頁是通過異步加載的晾匠。
2、打開F12梯刚,就會彈出下面的暫停提示凉馆,阻止后續(xù)的查看。沒事亡资,點擊右下角的取消斷點澜共,再運行即可。
3锥腻、點擊“network”嗦董,點擊網(wǎng)頁的第二頁,查看請求的數(shù)據(jù)瘦黑。
可以看到京革,是post請求,后面需要有一堆的參數(shù)
一般而言幸斥,通過這樣請求之后匹摇,可以獲取到真實的json文件,里面就包含了網(wǎng)頁中文書的列表當中甲葬,然而這次卻是不一樣廊勃,請求得到的居然是加密的信息,還需要通過一定方式來進行解密才行经窖。
到這里供搀,已經可以感受到網(wǎng)頁開發(fā)人員的“苦心”隅居,反爬的措施可謂是非常的多。不過葛虐,我還是在網(wǎng)上找到了一篇網(wǎng)友關于用python解決這上面問題的辦法和代碼胎源,有需要的時候可以參考一下。這里有些內容在自己的能力圈之外屿脐,就暫時不考慮了涕蚤。
https://blog.csdn.net/Since_you/article/details/100566633
web scraper爬取
用python比較復雜的話,那么就考慮用web scraper來試試的诵。
python爬取的效率當然高万栅,但是反爬的太厲害了,大部分的網(wǎng)站都會對python進行一定的限制和爬取西疤,這樣寫代碼的成本就無形增加了很多烦粒。
web scraper則不用考慮這么多,只要瀏覽器里面能看到數(shù)據(jù)代赁,就能夠進行爬取扰她。
回頭看看網(wǎng)站的情況:一是url不變,二是數(shù)據(jù)不在網(wǎng)頁源碼當中芭碍。那么就考慮“動態(tài)加載進行翻頁”的這種情況徒役,之前永恒君寫過這個教程:
傳送門在這里
主要配置如圖:
關鍵點就是"selector type"和"click selector"的配置
"selector type"(用于選擇網(wǎng)頁中的文書列表)選擇"Element click"
"click selector"(用于翻頁)這里需要注意,一般如果是直接在網(wǎng)頁點選的話窖壕,得到的css代碼是這樣的
.left_7_3?a:nth-of-type(n+2)
表示的意思就是從第二個翻頁器(上一頁為第一個忧勿,1為第二個)開始點擊,一直到最后一個瞻讽。
因為這個url有非常多的頁鸳吸,比如,如果希望只取前5頁的話速勇,可以如下更改:
.left_7_3?a:nth-of-type(-n+6)
n的取值是從0開始的晌砾。
然后再在這個選擇器下面,配置標題快集、文號贡羔、日期、摘要的選擇器个初。
最終的結構圖就是這樣的:
爬取的過程及結果就是這樣的:
這個方法相對python而言乖寒,節(jié)省的時間可不止一點點,結果基本上一致院溺。
這里把上面的web scraper的配置也分享一下:
{"_id":"caipan","startUrl":["http://wenshu.court.gov.cn/website/wenshu/181217BMTKHNT2W0/index.html?pageId=7bcf3b0574e320a487ada1f504759be4&s21=%E8%B5%94%E5%81%BF"],"selectors":[{"id":"list","type":"SelectorElementClick","parentSelectors":["_root"],"selector":"div.LM_list:nth-of-type(n+3)","multiple":true,"delay":0,"clickElementSelector":".left_7_3?a:nth-of-type(-n+4)","clickType":"clickOnce","discardInitialElements":"do-not-discard","clickElementUniquenessType":"uniqueText"},{"id":"title","type":"SelectorLink","parentSelectors":["list"],"selector":"a.caseName","multiple":false,"delay":0},{"id":"number","type":"SelectorText","parentSelectors":["list"],"selector":"span.ah","multiple":false,"regex":"","delay":0},{"id":"date","type":"SelectorText","parentSelectors":["list"],"selector":"span.cprq","multiple":false,"regex":"","delay":0},{"id":"content","type":"SelectorText","parentSelectors":["list"],"selector":"p","multiple":false,"regex":"","delay":0}]}
批量下載word文書
每個文書都提供有word下載的鏈接楣嘁,但是實現(xiàn)批量下載還是有一點困難。
1、word的下載鏈接直接在按鈕或者網(wǎng)頁源碼里面是提取不到的逐虚,是需要根據(jù)文書的url中的"docId"參數(shù)來構造的聋溜,即
http://wenshu.court.gov.cn/down/one?”?+?docID地址
例如:
爬取到的文書的詳細頁地址為:
http://wenshu.court.gov.cn/website/wenshu/181107ANFZ0BXSK4/index.html?docId=f9ffb134f0cb4a2ab832abea01298704
那么下載地址就是:
http://wenshu.court.gov.cn/down/one?docId=f9ffb134f0cb4a2ab832abea01298704
2、有了這個地址之后叭爱,原本以為可以直接用迅雷撮躁、IDM等軟件來批量下載,但是很顯然买雾,網(wǎng)站的開發(fā)人員限制了把曼。經過不同方法的驗證,發(fā)現(xiàn)目前只能是通過瀏覽器來挨個下載漓穿。(另外嗤军,可能可以通過python設置各種反爬的方法來實現(xiàn)批量下載的目的,但是工程量比較大晃危,我沒試驗成功叙赚,理論上應該是可的。)
那么就用了最笨的方法僚饭,借助python來模擬鼠標鍵盤的操作震叮,將url批量的輸入到瀏覽器當中,實現(xiàn)批量下載浪慌。
下面是單次下載的代碼冤荆,批量的話只需要讀取web scraper爬取的文件朴则,構造好url权纤,通過一個循環(huán),依次輸入下載即可乌妒。
import?time
import?pyautogui
time.sleep(1)
url_position?=?(160,?50)?#url位置
def?input_id(x,y,url):?#輸入url的動作
????pyautogui.moveTo(x,?y,?duration=0.2)??#0.25表示完成移動的時間??????????
????pyautogui.click(button='left')
????time.sleep(0.5)
????pyautogui.typewrite(url,0.01)#輸入字符汹想,0.1表示輸入每個字符間隔的時間
????time.sleep(0.5)
????pyautogui.press("enter")
url1?=?"http://wenshu.court.gov.cn/down/one?docId=694b012a59e34ae19967abeb00d512dc"
input_id(url_position[0],url_position[1],url1)
小結一下:
1、python固然強大撤蚊,但是有時用web scraper可以效率更高古掏,節(jié)省更多的時間。
2侦啸、web scraper爬取url不變槽唾、異步加載的網(wǎng)頁,關鍵是"selector type"和"click selector"的配置光涂,可以參考永恒君之前分享web scraper的教程庞萍。