解决Python Requests爬取登录网站406错误的实战教程

解决Python Requests爬取登录网站406错误的实战教程

本教程旨在解决使用python `requests`库爬取需要登录的网站时遇到的“406 not acceptable”错误。核心内容是揭示服务器端对http请求头部的验证机制,并提供通过添加或修改关键http头部(如`user-agent`)来模拟浏览器行为的解决方案,确保python爬虫能够成功进行身份验证并获取数据。

在进行网络数据抓取时,尤其是针对需要用户登录的平台,我们经常会遇到请求被服务器拒绝的情况。即使提供了正确的用户名和密码,POST请求也可能返回“406 Not Acceptable”状态码。这通常不是认证信息本身的问题,而是服务器对请求头部的严格校验导致的。许多网站会检查请求的User-Agent等头部信息,以识别并阻止非浏览器发起的自动化请求。

遇到的问题示例

假设我们尝试使用requests库登录一个交易平台(如Plus500),并获取实时市场数据。初始代码可能如下所示:

import requestsfrom pprint import pprint# 假设Config模块中定义了username和password# from Config import username, password # 示例用户名和密码,实际应用中应从安全配置中加载username = "your_email@example.com"password = "YourRandomCode87"def main():    # 目标登录URL,通常包含一些会话或追踪参数    url = 'https://app.plus500.com/trade?innerTags=_cc_&webvisitid=d9cf772d-6ad5-492c-b782-e3fbeaf7863d&page=login'           '&_ga=2.35401569.1585895796.1661533386-1432537898.1661336007 '    with requests.Session() as session:        # 使用session发送POST请求,并尝试进行HTTP基本认证        response = session.post(url, auth=(username, password))        pprint(response.text)if __name__ == '__main__':    main()

运行上述代码后,我们可能会得到类似以下的响应:

('{n' '  "status": "Rejected",n' '  "statusCode": "406",n' '  "supportID": "...",n' '  "ipAddress": "my IP",n' '  "timeStamp": "2022-08-27 12:30:47"n' '}')

响应明确指出status: “Rejected”和statusCode: “406”,这意味着服务器拒绝了我们的请求,通常是由于请求的头部不符合服务器的预期。

立即学习“Python免费学习笔记(深入)”;

解决方案:模拟浏览器请求头

解决这类问题的关键在于让我们的Python脚本尽可能地模拟一个真实的浏览器行为。这通常通过在请求中添加或修改HTTP头部信息来实现。最常见的也是最重要的头部是User-Agent,它标识了发出请求的客户端类型。此外,Accept-Encoding、Accept、Accept-Language和Connection等头部也常用于模拟浏览器。

核心HTTP头部解释:

User-Agent: 告诉服务器客户端的类型、操作系统和浏览器版本。这是最常用于识别和过滤自动化请求的头部。Accept-Encoding: 告知服务器客户端支持的编码方式(如gzip, deflate),以便服务器可以压缩响应内容。Accept: 告知服务器客户端能够处理的媒体类型(MIME类型),例如text/html, application/xhtml+xml等。Accept-Language: 告知服务器客户端偏好的语言。Connection: 控制网络连接的选项,keep-alive表示客户端希望保持连接以便后续请求复用。

修正后的代码示例

通过在requests.post方法中添加headers参数,我们可以解决上述问题:

import requestsfrom pprint import pprint# 假设Config模块中定义了username和password# from Config import username, password # 示例用户名和密码,实际应用中应从安全配置中加载username = "your_email@example.com"password = "MyRandomCode87"def main():    url = 'https://app.plus500.com/trade?innerTags=_cc_&webvisitid=d9cf772d-6ad5-492c-b782-e3fbeaf7863d&page=login'           '&_ga=2.35401569.1585895796.1661533386-1432537898.1661336007 '    # 定义模拟浏览器行为的HTTP头部    headers = {        "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:20.0) Gecko/20100101 Firefox/20.0",        "Accept-Encoding": "gzip, deflate",        "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",        "Accept-Language": "en-US,en;q=0.5",        "Connection": "keep-alive"    }    with requests.Session() as session:        # 在POST请求中加入headers参数        response = session.post(url, auth=(username, password), headers=headers)        pprint(response.text)if __name__ == '__main__':    main()

