爬虫百度返回“百度安全验证”终极解决方案

这篇文章也可以在我的博客查看

爬不了啊!!

最近一哥们跟我说百度爬虫爬不了
弹出:“百度安全验证”,“网络不给力,请稍后重试”

说到爬虫,这里指的是Python中最常用的requests库

我说怎么爬不了了?

  • user-agent加了吗?
  • cookie加了吗?

他说都加了

我不信邪,试了一下,超,真的返回百度安全认证:

<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="utf-8"><title>百度安全验证</title><!-- 省略一堆meta -->
</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_21d1ae1.js"></script>
</body>
</html>

网络有说加Accept header的,我试了,也不行。
我的代码是这样的:

import requestsheaders={
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36',
'Accept-Encoding': 'gzip, deflate, br',
'Cookie': '[yummy cookies ^_^]',
'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.7'
}
response = requests.get('https://baidu.com/s', headers=headers)
response.encoding = 'utf-8'
print(response.text)

我纳闷了,怎么回事呢?
考虑到爬虫其实也是访问网站的过程
此时应该使用fiddler的Composer对需要爬取的报文进行调试
通过不断地增加、减少header项,最终得出必要的headers

到最后,发现请求百度所必须的数据其实只有:

以下是Fiddler Composer的raw输入

GET https://xueshu.baidu.com/s?wd=%E5%9B%BE%E5%83%8F%E9%87%8D%E5%BB%BA%E3%80%81%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0 HTTP/1.1
Host: xueshu.baidu.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36
Accept-Encoding: gzip, deflate, br
Cookie: [yummy cookies ^_^]

也就是:

  • User-Agent
  • Cookie
  • Accept-Encoding

但是……我之前的代码已经包含这些了啊?还赠送了一个Accept呢?

分析真正问题

这是我突然意识到一个事儿……

说到底,Fiddler不也是机器人吗?
为啥Fiddler能发出去,但Pythonrequests发不出去啊
难道是requests被抓到小鸡脚了吗?

一波考虑之后 感觉有可能
Fiddler虽然也是机器人,但它作为一个流量转发工具,它很完善,行为更像浏览器
requests相反,它本来就不是用作浏览器访问,而是以最轻便方式执行http请求

其中可能某些浏览器应有的行为,被requests阉割掉了,然后被百度识别出来了

爆破

好吧,但不管怎样,你百度还是需要提供服务的
requests虽然因为不是浏览器被你识别出来了,那我用浏览器访问你,你又该如何应对?

因此祭出爬虫的宇宙终极答案:无头浏览器

Selenium

Selenium是一个用于自动化浏览器操作的工具,常用于测试网页应用程序和执行Web任务
它提供了多种编程语言的客户端库,如Python、Java、C#等,用于控制浏览器的行为
通过编写代码,可以模拟用户在浏览器中的操作,比如点击链接、填写表单、提交数据等

OK很好,我们就用Selenium进行爬虫

安装环境

Selenium

我们需要下载python的Selenium库,执行:

pip install -U selenium

浏览器

你需要一个真的浏览器以进行网上冲浪,希望你有一个_

Linux shell玩家也可以安装浏览器
不过就不在此展开了

浏览器驱动

需要安装与你浏览器对应的浏览器驱动(Browse Driver)以供Selenium调用
这里也不详细展开,但大致分两种做法:

手动安装

注意下的是Driver,别下成浏览器本身了

无非就是到官网下,比如:

  • Chrome的最新版
  • Chrome 114以前

自动安装

可以使用webdriver-manager Python库实现自动化安装管理

pip install webdriver-manager

调用就自动安装,比如Chrome:

from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManagerdriver = webdriver.Chrome(ChromeDriverManager().install())

爬就爬,我最会爬了

那就给大伙用Selenium爬一个

编写以下代码,唯一需要注意的就是Driver的路径需要更改(我放到项目根目录了,所以直接写文件名):

from selenium import webdriver
from selenium.webdriver.chrome.options import Options# 我们并不需要浏览器弹出
options = Options()
options.headless = True# 启动浏览器的无头模式,访问
driver = webdriver.Chrome('chromedriver.exe', options=options)
driver.get("https://xueshu.baidu.com/s?wd=图像重建、深度学习")# 获取页面的源代码
page_source = driver.page_source
# 输出页面源代码
print(page_source)driver.quit()

