背景描述
最近需要收集百度搜索查询结果,可是使用的时候,发现之前的python脚本程序失效了。
这使我无法批量采集所需的关键词数据。
问题描述
启动python脚本程序后,获取的数据一直是空值。
request请求结果返回的html页面是百度安全验证页面。
问题演示
搜索了一下,知道这是百度设置的反爬机制。
如果请求被检测判定为非人类,则会返回此页面。
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<title>百度安全验证</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">网络不给力,请稍后重试</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
的数据过期了。
我通过浏览器F12
,拿到最新的cookie
,在代码中替换了cookie
。
初次尝试
尝试执行代码,结果失败。依旧是百度安全验证页面。
再次思考
我二次猜想,把浏览器中成功获取搜索结果的url
,替换成我在代码中发起的请求url
。
当然,此时的cookie
也是当前页面请求中发起的cookie
。
再次尝试
这次,代码是可以正常请求到数据的。
一个猜想
我替换了url
中的关键词word
,然后执行代码,又会返回安全验证。
我心想难道百度现在这么坑,一次搜索结果就要对应一个cookie
么。
得出结果
头好痛,我可能要长脑子了。
终于脑子长出来了,我找到了突破口。
我发现用urllib
库的request
模块就可以正常请求得到网页数据。
既然这个模块可以拿到数据,就现从这一块入手。
编写代码进行测试。
req = urllib.request.Request(url, headers=headers)
response = urllib.request.urlopen(req)
html = response.read().decode('utf-8')
print(html)
html = etree.HTML(html)
可以拿到数据得到数据。
那就可以完善代码,实现自动翻页爬取分页数据了。
既然urllib
库可以请求成功,那我之前的两个猜想就都是胡言乱语。
虽然我没有搞清楚为什么request
库会被反爬机制制裁。
但是既然可以完成需求,那就先用着。
能跑就行(不是)。
附加彩蛋
在一度思索反爬原理而得不到结果的时候,我想到了借助网页采集工具来实现我的需求。
我便选择了八爪鱼采集器。
这个工具很强大,不需要懂代码,就可以完成网页数据的采集。
花了十分钟做了简单的配置我就在八爪鱼获得了想要的数据。
结语
此次实践目标是:收集百度搜索的词条数据。
使用了两种收集方式:
- python脚本
- 八爪鱼采集器
对比优缺点
- 各自优点
python
性能更好,可以对数据进行更为复杂的处理。
八爪鱼采集器上手简单,无需代码即可采集数据。
- 各自缺点
python
需要一定的编程基础,对小白不太友好。
八爪鱼采集器可以采集数据,但是只能做一些简单的逻辑处理判断。
疑点未解决
python脚本中request库模拟请求会被百度反爬机制干掉,但是urllib库的request模块模拟的请求可以正常使用,这背后的原因是什么。
标签:请求,批量,python,request,代码,一键,采集,数据,百度 From: https://www.cnblogs.com/futurelifekin/p/17176395.html