通过添加这些头部,服务器将更倾向于将我们的请求视为来自合法浏览器,从而允许认证和后续的数据访问。

如何确定必要的HTTP头部

在实际的爬虫开发中,我们可能需要更精确地确定哪些头部是必需的。以下是一些常用的方法:

浏览器开发者工具(Developer Tools):

打开目标网站的登录页面。按F12(或右键点击页面 -> 检查)打开开发者工具。切换到“Network”(网络)选项卡。进行登录操作,观察登录请求(通常是POST请求)。点击该请求,查看其“Request Headers”(请求头部)部分。复制其中关键的头部信息到你的Python代码中。User-Agent是首要关注的,但有时也需要Referer、Origin、Content-Type等。

逐步测试: 如果不确定哪些头部是必需的,可以从User-Agent开始,然后逐步添加其他头部,直到请求成功。

阅读网站的Robots.txt和使用条款: 在进行任何爬取活动之前,务必检查网站的robots.txt文件,了解允许或禁止爬取的部分。同时,仔细阅读网站的服务条款,确保你的行为符合规定,避免不必要的法律风险。

注意事项与最佳实践

尊重网站政策: 始终遵守网站的robots.txt协议和使用条款。未经授权的爬取可能导致IP被封禁,甚至引发法律问题。频率控制: 不要以过高的频率发送请求,这可能被服务器识别为DDoS攻击。使用time.sleep()在请求之间添加延时。异常处理: 编写健壮的代码来处理网络错误、超时、不同的HTTP状态码等异常情况。动态User-Agent: 为了进一步模拟真实用户,可以维护一个User-Agent列表,并在每次请求时随机选择一个。Cookie管理: requests.Session会自动处理Cookie,这对于维护登录状态至关重要。代理IP: 如果IP被封禁,可以考虑使用代理IP池来轮换IP地址。

总结

当使用Python requests库爬取需要登录的网站时遇到“406 Not Acceptable”等拒绝访问的问题,通常是由于请求头部不符合服务器的预期。通过模拟浏览器发送的HTTP头部,特别是User-Agent,可以有效解决这类问题。理解并正确设置这些头部是成功进行网络数据抓取的关键一步。在实践中,结合浏览器开发者工具分析实际请求头,并遵循网络爬取的最佳实践和道德规范,将有助于更高效、更稳定地获取所需数据。

以上就是解决Python Requests爬取登录网站406错误的实战教程的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1590351.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月23日 05:54:18
下一篇 2025年12月23日 05:54:30