无头浏览器将会为你操办一切,直接访问到页面
不仅不需要cookie(在非登录的情况下),甚至连header都不需要

问题

你可能会感觉得到,这东西运行起来比requests
我只能说确实,因为它是真浏览器

但是……你真的需要快吗?

  • 爬虫太快也是会被封IP的
  • 如果你配置了IP池、多线程一系列框架,还需要在乎这点速度差距吗?

慢还有一个好处,它更像人工行为了,它能难被检测出了,嘻嘻

那今天的爬虫就到这了,该睡觉了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/45048.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python绘制爱心代码(七夕限定版)

写在前面&#xff1a; 又到了一年一度的七夕节啦&#xff01;你还在发愁送女朋友什么礼物&#xff0c;不知道怎样表达你满满的爱意吗&#xff1f;别担心&#xff0c;我来帮你&#xff01;今天&#xff0c;我将教你使用Python绘制一个跳动的爱心&#xff0c;用创意和幽默为这个…

Angular安全专辑之二——‘unsafe-eval’不是以下内容安全策略中允许的脚本源

一&#xff1a;错误出现 这个错误的意思是&#xff0c;拒绝将字符串评估为 JavaScript&#xff0c;因为‘unsafe-eval’不是以下内容安全策略中允许的脚本源。 二&#xff1a;错误场景 testEval() {const data eval("var sum2 new Function(a, b, return a b); sum2(em…

JavaWeb_LeadNews_Day6-Kafka

JavaWeb_LeadNews_Day6-Kafka Kafka概述安装配置kafka入门kafka高可用方案kafka详解生产者同步异步发送消息生产者参数配置消费者同步异步提交偏移量 SpringBoot集成kafka 自媒体文章上下架实现思路具体实现 来源Gitee Kafka 概述 对比 选择 介绍 producer: 发布消息的对象称…

寻路算法小游戏

寻路算法小demo 寻路算法有两种&#xff0c;一种是dfs 深度优先算法&#xff0c;一种是 dfs 深度优先算法 深度优先搜索的步骤分为 1.递归下去 2.回溯上来。顾名思义&#xff0c;深度优先&#xff0c;则是以深度为准则&#xff0c;先一条路走到底&#xff0c;直到达到目标。这…

矩形重叠问题

矩形重叠 文章目录 题目描述解题思路方法一方法二 题目描述 矩形以列表 [x1, y1, x2, y2] 的形式表示&#xff0c;其中 (x1, y1) 为左下角的坐标&#xff0c;(x2, y2) 是右上角的坐标。矩形的上下边平行于 x 轴&#xff0c;左右边平行于 y 轴。 如果相交的面积为 正 &#xff0…

Hadoop小结(下)

HDFS 集群 HDFS 集群是建立在 Hadoop 集群之上的&#xff0c;由于 HDFS 是 Hadoop 最主要的守护进程&#xff0c;所以 HDFS 集群的配置过程是 Hadoop 集群配置过程的代表。 使用 Docker 可以更加方便地、高效地构建出一个集群环境。 每台计算机中的配置 Hadoop 如何配置集群…

2023-08-19力扣每日一题-水题/位运算解法

链接&#xff1a; 2235. 两整数相加 题意&#xff1a; ab 解&#xff1a; ab 补一个位运算写法&#xff0c;进位是(a&b)<<1&#xff0c;不进位的计算结果为a^b 实际代码&#xff1a; #include<iostream> using namespace std; int sum(int num1, int n…

linux tomcat server.xml 项目访问路径变更不生效

如果想改成默认的127.0.0.1:8080 访问项目 先确定更改的作用文件 server.xml 的 host:appBase 标签 默认找到appBase webapps 下的war包&#xff0c;并解压&#xff0c;解压后的appname为访问路径 也就变成了 127.0.0.1:8080/appname host:Context:path 标签 appBase的 优先…

vue2和vue3

1. 双向数据绑定原理发生了改变 vue2的双向数据绑定是利用了es5 的一个API Object.definepropert() 对数据进行劫持 结合发布订阅模式来实现的。vue3中使用了es6的proxyAPI对数据进行处理。 相比与vue2&#xff0c;使用proxy API 优势有&#xff1a;defineProperty只能监听某个…

【OpenCV CMake find_packages找不到包】

根据OpenCV和各大网站提供的基于CMake的find_packages方法总是提示如下两种错误。 错误1&#xff1a;找不到OpenCV CMake Error at CMakeLists.txt:39 (find_package):By not providing "FindOpenCV.cmake" in CMAKE_MODULE_PATH this project hasasked CMake to fi…

