python爬虫返回百度安全验证

我一开始用的是requests库,header加了accept和user-agent,这是一开始的代码:

import requests

headers = {
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36',
}

url = "https://www.baidu.com/s?wd=python"
response = requests.get(url, headers=headers)
response.encoding = 'utf-8'
print(response.text)

 返回结果:

然后我用urllib.request试了一下

import urllib.request

headers = {
     'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36 Edg/83.0.478.50',
     'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9'
}

url = "https://www.baidu.com/s?wd=python"

req = urllib.request.Request(url=url, headers=headers)
html = urllib.request.urlopen(req).read().decode('UTF-8')

# with open(r'new.html', mode='w',encoding='utf-8') as f:
#      f.write(html)
print(html)

# with open('new.html', mode='rb') as f:
#      #f.read()
#      html = f.read().decode("utf-8")
#      soup = BeautifulSoup(html, 'html.parser')
#      bs = soup.select('#content_left')
#      print(bs)
#      f.close()

 就可以返回了...

大概因为requests是第三方库比较容易被识别?哪位大神知道可以在评论区告诉我一下怎么用requests绕过吗(〃'▽'〃)

再一个问题,爬虫是不是也跟浏览器的版本有关系?我和上面这个header的区别也就是浏览器版本不一样吧


#这个是我自己浏览器的header,不管是requests还是urllib.request都是拿不到的
headers = {
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36',
# }

ps:如果请求参数想加中文的话,可以用quote

from urllib.parse import quote
text = quote("从万米高空降临", 'utf-8') #把中文进行url编码
url = "https://www.baidu.com/s?wd="+ text

===更新==============2023.07.02=====================

感谢评论区友友的提示!我这边尝试了一下直接换http协议,不行;想起了之前我试过的headers里面加Cookie,用http协议请求成功(这个我直接用的高版本chrome的User-Agent)~~

实现如下:

 urllib.request同理,headers里面加Cookie,用http请求,User-Agent高版本同样可行。如图:

Cookie是浏览器f12随手拿的:

之前查过很多文章都说加cookie就可以了,但是我怎么试都不行,没想到换个http协议就ok了,果然我还是学的太浅了

===更新===================2024.05.11===========================

好多友友说按照我的方式请求不了,所以今天又查了一下,算是借鉴吧:爬虫百度返回“百度安全验证”解决方案_百度安全验证的解决方法-CSDN博客

我用这个博主请求的url试了试,果然不管什么请求方式,或者按照博主说的登录账号获取cookie,我这边一直都返回百度安全验证,确实也不知道再加什么了,所以再次指路:爬虫百度返回“百度安全验证”终极解决方案_haddler显示百度安全验证-CSDN博客

果然用 selenium还是很香的,不需要账号也不需要登录,因为我本身之前就装过这个包了,只是当时没继续看下去,大家自己找装包方法,我就是按照上面这个写出来的(有一点小小的调整因为我这里会有点报错信息,不影响读出的结果),请求成功~

from selenium.webdriver.chrome.options import Options
from selenium.webdriver.edge.service import Service
from selenium import webdriver

# 我们并不需要浏览器弹出
options = Options()
options.add_argument('--headless')
options.add_argument('--disable-gpu')

# 启动浏览器的无头模式,访问
# ========================================
# 注意:这是Selenium 4.10.0以下写法,高版本见下面
# ========================================
url = "http://mbd.baidu.com/newspage/data/dtlandingwise?sourceFrom=share_ugc&nid=dt_5081303661936210764"
driver = webdriver.Chrome(service=Service('chromedriver.exe'), options=options)
driver.get(url)

# 获取页面的源代码
page_source = driver.page_source
# 输出页面源代码
print(page_source)

driver.quit()

读取结果如下:

  • 9
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 30
    评论
### 回答1: Python 访问百度,需要避免被百度进行安全验证拦截。因为百度会对频繁访问、恶意行为等行为进行拦截,从而导致程序无法正常访问。为了避免被百度安全验证拦截的问题,我们可以使用一些技巧来规避。 首先,我们可以使用 HTTPS 协议进行访问,这样可以避免被百度拦截。其次,可以使用请求头进行伪造,比如修改 user-agent,从而模拟真实用户访问,降低被拦截的概率。另外,可以进行一些策略性的访问控制,比如通过设置时间间隔等方式来规避被百度发现。 除此之外,还可以通过使用代理 IP 等技巧来进行访问,从而规避被百度发现的概率。比如使用 Tor 等匿名网络进行访问,或者使用一些免费的代理服务进行访问。 总之,如果想要 Python 访问百度而又避免百度安全验证拦截,就需要使用一些规避技巧。通过合理的策略、伪装和代理等技术手段,可以达到稳定访问百度的目的。同时,也需要注意在进行这些操作时遵守相关法律法规不会误伤他人利益。 ### 回答2: Python访问百度网站时,如果百度启用了安全验证功能,则需要先通过验证才能访问网站。下面介绍两种常见的方法来解决此问题: 1. 使用selenium模拟浏览器操作: selenium是一个自动化测试工具,可以用Python编写脚本来模拟用户在浏览器中进行操作。我们可以编写一个脚本,用selenium启动浏览器,输入百度网址,然后输入用户名和密码进行验证,最后获取需要的页面内容。具体实现过程可以参考selenium的相关文档和教程。 2. 使用Python模拟发送请求: 当我们在浏览器中访问网站时,实际上是发出了一个HTTP请求,服务器返回了对应的响应。我们可以用Python的requests库来模拟发送HTTP请求,然后解析相应的HTML内容来获取页面信息。但是,在进行安全验证时,需要设置许多请求头和参数,以及处理Cookies等问题,因此使用该方法需要花费一定的时间和精力。 综上所述,使用selenium模拟浏览器操作是一种较为简单、直接的方法,可以帮助我们轻松地绕过百度安全验证,获取需要的页面信息。而如果需要精确控制请求过程或需要大量访问网站时,则可以使用Python模拟发送请求。
评论 30
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值