時(shí)春波 李衛(wèi)東 秦丹陽 張海嘯 吳崢嶸
摘 要:針對(duì)使用調(diào)試檢測(cè)、數(shù)據(jù)加密等技術(shù)的網(wǎng)站,解析工具Beautiful Soup難以對(duì)網(wǎng)頁進(jìn)行解析爬取數(shù)據(jù)。本研究基于Python環(huán)境,結(jié)合JavaScript逆向技術(shù)、Beautiful Soup網(wǎng)頁解析等網(wǎng)絡(luò)爬蟲技術(shù),利用中間人攻擊工具M(jìn)itmproxy(man-in-the-middle attack proxy)在本地指定設(shè)備端口開啟本地代理,攔截并修改網(wǎng)頁響應(yīng)。同時(shí),運(yùn)用Web自動(dòng)化工具Selenium來啟動(dòng)瀏覽器,設(shè)置使用代理服務(wù)器,連接到本地Mitmproxy代理,訪問被修改的響應(yīng)網(wǎng)頁進(jìn)行網(wǎng)頁調(diào)試和解析,并對(duì)加密數(shù)據(jù)進(jìn)行還原,解決網(wǎng)絡(luò)爬蟲中調(diào)試檢測(cè)和數(shù)據(jù)加密難題,從而爬取數(shù)據(jù)。
關(guān)鍵詞:網(wǎng)絡(luò)爬蟲;JavaScript逆向技術(shù);網(wǎng)絡(luò)代理;Selenium
中圖分類號(hào):TP393.092 ? ? 文獻(xiàn)標(biāo)志碼:A ? ? 文章編號(hào):1003-5168(2022)10-0020-04
DOI:10.19968/j.cnki.hnkj.1003-5168.2022.10.004
Research on Crawler Using Selenium and JavaScript Reverse
Technology in Python Environment
SHI Chunbo? ? LI Weidong? ? QIN Danyang? ? ZHANG Haixiao? ? WU Zhengrong
(College of Information Science and Engineering, Henan University of Technology, Zhengzhou 450001, China)
Abstract:For websites that use debugging detection, data encryption and other technologies,the parsing tool beautiful soup is difficult to parse web pages and crawl data Based on the python environment, combined with JavaScript reverse technology,beautiful soup web page parsing and other web crawler technologies,this study uses the man in the middle attack proxy (mitmproxy) to open the local proxy at the local designated device port,intercept and modify the web page response,and uses the web automation tool selenium to start the browser,set up the proxy server and connect to the local mitmproxy proxy.Visit the modified middle note to debug and analyze the web page,restore the encrypted data,solve the problem of debugging and data encryption in web crawler,and then crawl data.
Keywords:web crawler; JavaScript reverse technology;network agent;Selenium
0 引言
隨著網(wǎng)絡(luò)技術(shù)的迅速發(fā)展,萬維網(wǎng)成為大量信息的載體,如何有效提取并利用這些海量信息成為一個(gè)巨大挑戰(zhàn)。爬蟲技術(shù)就是在這樣背景下誕生的,其不僅在搜索引擎領(lǐng)域得到廣泛應(yīng)用,在大數(shù)據(jù)分析、商業(yè)等領(lǐng)域也得到了大規(guī)模應(yīng)用。隨著網(wǎng)絡(luò)反爬蟲技術(shù)[1]的發(fā)展,爬取數(shù)據(jù)也越來越困難。本研究針對(duì)網(wǎng)絡(luò)爬蟲中調(diào)試檢測(cè)和數(shù)據(jù)加密等反爬蟲技術(shù),使用Python爬蟲技術(shù),結(jié)合Selenium和JavaScript逆向技術(shù),加入Mitmproxy進(jìn)行網(wǎng)頁響應(yīng)攔截和修改,解決網(wǎng)絡(luò)爬蟲中調(diào)試檢測(cè)和數(shù)據(jù)加密難題,從而爬取數(shù)據(jù)。
1 相關(guān)網(wǎng)絡(luò)爬蟲技術(shù)
1.1 Python爬蟲技術(shù)
網(wǎng)絡(luò)爬蟲[2]又稱網(wǎng)絡(luò)蜘蛛、網(wǎng)絡(luò)機(jī)器人,是一種按照一定規(guī)則自動(dòng)瀏覽、檢索網(wǎng)頁信息的程序或腳本。網(wǎng)絡(luò)爬蟲能夠自動(dòng)請(qǐng)求網(wǎng)頁,并將所需要的數(shù)據(jù)抓取出來。通過對(duì)抓取到的數(shù)據(jù)進(jìn)行處理,從而提取出有價(jià)值的信息。
網(wǎng)絡(luò)爬蟲可分為三大類,分別是通用網(wǎng)絡(luò)爬蟲、聚焦網(wǎng)絡(luò)爬蟲和增量式網(wǎng)絡(luò)爬蟲。通用網(wǎng)絡(luò)爬蟲是搜索引擎的重要組成部分,須遵守Robots協(xié)議。在應(yīng)用過程中,通用網(wǎng)絡(luò)爬蟲一般會(huì)從初始UR開始,獲取初始頁面的代碼,同時(shí)會(huì)從代碼提取所需的URL,并將其放入列表中,直到其滿足停止條件;增量式網(wǎng)絡(luò)爬蟲是指對(duì)已下載網(wǎng)頁采取增量式更新方式,只爬取新產(chǎn)生或發(fā)生變化的網(wǎng)頁,能夠在一定程度上保證所爬取數(shù)據(jù)的時(shí)效性;聚焦網(wǎng)絡(luò)爬蟲是面向特定需求的一種網(wǎng)絡(luò)爬蟲程序,與通用網(wǎng)絡(luò)爬蟲技術(shù)相比,其在網(wǎng)頁抓取時(shí)會(huì)對(duì)網(wǎng)頁內(nèi)容進(jìn)行篩選和處理,盡量保證僅抓取需要的相關(guān)信息。但在應(yīng)用過程中,其程序的編寫更加復(fù)雜。聚焦網(wǎng)絡(luò)爬蟲極大地節(jié)省了硬件和網(wǎng)絡(luò)資源,能夠在海量數(shù)據(jù)中快速抓取有效數(shù)據(jù),并從有效數(shù)據(jù)中獲取用戶需要的信息,且能夠篩選和處理與主題無關(guān)的信息。由于保存的頁面數(shù)量少且更新速度快,其能夠更好地滿足特定人群對(duì)特定領(lǐng)域信息的需求。
Python是一種面向?qū)ο蟆⒔忉屝?、弱類型的腳本語言,也是一種功能強(qiáng)大且完善的通用型語言。相比于其他編程語言(如Java、C、C++等),Python的代碼非常簡(jiǎn)單,提供了許多網(wǎng)絡(luò)爬蟲模塊和庫。這些類庫包括文件I/O、GUI、網(wǎng)絡(luò)編程、數(shù)據(jù)庫訪問、文本操作等絕大部分應(yīng)用場(chǎng)景,具有很好的擴(kuò)展性。隨著大數(shù)據(jù)、人工智能技術(shù)的流行,Python的應(yīng)用領(lǐng)域?qū)⒏訌V泛。
1.2 Mitmproxy代理工具
Mitmproxy是一組工具,可為HTTP/1、HTTP/2和WebSocket提供交互式的、具有SSL/TLS功能的攔截代理。其功能包括:能夠完成攔截并動(dòng)態(tài)修改HTTP、HTTPS的請(qǐng)求和響應(yīng);保存完整的HTTP對(duì)話,并進(jìn)行轉(zhuǎn)發(fā)和分析;轉(zhuǎn)發(fā)HTTP會(huì)話客戶端;轉(zhuǎn)發(fā)以前錄制的服務(wù)器的HTTP響應(yīng);反向代理模式將流量轉(zhuǎn)發(fā)到指定服務(wù)器;使用Python對(duì)HTTP流量進(jìn)行腳本化更改等功能。
1.3 Selenium測(cè)試框架
Selenium[3]是一個(gè)開源的、可移植的Web測(cè)試框架,支持多種操作系統(tǒng)、瀏覽器和編程語言,還支持并行測(cè)試執(zhí)行,在減少時(shí)間的同時(shí)提高了測(cè)試效率。Selenium Web驅(qū)動(dòng)程序不需要安裝服務(wù)器,通過測(cè)試腳本直接與瀏覽器進(jìn)行交互。網(wǎng)絡(luò)爬蟲中使用Selenium驅(qū)動(dòng)程序是為了解決Requests無法執(zhí)行JavaScript代碼的問題[4]。通過驅(qū)動(dòng)瀏覽器自動(dòng)執(zhí)行自定義腳本,模擬人工使用瀏覽器的操作[5],如跳轉(zhuǎn)、輸入、點(diǎn)擊、下拉等,進(jìn)而獲取網(wǎng)頁渲染后的結(jié)果。
1.4 JavaScript逆向技術(shù)
當(dāng)獲取網(wǎng)頁的HTML代碼后,部分網(wǎng)站運(yùn)用調(diào)試檢測(cè)和數(shù)據(jù)加密等反爬蟲技術(shù),這些技術(shù)會(huì)阻礙下一步的網(wǎng)頁解析和運(yùn)用,此時(shí)需要運(yùn)用JavaScript逆向技術(shù)[6]來解析JavaScript代碼,解決網(wǎng)絡(luò)數(shù)據(jù)抓取時(shí)所遇到的調(diào)試檢測(cè)和數(shù)據(jù)加密等問題。
2 相關(guān)網(wǎng)絡(luò)反爬蟲技術(shù)
在相關(guān)網(wǎng)絡(luò)爬蟲技術(shù)發(fā)展的同時(shí),反爬蟲技術(shù)[7]也在不斷發(fā)展,目前反爬蟲技術(shù)主要使用以下基本策略。
2.1 User-Agent控制請(qǐng)求
User-Agent中可以攜帶用戶設(shè)備信息,包括瀏覽器、操作系統(tǒng)、CPU等信息。通過在服務(wù)器中設(shè)置user-agent白名單,確保只有符合條件的user-agent才能訪問服務(wù)器。而網(wǎng)絡(luò)爬蟲技術(shù)可以通過偽造頭部信息來訪問服務(wù)器。
2.2 IP限制
通過設(shè)置服務(wù)器訪問閾值,將短時(shí)間內(nèi)訪問量超過閾值的IP地址加入黑名單中,禁止其訪問服務(wù)器,從而達(dá)到反爬蟲的目的。網(wǎng)絡(luò)爬蟲能夠利用IP代理來更換IP,從而能夠繼續(xù)訪問服務(wù)器。
2.3 Session訪問限制
Session是用戶請(qǐng)求服務(wù)器的憑證,在服務(wù)器端根據(jù)短時(shí)間內(nèi)的訪問量來判斷是否為網(wǎng)絡(luò)爬蟲,將疑似網(wǎng)絡(luò)爬蟲的Session禁用。通過網(wǎng)絡(luò)爬蟲技術(shù)可以注冊(cè)多個(gè)賬號(hào),使用多個(gè)Session輪流對(duì)服務(wù)器進(jìn)行訪問,避免Session被禁用。
2.4 驗(yàn)證碼
在用戶登錄或訪問某些重要信息時(shí),可以使用圖片驗(yàn)證碼、短信驗(yàn)證碼、數(shù)值計(jì)算驗(yàn)證碼、滑動(dòng)驗(yàn)證碼、圖案標(biāo)記驗(yàn)證碼等檢測(cè)用戶的狀態(tài)。該方法能夠有效阻擋網(wǎng)絡(luò)爬蟲,區(qū)分程序和正常用戶,使正常用戶可以正常訪問服務(wù)器,而網(wǎng)絡(luò)爬蟲因無法識(shí)別驗(yàn)證碼,使其不能訪問服務(wù)器。
2.5 動(dòng)態(tài)加載數(shù)據(jù)
通過JavaScript技術(shù)動(dòng)態(tài)加載數(shù)據(jù),網(wǎng)絡(luò)爬蟲在靜態(tài)頁面中無法獲得數(shù)據(jù)。網(wǎng)絡(luò)爬蟲技術(shù)能夠通過抓包的形式獲取URL,模擬請(qǐng)求。
2.6 數(shù)據(jù)加密
在前端請(qǐng)求服務(wù)器前,將相關(guān)參數(shù)進(jìn)行加密,使用加密后的參數(shù)請(qǐng)求服務(wù)器,在服務(wù)器端進(jìn)行相關(guān)解碼操作,而網(wǎng)絡(luò)爬蟲無法進(jìn)行模擬請(qǐng)求服務(wù)器。由于加密算法是寫在JavaScript代碼中,網(wǎng)絡(luò)爬蟲能夠找到并破解。
3 Python環(huán)境下Selenium與JavaScript逆向爬蟲技術(shù)的應(yīng)用
使用Mitmproxy開啟本地代理,進(jìn)行網(wǎng)頁響應(yīng)攔截。首先,創(chuàng)建addons.py文件。使用mitmweb-s addons.py命令啟動(dòng)Mitmproxy并加載自定義腳本addons.py,修改網(wǎng)頁響應(yīng),繞過網(wǎng)站檢測(cè)(見圖1)。定義腳本文件代碼如下所示。
def response(slef,flow:mitmproxy.http.HTTPFlo-w):
if 'www.aqistudy.cn' in flow.request.url:
flow.response.text=flow.response.text.replace("window.navigator.webdriver", "false")
flow.response.text=flow.response.text.replace("debugger","")
其次,設(shè)置Firefox瀏覽器驅(qū)動(dòng)器的環(huán)境:Firefox_options=webdriver.FirefoxOptions()。設(shè)置瀏覽器Firefoxd代理方式為使用本地代理,其代碼如下所示。
proxy_ip=“本地ip”
# 設(shè)置瀏覽器代理端口
ff_profile.set_preference("network.proxy.type",1)
ff_profile.set_preference("network.proxy.http",p-roxy_ip)
ff_profile.set_preference("network.proxy.http_p-ort",int(8080))
ff_profile.set_preference("network.proxy.ssl",p-roxy_ip)
ff_profile.set_preference("network.proxy.ssl_po-rt",int(8080))
ff_profile.set_preference("network.proxy.ftp",pr-oxy_ip)
ff_profile.set_preference("network.proxy.ftp_p-ort",int(8080))
最后,創(chuàng)建Firefox瀏覽器驅(qū)動(dòng)器啟動(dòng)Firefox[8](見圖2)。相關(guān)代碼如下所示。
browser=webdriver.Firefox(options=ff_profile)
4 以某環(huán)境質(zhì)量監(jiān)測(cè)網(wǎng)站進(jìn)行技術(shù)方法測(cè)試
針對(duì)某環(huán)境質(zhì)量監(jiān)測(cè)網(wǎng)站,首先使用逆向爬蟲技術(shù)解決該網(wǎng)站爬蟲調(diào)試中檢測(cè)和數(shù)據(jù)加密難題,然后使用網(wǎng)站解析工具BeautifulSoup對(duì)網(wǎng)頁結(jié)構(gòu)和屬性等進(jìn)行網(wǎng)頁解析[9]。圖3為該網(wǎng)站空氣質(zhì)量歷史數(shù)據(jù),根據(jù)其詳細(xì)信息頁面的<table>標(biāo)簽,通過select()獲取<table>整個(gè)標(biāo)簽內(nèi)容,調(diào)用函數(shù)Workbook()抽取所需要數(shù)據(jù)保存至Excel表[10-11](見表1)。
5 結(jié)語
本研究以某空氣質(zhì)量監(jiān)測(cè)反爬蟲分析平臺(tái)為例,基于Python環(huán)境,利用Selenium、JavaScript逆向爬取數(shù)據(jù)技術(shù),與中間人攻擊工具M(jìn)itmproxy開啟本地代理相結(jié)合,解決了網(wǎng)頁無法進(jìn)行調(diào)試的問題,從而突破網(wǎng)站的反爬蟲技術(shù)爬取到相關(guān)空氣質(zhì)量監(jiān)測(cè)數(shù)據(jù)。該方法能夠有針對(duì)性地分析并找到目標(biāo)網(wǎng)站反爬蟲技術(shù)漏洞進(jìn)行數(shù)據(jù)爬取,從而保證網(wǎng)絡(luò)爬蟲數(shù)據(jù)抓取的順利進(jìn)行。
參考文獻(xiàn):
[1] 周毅,寧亮,王鷗,等.基于Python的網(wǎng)絡(luò)爬蟲和反爬蟲技術(shù)研究[J].現(xiàn)代信息科技,2021(21):149-151.
[2] 張俊威,肖瀟.基于Python爬蟲技術(shù)的網(wǎng)頁數(shù)據(jù)抓取與分析研究[J].信息系統(tǒng)工程,2021(2):155-156.
[3] 忽愛平,范伊紅,李陽,等.基于Selenium的網(wǎng)絡(luò)爬蟲的設(shè)計(jì)與實(shí)現(xiàn)[J].無線互聯(lián)科技,2021(17):39-40.
[4] 李晨昊.基于BeautifulSoup+requests和selenium爬蟲網(wǎng)頁自動(dòng)化處理的實(shí)現(xiàn)和性能對(duì)比[J].現(xiàn)代信息科技,2021(16):10-12,18.
[5] 許景賢,林錦程,程雨萌.Selenium框架的反爬蟲程序設(shè)計(jì)與實(shí)現(xiàn)[J].福建電腦,2021(1):26-29.
[6] 王朝陽,范伊紅,李夢(mèng)丹,等.Python環(huán)境下的JavaScript逆向技術(shù)分析[J].無線互聯(lián)科技,2021(17):97-98.
[7] 張寶剛.基于Python的網(wǎng)絡(luò)爬蟲與反爬蟲技術(shù)的研究[J].電子世界,2021(4):86-87.
[8] 沈熠輝.以Selenium為核心的亞馬遜爬蟲與可視化[J].福建電腦,2021(12):43-46.
[9] 樊濤,趙征,劉敏娟.基于Selenium的網(wǎng)絡(luò)爬蟲分析與實(shí)現(xiàn)[J].電腦編程技巧與維護(hù),2019(9):155-156,170.
[10] 李曉宇,徐勇,汪倩,等.基于Selenium的淘寶商品評(píng)論爬蟲算法[J].信息與電腦(理論版),2020(12):62-64.
[11] 龍學(xué)磊,田萌,徐英,等.網(wǎng)絡(luò)爬蟲在科技文獻(xiàn)檢索中的應(yīng)用[J].現(xiàn)代信息科技,2021(24):150-152.