相关推荐

  • 处理重叠元素点击事件:z-index 切换策略

    本教程将深入探讨如何在Web开发中有效处理重叠元素的点击事件,特别是当您需要同时响应堆叠在一起的多个元素时。我们将介绍一种基于`z-index`属性的策略,通过动态调整元素的堆叠顺序,结合父级事件监听,实现对下方元素的点击捕获,并提供详细的HTML、CSS和JavaScript代码示例,确保开发者能…

    2025年12月23日
    000
  • CSS position: fixed 实现移动端常驻固定头部教程

    本教程旨在解决移动端网页头部无法常驻固定的问题。我们将深入探讨如何利用 CSS 的 `position: fixed` 属性,使网页头部在用户滚动页面时始终保持在屏幕顶部,并与 `position: sticky` 进行对比,阐明两者的适用场景。文章还将提供示例代码和实施注意事项,确保开发者能有效实…

    2025年12月23日
    000
  • 理解前端资源加载:为何Bootstrap CSS在头部,JS在底部?

    本文深入探讨了前端资源加载的最佳实践,解释了为何像bootstrap这样的框架会将css文件置于html文档的` `标签中,而javascript文件则推荐放置在“标签的底部。核心在于理解浏览器自上而下的渲染机制,以及如何通过合理的资源加载顺序来优化页面性能、避免样式闪烁(fouc)和确…

    2025年12月23日
    000
  • JavaScript实现多视频互斥播放与控制

    本教程将指导您如何使用javascript管理网页上的多个视频元素,实现点击播放一个视频时自动暂停其他视频的互斥播放效果。我们将探讨如何获取所有视频元素、绑定事件监听器,并提供核心代码示例,同时讨论优化用户交互体验的建议。 在现代网页设计中,多媒体内容的集成日益普遍。当页面上存在多个视频时,一个常见…

    2025年12月23日
    000
  • 使用JavaScript为每个单词的首字母添加样式:DOM操作与实践

    本教程旨在解决使用javascript为html元素中每个单词的首字母添加样式时遇到的问题。针对直接修改字符串字符无法生效的常见误区,文章深入剖析了其原因,并提供了一种通过dom操作的解决方案,即通过将目标首字母包裹在“标签中并应用css样式,实现对动态文本的灵活且有效的局部样式控制。 …

    2025年12月23日
    000
  • Django自定义模板中表单字段帮助文本与错误信息的精确显示指南

    本教程详细阐述了在django自定义html模板中,如何有效地为每个表单字段关联并显示其帮助文本(`help_text`)和验证错误(`errors`)。核心方法是通过迭代django `form`对象并利用`{{ field }}`渲染每个字段,从而确保信息与对应输入框的正确绑定,提升用户体验和表…

    2025年12月23日
    000
  • 优化 CSS 状态样式:Master CSS 的分组与抽象实践

    针对 tailwind css 中重复编写 `hover:` 等状态修饰符导致类名冗长的问题,本文介绍了一种替代方案 master css。它通过提供独特的“分组样式”语法和配置中抽象自定义类的能力,帮助开发者更简洁高效地管理和应用组件的状态样式,从而提升代码的可读性和维护性。 引言:理解状态样式管…

    2025年12月23日
    000
  • 解决JavaScript中表单提交导致innerHTML内容闪烁消失的问题

    当在javascript中使用表单提交来动态更新网页内容(如通过`innerhtml`)时,更新的内容可能会短暂显示后立即消失。这通常是由于html表单的默认提交行为触发了页面重载。核心解决方案是在表单提交事件处理函数中调用`event.preventdefault()`,以阻止页面的默认重载行为,…

    2025年12月23日
    000
  • JavaScript中基于类名精准选取HTML元素并进行交互

    本文详细讲解了如何利用javascript准确选取html元素,特别是通过类名进行选择。我们将对比`document.getelementsbyclassname`和`document.queryselector`两种方法的用法和适用场景,重点阐述如何处理单个或多个类名,并演示如何触发元素的点击事件…

    2025年12月23日
    000
  • 掌握JavaScript多视频播放控制:实现互斥与自定义播放逻辑

    本教程旨在指导开发者如何使用JavaScript有效管理网页上的多个视频播放,实现点击一个视频播放时自动暂停其他视频的互斥播放效果。文章将从基础的视频点击控制讲起,逐步优化为通过外部按钮进行播放控制,并探讨实现“下一视频”等高级功能的思路,帮助您构建类似流媒体服务的视频播放体验。 引言:网页多视频播…

    2025年12月23日
    000
  • 响应式布局进阶:利用CSS Grid构建复杂多行多列布局

    本文深入探讨了在响应式设计中,如何从Flexbox转向CSS Grid以更高效地处理复杂的多行多列布局。通过一个具体的案例,我们展示了CSS Grid如何利用`grid-template-areas`等属性简化布局结构,实现精确的元素定位、尺寸控制及在不同屏幕尺寸下的灵活重排,尤其适用于需要精确控制…

    2025年12月23日
    000
  • Google Fonts:高效导入字体家族所有样式的高级技巧

    本文介绍了一种在google fonts中高效导入一个字体家族所有样式的方法。针对google fonts界面缺少“全选”功能的痛点,教程指导用户通过修改生成的css 标签,删除特定样式参数,从而一次性加载字体家族的所有可用字重和斜体变体,避免手动逐一选择,提升开发效率。 在前端开发中,Google…

    2025年12月23日
    000
  • Master CSS:解决Tailwind CSS中状态样式重复的替代方案

    本文针对Tailwind CSS中重复编写状态(如`hover:`、`focus:`)工具类导致类名冗长的问题,提供了一种基于Master CSS的替代解决方案。通过Master CSS的组样式语法或配置抽象功能,开发者可以更简洁地管理和定义包含多状态的复杂样式,有效提升代码的可读性和维护性。 在前…

    2025年12月23日
    000
  • Just-validate表单验证后提交失败:ID匹配错误与解决方案

    本文详细探讨了使用just-validate库进行表单验证后,表单未能成功提交的常见问题。核心问题在于javascript代码中引用的表单id与html中定义的实际id不匹配。教程将指导开发者如何诊断并修正此类错误,确保验证成功后表单能够正确提交,并强调了在前端开发中元素id匹配的重要性。 Just…

    2025年12月23日
    000
  • html如何改成网址_HTML内容转网址链接(URL编码/短链)方法

    使用URL编码可将HTML内容转为安全网址链接,如JavaScript的encodeURIComponent()处理特殊字符,Python用urllib.parse.quote(),再拼接至基础URL;也可通过Bitly等短链服务API生成简洁链接;还可结合HTML表单与JS动态生成并编码链接。 如…

    2025年12月23日
    000
  • Angular中*ngIf与*ngFor结合使用时避免空元素渲染的策略

    本文探讨了在angular应用中,当使用`*ngfor`遍历数据并结合`*ngif`进行条件渲染时,如何避免因`*ngif`位置不当导致空容器(如空盒子)仍然显示的问题。核心解决方案是将`*ngif`直接应用于需要条件隐藏的容器元素上,并结合`ng-container`优化`*ngfor`的dom结…

    2025年12月23日
    000
  • 深入解析:内联样式与外部样式表的渲染效率差异及优化策略

    在处理大量dom元素的场景下,内联样式有时会表现出比外部或内部css更快的渲染速度。这并非源于网络请求的差异,而主要在于浏览器构建css对象模型(cssom)和将样式匹配到文档对象模型(dom)的机制。虽然内联样式在特定极端情况下可能更快,但外部css因其优越的可维护性、可复用性和缓存优势,在绝大多…

    2025年12月23日
    000
  • 利用CSS实现标签自定义属性值悬停提示

    本教程详细介绍了如何通过CSS为HTML 标签的自定义属性(如ref)创建悬停提示。文章涵盖了使用内置title属性的简便方法,以及利用CSS ::after 伪元素和 content: attr() 实现高度可定制化提示框的专业技巧,并提供了完整的代码示例和注意事项,助您提升用户体验。 在网页开发…

    2025年12月23日
    000
  • JavaScript中根据类名高效移除DOM元素:以表格行为例

    本文将深入探讨如何在JavaScript中高效地根据类名移除DOM元素,特别是针对表格中的行(` `)。我们将从常见的DOM操作方法入手,介绍现代且简化的`element.remove()`方法,并通过实例代码展示其在清理动态生成内容时的应用,同时提供最佳实践建议,帮助开发者避免潜在问题,提升代码的…

    2025年12月23日
    000
  • 在Dash应用中实现动态超链接

    本教程详细介绍了如何在dash应用程序中动态设置超链接(href属性)。通过利用dash回调函数同时更新html组件的文本内容(children属性)和链接地址(href属性),开发者可以根据用户交互或后端数据动态生成可点击的链接,从而提升应用的交互性和功能性。文章提供了具体的代码示例和实现步骤,帮…

    2025年12月23日
    000

发表回复

登录后才能评论
关注微信