不會代碼的你也能一鍵批量采集數(shù)據(jù)
背景描述
最近需要收集百度搜索查詢結(jié)果,可是使用的時候,發(fā)現(xiàn)之前的python腳本程序失效了。
這使我無法批量采集所需的關(guān)鍵詞數(shù)據(jù)。
問題描述
啟動python腳本程序后,獲取的數(shù)據(jù)一直是空值。
request請求結(jié)果返回的html頁面是百度安全驗(yàn)證頁面。
問題演示
搜索了一下,知道這是百度設(shè)置的反爬機(jī)制。
如果請求被檢測判定為非人類,則會返回此頁面。

<html?lang="zh-CN">
??<head>
????<meta?charset="utf-8">
????<title>百度安全驗(yàn)證</title>
????<meta?http-equiv="Content-Type"?content="text/html;?charset=utf-8">
????<meta?name="apple-mobile-web-app-capable"?content="yes">
????<meta?name="apple-mobile-web-app-status-bar-style"?content="black">
????<meta?name="viewport"?content="width=device-width,?user-scalable=no,?initial-scale=1.0,?minimum-scale=1.0,?maximum-scale=1.0">
????<meta?name="format-detection"?content="telephone=no,?email=no">
????<link?rel="shortcut?icon"?href="https://www.baidu.com/favicon.ico"?type="image/x-icon">
????<link?rel="icon"?sizes="any"?mask?href="https://www.baidu.com/img/baidu.svg">
????<meta?http-equiv="X-UA-Compatible"?content="IE=Edge">
????<meta?http-equiv="Content-Security-Policy"?content="upgrade-insecure-requests">
????<link?rel="stylesheet"?href="https://ppui-static-wap.cdn.bcebos.com/static/touch/css/api/mkdjump_aac6df1.css"?/>
??</head>
??<body>
????<div?class="timeout?hide-callback">
??????<div?class="timeout-img"></div>
??????<div?class="timeout-title">網(wǎng)絡(luò)不給力,請稍后重試</div>
??????<button?type="button"?class="timeout-button">返回首頁</button>
????</div>
????<div?class="timeout-feedback?hide-callback">
??????<div?class="timeout-feedback-icon"></div>
??????<p?class="timeout-feedback-title">問題反饋</p>
????</div>
????<script?src="https://ppui-static-wap.cdn.bcebos.com/static/touch/js/mkdjump_v2_2d634b8.js"></script>
??</body>
</html>
我的思考
為了能夠解決這個問題。
首先我猜想可能是請求頭headers
的數(shù)據(jù)過期了。
我通過瀏覽器F12
,拿到最新的cookie
,在代碼中替換了cookie
。
初次嘗試
嘗試執(zhí)行代碼,結(jié)果失敗。依舊是百度安全驗(yàn)證頁面。
再次思考
我二次猜想,把瀏覽器中成功獲取搜索結(jié)果的url
,替換成我在代碼中發(fā)起的請求url
。
當(dāng)然,此時的cookie
也是當(dāng)前頁面請求中發(fā)起的cookie
。
再次嘗試
這次,代碼是可以正常請求到數(shù)據(jù)的。
一個猜想
我替換了url
中的關(guān)鍵詞word
,然后執(zhí)行代碼,又會返回安全驗(yàn)證。
我心想難道百度現(xiàn)在這么坑,一次搜索結(jié)果就要對應(yīng)一個cookie
么。
得出結(jié)果
頭好痛,我可能要長腦子了。
終于腦子長出來了,我找到了突破口。
我發(fā)現(xiàn)用urllib
庫的request
模塊就可以正常請求得到網(wǎng)頁數(shù)據(jù)。
既然這個模塊可以拿到數(shù)據(jù),就現(xiàn)從這一塊入手。
編寫代碼進(jìn)行測試。
req?=?urllib.request.Request(url,?headers=headers)
response?=?urllib.request.urlopen(req)
html?=?response.read().decode('utf-8')
print(html)
html?=?etree.HTML(html)

可以拿到數(shù)據(jù)得到數(shù)據(jù)。
那就可以完善代碼,實(shí)現(xiàn)自動翻頁爬取分頁數(shù)據(jù)了。
既然urllib
庫可以請求成功,那我之前的兩個猜想就都是胡言亂語。
雖然我沒有搞清楚為什么request
庫會被反爬機(jī)制制裁。
但是既然可以完成需求,那就先用著。
能跑就行(不是)。
附加彩蛋
在一度思索反爬原理而得不到結(jié)果的時候,我想到了借助網(wǎng)頁采集工具來實(shí)現(xiàn)我的需求。
我便選擇了八爪魚采集器。
這個工具很強(qiáng)大,不需要懂代碼,就可以完成網(wǎng)頁數(shù)據(jù)的采集。
花了十分鐘做了簡單的配置我就在八爪魚獲得了想要的數(shù)據(jù)。

結(jié)語
此次實(shí)踐目標(biāo)是:收集百度搜索的詞條數(shù)據(jù)。
使用了兩種收集方式:
python腳本
八爪魚采集器
對比優(yōu)缺點(diǎn)
各自優(yōu)點(diǎn)
python
性能更好,可以對數(shù)據(jù)進(jìn)行更為復(fù)雜的處理。
八爪魚采集器上手簡單,無需代碼即可采集數(shù)據(jù)。
各自缺點(diǎn)
python
需要一定的編程基礎(chǔ),對小白不太友好。
八爪魚采集器可以采集數(shù)據(jù),但是只能做一些簡單的邏輯處理判斷。
疑點(diǎn)未解決
python腳本中request庫模擬請求會被百度反爬機(jī)制干掉,但是urllib庫的request模塊模擬的請求可以正常使用,這背后的原因是什么。