深入探索:Kali Linux 网络安全之旅

目录 前言 访问官方网站 导航到下载页面 启动后界面操作 前言 "Kali" 可能指的是 Kali Linux&#xff0c;它是一种基于 Debian 的 Linux 发行版&#xff0c;专门用于渗透测试、网络安全评估、数字取证和相关的安全任务。Kali Linux 旨在提供一系列用于测试网络和…

菜鸟Vue教程 - 实现带国际化的注册登陆页面

初接触vue的时候觉得vue好难&#xff0c;因为项目中要用到&#xff0c;就硬着头皮上&#xff0c;慢慢的发现也不难&#xff0c;无外乎画个布局&#xff0c;然后通过样式调整界面。在通过属性和方法跟js交互。js就和我们写的java代码差不多了&#xff0c;复杂一点的就是引用这种…

Python数据分析实战-多线程并发处理列表(附源码和实现效果)

实现功能 Python数据分析实战-多线程并发处理列表 实现代码 import threading有15个列表&#xff0c;尝试多进程并发处理&#xff0c;每个列表一个进程&#xff0c;进程数和 CPU 核数一致def sum_list(lst):return sum(lst)if __name__ __main__:lists [[1,2,3], [4,5,6], …

BDA初级分析——SQL清洗和整理数据

一、数据处理 数据处理之类型转换 字符格式与数值格式存储的数据&#xff0c;同样是进行大小排序&#xff0c; 会有什么区别&#xff1f; 以rev为例&#xff0c;看看字符格式与数值格式存储时&#xff0c;排序会有什么区别&#xff1f; 用cast as转换为字符后进行排序 SEL…

解决element的select组件创建新的选项可多选且opitions数据源中有数据的情况下,回车不能自动选中创建的问题

前言 最近开发项目使用element-plus库内的select组件&#xff0c;其中有提供一个创建新的选项的用法&#xff0c;但是发现一些小问题&#xff0c;在此记录 版本 “element-plus”: “^2.3.9”, “vue”: “^3.3.4”, 问题 1、在options数据源中无数据的时候&#xff0c;在输入框…

spring boot 提示:程序包不存在,解决方法总结

背景&#xff1a; 之前出现过这样的问题&#xff0c;打包安装父项目就好了&#xff0c;今天改了一下代码&#xff0c;重新编译的时候&#xff0c;又出现了这样的情况&#xff0c;决定深度挖掘一下这里面的问题 spring boot 提示&#xff1a;程序包不存在&#xff0c;解决方法总…

mysql+jdbc+servlet+java实现的学生在校疫情信息打卡系统

摘 要 I Abstract II 主 要 符 号 表 i 1 绪论 1 1.1 研究背景 1 1.2 研究目的与意义 2 1.3 国内外的研究情况 2 1.4 研究内容 2 2 系统的开发方法和关键技术 4 2.1 开发方法 4 2.1.1 结构化开发方法 4 2.1.2 面向对象方法 4 2.2 开发技术 4 2.2.1 小程序开发MINA框架 4 2.2.2 …

快速搭建图书商城小程序的简易流程与优势

很多人喜欢阅读电子书&#xff0c;又有很多人依旧喜欢实体书&#xff0c;而实体书店拥有一个图书商城小程序便成为了满足用户需求的理想选择。如果您也想进入这一充满潜力的领域&#xff0c;但担心开发难度和复杂流程&#xff0c;别担心&#xff01;您能做到快速搭建一个专业、…

【令牌桶算法与漏桶算法】

&#x1f4a7; 令牌桶算法与漏桶算法 \color{#FF1493}{令牌桶算法与漏桶算法} 令牌桶算法与漏桶算法&#x1f4a7; &#x1f337; 仰望天空&#xff0c;妳我亦是行人.✨ &#x1f984; 个人主页——微风撞见云的博客&#x1f390; &#x1f433; 《数据结构与算法》专…

Java 面试题--SpringBoot篇

一、什么是 SpringBoot&#xff1f; Spring Boot 是 Spring 开源组织下的子项目&#xff0c; 是 Spring 组件一站式解决方案&#xff0c;主要是简化 了使用 Spring 的难度&#xff0c;简省了繁重 xml 的配 置&#xff0c;提供了各种启动器&#xff0c;在运行过程中自定 配置,&a…