已解决urllib.error.HTTPError: HTTP Error 403: Forbidden-程序员宅基地

技术标签: 爬虫  python  http  服务器  

已解决(python使用urlopen/urlretrieve下载文件时出现403 forbidden)urllib.error.HTTPError: HTTP Error 403: Forbidden











报错代码



urllib.urlretrieve(url[, filename[, reporthook[, data]]])

参数说明:

  • url:外部或者本地url
  • filename:指定了保存到本地的路径(如果未指定该参数,urllib会生成一个临时文件来保存数据);
  • reporthook:是一个回调函数,当连接上服务器、以及相应的数据块传输完毕的时候会触发该回调。我们可以利用这个回调函数来显示当前的下载进度。
  • data:指post到服务器的数据。该方法返回一个包含两个元素的元组(filename, headers),filename表示保存到本地的路径,header表示服务器的响应头。

最近用urllib编写了一个简单的爬虫下载网上文件的代码,刚运行没多久就每个url都报403错误。但是手动在浏览器端访问却是能够访问的。报错代码如下:

from urllib.request import urlretrieve
import wget

url = "http://cdict.qq.pinyin.cn/download?dict_id=s49272"  # 请求下载文件地址
urlretrieve(url, '1.qcel')  # 第二个参数表示路径


报错信息截图如下

在这里插入图片描述





报错翻译



报错信息翻译


错误。HTTP错误403:禁止





报错原因



报错原因

访问网站403错误:资源不可用,403错误是一种在网站访问过程中,常见的错误提示,表示资源不可用。服务器理解客户的请求,但拒绝处理它,通常由于服务器上文件或目录的权限设置导致的WEB访问错误。

出现该错误的原因是服务器开启了反爬虫,一般情况下只需要设置header模拟浏览器即可,但是urlretrieve并未提供header参数。





解决方法


(1)排查发现可能是服务器开启了反爬虫,针对这种情况添加headers浏览器头,模拟人工访问网站行为:

from urllib.request import urlretrieve
import urllib
import random

url = "http://cdict.qq.pinyin.cn/download?dict_id=s49272"  # 请求下载文件地址

urlretrieve(url, '1.qcel')  # 第二个参数表示路径

opener = urllib.request.build_opener()
# 构建请求头列表每次随机选择一个
ua_list = ['Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Firefox/102.0',
           'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36',
           'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.114 Safari/537.36 Edg/103.0.1264.62',
           'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:98.0) Gecko/20100101 Firefox/98.0',
           'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.81 Safari/537.36 SE 2.X MetaSr 1.0'
           ]
opener.addheaders = [('User-Agent', random.choice(ua_list))]
urllib.request.install_opener(opener)
urlretrieve(url, '1.qcel')

(2)如果网站反爬虫级别特别高的,还需要切换代理ip:使用urllib模块设置代理IP是比较简单的,首先需要创建ProxyHandler对象,其参数为字典类型的代理IP,键名为协议类型(如HTTP或者HTTPS),值为代理链接。然后利用ProxyHandler对象与buildopener()方法构建一个新的opener对象,最后再发送网络请求即可。

# 创建代理IP
proxy_handler = urllib.request.ProxyHandler({
    
    'https':'58.220.95.114:10053'
})
 
# 创建opener对象
opener = urllib.request.build_opener(proxy_handler)

以上是此问题报错原因的解决方法,欢迎评论区留言讨论是否能解决,如果有用欢迎点赞收藏文章谢谢支持,博主才有动力持续记录遇到的问题!!!

千人全栈VIP答疑群联系博主帮忙解决报错

由于博主时间精力有限,每天私信人数太多,没办法每个粉丝都及时回复,所以优先回复VIP粉丝,可以通过订阅限时9.9付费专栏《100天精通Python从入门到就业》进入千人全栈VIP答疑群,获得优先解答机会(代码指导、远程服务),白嫖80G学习资料大礼包,专栏订阅地址:https://blog.csdn.net/yuan2019035055/category_11466020.html

  • 优点作者优先解答机会(代码指导、远程服务),群里大佬众多可以抱团取暖(大厂内推机会),此专栏文章是专门针对零基础和需要进阶提升的同学所准备的一套完整教学,从0到100的不断进阶深入,后续还有实战项目,轻松应对面试!

  • 专栏福利简历指导、招聘内推、每周送实体书、80G全栈学习视频、300本IT电子书:Python、Java、前端、大数据、数据库、算法、爬虫、数据分析、机器学习、面试题库等等

  • 注意:如果希望得到及时回复,订阅专栏后私信博主进千人VIP答疑群在这里插入图片描述
    在这里插入图片描述

免费资料获取,更多粉丝福利,关注下方公众号获取

在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/yuan2019035055/article/details/126608882

智能推荐

.net资源站点汇总-程序员宅基地

文章浏览阅读1.1k次。.net资源站点汇总名称:快速入门地址:http://chs.gotdotnet.com/quickstart/描述:本站点是微软.NET技术的快速入门网站,我们不必再安装.NET Framework中的快速入门示例程序,直接在网上查看此示例即看。****************************************************名称:微软官方.NET指导站点地址:ht

Efficient Zero-Knowledge Arguments for Arithmetic Circuits in the Discrete Log Setting学习笔记-程序员宅基地

文章浏览阅读1.2k次。1. 引言Bootle和Groth等人2016年论文《Efficient Zero-Knowledge Arguments for Arithmetic Circuits in the Discrete Log Setting》。_efficient zero-knowledge arguments for arithmetic circuits in the discrete l

【计算机毕业设计】070校园代购服务订单管理系统_校园代购用户分析-程序员宅基地

