python爬虫遇到【安全检查! | 百度云加速】的解决方案
本帖最后由 aiai 于 2020-5-25 22:31 编辑首先假设我们还不知道网站有百度云加速检查,先直接获取。网址因某些原因屏蔽,但是不影响整体思路
shareurl = 'https://************/**************************'
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'
}
response = httpx.get(url=shareurl, headers=headers)
print(response.text)
查看打印的结果,可以看到有【安全检查! | 百度云加速】
<!DOCTYPE html>
<!--> <html class="no-js ie6 oldie" lang="en-US"> <!-->
<!--> <html class="no-js ie7 oldie" lang="en-US"> <!-->
<!--> <html class="no-js ie8 oldie" lang="en-US"> <!-->
<!--><!--> <html class="no-js" lang="en-US"> <!--<!-->
<head>
<title>安全检查! | 百度云加速</title>
<meta charset="UTF-8" />
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1" />
<meta name="robots" content="noindex, nofollow" />
那么通过打印的结果,要做的就很明显了,需要获取一些参数,以及验证码,最后一齐请求
首先是响应头中的参数
cookie = response.headers['set-cookie'].split(';')
ray = response.headers['cf-ray'].split('-')
然后是响应体的参数
posturl = '/'.join(shareurl.split('/')[:3])+html.unescape(re.findall('(?<=action=").+?(?=")', response.text))
r = re.findall('(?<=value=").+?(?=")', response.text)
最后还需要一个验证码,这里的pub参数多次抓包发现是不变的,所以就直接写死
首先获取一个用于获取验证码图片的参数session
url = 'https://captcha.su.baidu.com/session_cb?pub=377e4907e1a3b419708dbd00df9e8f79'
headers = {
'Host': 'captcha.su.baidu.com',
'Referer': shareurl,
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'
}
response = httpx.get(url, headers=headers).text
session = response.split('"')[-2]
此时通过session以及前面的pub可以获得验证码图片,保存到本地再手动输入
url = 'https://captcha.su.baidu.com/image?session='+session+'&pub=377e4907e1a3b419708dbd00df9e8f79'
response = httpx.get(url, headers=headers).content
with open('验证码.jpg', 'wb') as f:
f.write(response)
yanzhengma = input('请输入同目录下的验证码:')
最后构造请求头和请求体,发出请求即可得到目标网页数据
headers = {
'content-type': 'application/x-www-form-urlencoded',
'cookie': cookie,
'referer': shareurl,
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36',
}
data = {
'r': r,
'id': ray,
'captcha_challenge_field': session,
'manual_captcha_challenge_field': yanzhengma,
}
response = httpx.post(posturl, headers=headers, data=data)
print(response.text)
再次查看打印的内容,获取正确
附上完整代码
shareurl = 'https://************/**************************'
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36',
}
response = httpx.get(shareurl, headers=headers)
cookie = response.headers['set-cookie'].split(';')
ray = response.headers['cf-ray'].split('-')
posturl = '/'.join(shareurl.split('/')[:3])+html.unescape(re.findall('(?<=action=").+?(?=")', response.text))
r = re.findall('(?<=value=").+?(?=")', response.text)
url = 'https://captcha.su.baidu.com/session_cb?pub=377e4907e1a3b419708dbd00df9e8f79'
headers = {
'Host': 'captcha.su.baidu.com',
'Referer': shareurl,
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'
}
response = httpx.get(url, headers=headers).text
session = response.split('"')[-2]
url = 'https://captcha.su.baidu.com/image?session='+session+'&pub=377e4907e1a3b419708dbd00df9e8f79'
response = httpx.get(url, headers=headers).content
with open('验证码.jpg', 'wb') as f:
f.write(response)
yanzhengma = input('请输入同目录下的验证码:')
headers = {
'content-type': 'application/x-www-form-urlencoded',
'cookie': cookie,
'referer': shareurl,
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36',
}
data = {
'r': r,
'id': ray,
'captcha_challenge_field': session,
'manual_captcha_challenge_field': yanzhengma,
}
response = httpx.post(posturl, headers=headers, data=data)
print(response.text)
完全看不懂啊,大佬太多 这个啥意思,我没明白 大佬的教程需要一点水平啊。{:301_1008:}代码是不是没有导包,httpx报错,会连接超时或者set-cookie报错,不错,继续努力 emmm手动输入验证码的话是不是有点降低效率?
还是只有第一次需要,后面带参数就不需要了? 浅吻深拥 发表于 2020-5-25 23:53
大佬的教程需要一点水平啊。代码是不是没有导包,httpx报错,会连接超时或者set-cookie报错, ...
导包写在最上面,忘记加上去了{:1_924:} 涛之雨 发表于 2020-5-25 23:53
emmm手动输入验证码的话是不是有点降低效率?
还是只有第一次需要,后面带参数就不需要了?
手动输入验证码确实降低了效率,但是首先解决了第一重获取目标网页数据的问题。自动识别验证码可以考虑接入百度AI的通用文字识别来自动识别。最后一次的post好像会返回set-cookie,后面的请求带上这个cookie应该在一段时间内无需再输入验证码。 大佬。我采集网站也是遇到被拦截,不知道怎么突破,能给点思路吗
https://www.youzy.cn/tzy/search/majors/homepage
页:
[1]