摘要:隨后水友就提到了關(guān)鍵信息當(dāng)水友實(shí)際用請(qǐng)求時(shí),返回的內(nèi)容卻是代碼。所以在水友找到我的時(shí)候,我首先看下網(wǎng)站長的什么樣子,水友需要的信息是各大區(qū)的名稱。
閱讀文本大概需要 5 分鐘。
JS 都是大豬蹄子昨天讀者群有位水友發(fā)了這么一條消息,說這樣的網(wǎng)站頁面信息要如何提取 td 的內(nèi)容,聊天截圖顯現(xiàn)的頁面是在瀏覽器上看到的代碼。
那時(shí)候我剛下班,日常水下群。然后看到這條消息,心里就想這個(gè)簡單啊,寫個(gè) xpath、寫個(gè) bs4、寫個(gè)正則匹配下,輕輕松松就可以獲取到,然而事情并沒有想象中的那么簡單。
隨后水友就提到了關(guān)鍵信息:當(dāng)水友實(shí)際用 Python 請(qǐng)求時(shí),返回的內(nèi)容卻是 JS 代碼。
我明明在瀏覽器上看到的是一個(gè)個(gè)很有層次的貌美如花的小姐姐 HTML 代碼,怎么用代碼請(qǐng)求就成了晦澀難懂的大豬蹄子 JS 代碼???我要小姐姐!
一時(shí)間水友不知所措,怎么提取也提取不到自己想要的內(nèi)容。隨后群里有些水友提出要不用 bs4 試試,或者用正則匹配,各有說辭,聊的不亦悅乎。
身為爬蟲老司機(jī)的我,爬過的網(wǎng)站雖然沒有成千,但至少也快上百了,大大小小的坑基本都遇到過。當(dāng)我接到一個(gè)新的爬蟲任務(wù)時(shí),首選第一步就是分析下網(wǎng)頁數(shù)據(jù)請(qǐng)求的流程。很多時(shí)候會(huì)有很簡單的辦法就可以獲取到網(wǎng)頁的數(shù)據(jù)。
所以在水友找到我的時(shí)候,我首先看下網(wǎng)站長的什么樣子,水友需要的信息是各大區(qū)的名稱。
網(wǎng)站地址:
https://xyq.cbg.163.com/
第一眼看到這個(gè)網(wǎng)站,心里的印象是這個(gè)網(wǎng)站結(jié)構(gòu)不復(fù)雜,信息不難提取。但因?yàn)橛辛酥叭豪锵⒌匿亯|,我就懂了這個(gè)網(wǎng)頁是 JS 代碼渲染出來的。
JS 渲染網(wǎng)頁JS 渲染網(wǎng)頁是爬蟲里很常見的一種網(wǎng)頁類型,這類的網(wǎng)站有個(gè)特點(diǎn),即如果你不是帶有瀏覽器環(huán)境信息進(jìn)行請(qǐng)求,服務(wù)器是不會(huì)把正確的數(shù)據(jù)返回給你。普通的請(qǐng)求只能獲取到大豬蹄子 JS 代碼,晦澀又難懂。
針對(duì)這種情況,你想要看到小姐姐真正的盛世美顏,有兩種辦法,1 利用 selenium 自動(dòng)化框架,2 解析具體的 JS 代碼。
selenium 就像一個(gè)彪形大漢,直接模擬一個(gè)真實(shí)的瀏覽器環(huán)境,簡單粗暴的就可以獲取到真實(shí)的數(shù)據(jù),跟真正的瀏覽器發(fā)生請(qǐng)求是一樣的。但這樣的粗暴方式帶來的后果就是效率非常低下。
所以我們可以嘗試第二種方法:通過解析具體的 JS 代碼,出淤泥而不染的輕輕的看到小姐姐的容顏。
隨后我熟練的打開瀏覽器控制臺(tái),查看了下網(wǎng)頁請(qǐng)求的過程,把具體的 JS 請(qǐng)求部分找出來。大致看了下所有的 JS 文件,找到了一個(gè)名為 server_list_data.js 文件,這個(gè)文件中有個(gè) list_data 字段,非常有可能是存儲(chǔ)了一些數(shù)據(jù)。所以我點(diǎn)開這個(gè)文件進(jìn)行具體的查看。
果不其然在這個(gè)文件中看到了很多 unicode 編碼的內(nèi)容,隨后我再找了一個(gè)編碼轉(zhuǎn)換網(wǎng)站進(jìn)行驗(yàn)證。
這些 unicode 編碼正是網(wǎng)頁上顯示的內(nèi)容,接下來我們要做的就是用程序請(qǐng)求下這個(gè) JS 鏈接,解析下返回的內(nèi)容,把 unicode 碼轉(zhuǎn)換成中文即可。
程序代碼import requests import re def parse_js(): url = "https://cbg-xyq.res.netease.com/js/server_list_data.js" headers = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36"} html = requests.get(url, headers=headers) patten = re.compile(r"(.*)var server_data =(.*)", re.S) data = re.findall(patten, html.text) server_data = eval(data[0][1][:-1]) for i in server_data: for j in server_data[i]: print(j) if __name__ == "__main__": parse_js()
輸出結(jié)果:
多么美妙的小姐姐啊,呸,多么工整的數(shù)據(jù)啊。
本文首發(fā)于公眾號(hào)「癡海」,公眾號(hào)后臺(tái)回復(fù)「1024」即可獲取最新編程資源。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/44833.html
摘要:前言公司最近有一個(gè)頁面的功能,比較簡單的一個(gè)調(diào)查表功能,嵌套在我們微信公眾號(hào)里面。同時(shí)用到了微信的登錄和分享接口。參考鏈接使用微信接口前端部分我們用微信接口主要是做的登錄和分享功能,首先是上微信公眾平臺(tái)上邊看看,把權(quán)限搞好之后后端配置。 showImg(https://segmentfault.com/img/bVbrOkH); 前言: 公司最近有一個(gè)H5頁面的功能,比較簡單的一個(gè)調(diào)查...
摘要:前言公司最近有一個(gè)頁面的功能,比較簡單的一個(gè)調(diào)查表功能,嵌套在我們微信公眾號(hào)里面。同時(shí)用到了微信的登錄和分享接口。參考鏈接使用微信接口前端部分我們用微信接口主要是做的登錄和分享功能,首先是上微信公眾平臺(tái)上邊看看,把權(quán)限搞好之后后端配置。 showImg(https://segmentfault.com/img/bVbrOkH); 前言: 公司最近有一個(gè)H5頁面的功能,比較簡單的一個(gè)調(diào)查...
摘要:前言公司最近有一個(gè)頁面的功能,比較簡單的一個(gè)調(diào)查表功能,嵌套在我們微信公眾號(hào)里面。同時(shí)用到了微信的登錄和分享接口。參考鏈接使用微信接口前端部分我們用微信接口主要是做的登錄和分享功能,首先是上微信公眾平臺(tái)上邊看看,把權(quán)限搞好之后后端配置。 showImg(https://segmentfault.com/img/bVbrOkH); 前言: 公司最近有一個(gè)H5頁面的功能,比較簡單的一個(gè)調(diào)查...
showImg(https://segmentfault.com/img/remote/1460000018808058?w=900&h=500); 簡介 SEO、sitemap、搜索引擎優(yōu)化、簡單教程 在曖昧期和暗戀期時(shí)心里總是懸掛著: ta 為什么還不和我表白? ta 是不是對(duì)我沒感覺? ta 是不是只是把我當(dāng)備胎? ta 是不是對(duì)誰都這樣? 解決問題最簡單的方式就是直接 問問對(duì)方...
閱讀 2680·2021-11-25 09:43
閱讀 2594·2021-11-22 09:34
閱讀 2863·2021-11-12 10:34
閱讀 1452·2021-10-20 13:46
閱讀 2310·2019-08-30 13:21
閱讀 940·2019-08-30 11:21
閱讀 493·2019-08-30 11:20
閱讀 2199·2019-08-29 17:20