文章浏览阅读155次。在新发展的时代,众多的软件被开发出来,给用户带来了很大的选择余地,而且学生越来越追求更个性的需求。在这种时代背景下,学生对校园代购服务订单管理越来越重视,更好的实现校园代购服务的有效发挥,本文将通过校园代购服务订单管理系统的信息,分析在日常生活中对代购服务存在哪些问题探讨出进一步提升工作效率,管理能力的对策。系统采用了java技术,将所有模块采用以浏览器交互的模式,选择MySQL作为系统的数据库,开发工具选择eclipse来进行系统的设计。基本实现了校园代购服务订单管理系统应有的主要功能模块,本系统有管_校园代购用户分析

分支限界法—任务分配问题_分支限界法解决作业分配问题 oj-程序员宅基地

文章浏览阅读4.5k次,点赞6次,收藏54次。题目描述分配问题要求将n个任务分配给n给人,每个人完成任务的代价不同,要求分配的结果最优,此题可以使用回溯求解。简要分析和设计假设存在四个人a,b,c,d,任务1,任务2,任务3,任务4,和对应的代价矩阵如下:采用分支界限法,需要计算最优边界Lb,Lb=已分配任务的代价+剩余未分配任务中最小的代价,然后构造状态空间树,上面例子的状态空间树如下:开始节点表示还未给任何人分配任务,然后在开始节点的基础上寻找可扩展节点。最开始的start中的lb=每行最小之和(2+3+1+4=10)由于此时a有四种选_分支限界法解决作业分配问题 oj

android studio开发计算器_android开发计算-程序员宅基地

文章浏览阅读1.5k次。一个简易的计算器,边学边写,还有很多不足希望多多指教先看布局,整体线性布局,上面两个TextView,一个存放计算过程,一个给出结果,然后一个table布局,button没有声明在xml里,用Java写的,好处是比较方便,坏处是我不会怎么让button适应屏幕,看起来有点丑。<?xml version="1.0" encoding="utf-8"?><android.sup..._android开发计算

基于matlab的2PSK的系统仿真_倒π现象-程序员宅基地

文章浏览阅读7.3k次,点赞12次,收藏59次。由于2PSK的幅度是恒定的,必须进行相干解调。经过带通滤波的信号在相乘器中与本地载波相乘,然后用低通滤波器滤除高频分量,在进行抽样判决。判决器是按极性来判决的。即正抽样值判为1,负抽样值判为0。2PSK信号的相干解调原理图如图2-4所示,各点的波形如图2-5所示。由于2PSK信号的载波回复过程中存在着180°的相位模糊,即恢复的本地载波与所需相干载波可能相同,也可能相反,这种相位关系的不确定性将会造成解调出的数字基带信号与发送的基带信号正好相反,即“1”变成“0”吗“0”变成“1”,判决器输出数字信号全_倒π现象

随便推点

C#WFM关于光标设置问题_wfm开发-程序员宅基地

文章浏览阅读524次。由于项目需要,要开发一款打地鼠的小游戏。在设置光标大小和位置的时候卡住了。下面我和大家分享一下我解决问题的过程。一、设置光标位置。C#里面的cursor控件没有给到直接设置location的函数。但这个网上有很多解决方案。我采纳之后觉得挺实用的。首先,需要再命名空间里添加using System.Runtime.InteropServices;然后在Class里面添加一下函数即可: [DllImport("user32.dll")] public static exte_wfm开发

ai人工智能_11条人工智能原则-程序员宅基地

文章浏览阅读874次。ai人工智能If not, how do we teach values to an autonomous intelligence? Can we codify them or simply enter it somewhere in the system? Is it more of an iterative process where we will correct parameters o..._人工智能遵循原则

深入了解与全面解析华为认证(HCIA/HCIP/HCIE)-程序员宅基地

文章浏览阅读395次,点赞14次,收藏5次。华为认证是华为技术实力的体现,也是个人职业竞争力的重要体现。通过华为认证,可以帮助我们更好地规划自己的职业发展道路,提升自己的专业技能和综合素质,为未来的职业发展打下坚实的基础。

java线程的中断(interrupt)_java interrupted-程序员宅基地

文章浏览阅读4.1k次,点赞5次,收藏15次。一个线程在未正常结束之前, 被强制终止是很危险的事情. 因为它可能带来完全预料不到的严重后果比如会带着自己所持有的锁而永远的休眠,迟迟不归还锁等。 所以你看到Thread.suspend, Thread.stop等方法都被Deprecated了那么不能直接把一个线程搞挂掉, 但有时候又有必要让一个线程死掉, 或者让它结束某种等待的状态 该怎么办呢?一个比较优雅而安全的做法是:使用等待/通知机制或者给那个线程一个中断信号, 让它自己决定该怎么办。这里我们理解线程中断的使用场景和使用时的注意事项,最后使_java interrupted

easyui中 form combobox datagrid 等有回显功能的对象方法 onBeforeLoad 获取当前对象_easyui onbeforeload-程序员宅基地

文章浏览阅读4.8k次。&lt;!DOCTYPE html&gt;&lt;html&gt; &lt;head&gt; &lt;meta charset="UTF-8"&gt; &lt;title&gt;Validate Form on Submit - jQuery EasyUI Demo&lt;/title&gt; &lt;link rel=&qu_easyui onbeforeload

arcgis学习系列-6查询FeatureLayer_arcgis 4.x featurelayer query-程序员宅基地

文章浏览阅读435次。概述本文你将学习:如何对feature图层进行查询并添加图层到地图中。使用arcgis for javascript 你可以查询feature layer为你的应用程序检索一个子数据集。在这个方案中图层被引用但是没有加载到地图中。查询可以包含一个sql的where子句,几何特征和空间关系。创建Query之后,将其传递给Query Task,以便从feature层检索数据。当features返..._arcgis 4.x featurelayer query