前言

程序使用一段时间后会遇到HTTP Error 403: Forbidden错误。 因为在短时间内直接使用Get获取大量数据,会被服务器认为在对它进行攻击,所以拒绝我们的请求,自动把电脑IP封了。 解决这个问题有两种方法。一是将请求加以包装,变成浏览器请求模式,而不再是“赤裸裸”的请求。 但有时服务器是根据同一IP的请求频率来判断的,即使伪装成不同浏览器。由于是同一IP访问,还是会被封。 所以就有了第二种方法,就是降低请求频率。具体说来也有两种方法。一种是在每次请求时暂停短暂时间,从而降低请求频率。 第二种是使用不同的IP进行访问。显然第一种方法不是最佳选择。 因为我们并不希望下载太慢,尤其是在请求次数很多时。当然如果间隔很短时间,从感官上并无差别,如0.1秒。 但对于服务器而言频率就降低了很多。 所以这是一种最安全可靠的办法,尽管我们并不想用它。第二种方法也就是使用代理IP。下面逐一介绍。

1.增加Header

在浏览谷歌地图时会发现,浏览了大量数据依然没有被封IP,但程序中我们只下了几百张瓦片, 就被封了。主要原因是我们是直接Get请求数据,而浏览器的请求是有Header的。 基于这一点,把请求伪装成浏览器请求,就可以解决这个问题了。 代码如下:

# coding=utf-8
import urllib2 as ulb
import numpy as np
import PIL.ImageFile as ImageFile
import cv2
import random# 收集到的常用Header
my_headers = ["Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36","Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36","Mozilla/5.0 (Windows NT 6.1; WOW64; rv:30.0) Gecko/20100101 Firefox/30.0","Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.75.14 (KHTML, like Gecko) Version/7.0.3 Safari/537.75.14","Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Win64; x64; Trident/6.0)",'Mozilla/5.0 (Windows; U; Windows NT 5.1; it; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11','Opera/9.25 (Windows NT 5.1; U; en)','Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)','Mozilla/5.0 (compatible; Konqueror/3.5; Linux) KHTML/3.5.5 (like Gecko) (Kubuntu)','Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.12) Gecko/20070731 Ubuntu/dapper-security Firefox/1.5.0.12','Lynx/2.8.5rel.1 libwww-FM/2.14 SSL-MM/1.4.1 GNUTLS/1.2.9',"Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.7 (KHTML, like Gecko) Ubuntu/11.04 Chromium/16.0.912.77 Chrome/16.0.912.77 Safari/535.7","Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:10.0) Gecko/20100101 Firefox/10.0 "
]# 获取影像数据
def getImage(url):# 用urllib2库链接网络图像response = ulb.Request(url)# 随机选择一个Header伪装成浏览器response.add_header('User-Agent', random.choice(my_headers))# 打开网络图像文件句柄fp = ulb.urlopen(response)# 定义图像IOp = ImageFile.Parser()# 开始图像读取while 1:s = fp.read(1024)if not s:breakp.feed(s)# 得到图像im = p.close()# 将图像转换成numpy矩阵arr = np.array(im)# 将图像RGB通道变成BGR通道,用于OpenCV显示pic = np.zeros(arr.shape, np.uint8)pic[:, :, 0] = arr[:, :, 2]pic[:, :, 1] = arr[:, :, 1]pic[:, :, 2] = arr[:, :, 0]return picimg = getImage('https://static.fuwo.com/upload/attachment/1601/08/bea48ebeb5a811e58e9e00163e00254c.jpg')
cv2.imshow('image', img)
cv2.waitKey(0)

如下所示,获取到的网络上的图片:

但有时这样的做法也不一定有用。前面也说到,服务器是根据IP判断。 给请求增加Header只是伪装成不同的浏览器而已。如果同一个IP在短时间内频繁访问, 就算是浏览器请求也会被拒绝掉。因此对于这个问题就只好从另一个方面着手,即适当降低单个IP访问频率。 对于每个IP而言,每次请求操作之间都暂停一段时间。同时利用多个IP进行访问。通过这两种手段可以降低被拒绝的可能性。

2.代理IP

简单地说是通过自动更换不同IP来“迷惑”服务器,让它认为是来自不同电脑的访问请求, 从而不会被拒绝掉。由于代理IP的时效性很强,所以需要经常更换。最好是“现用现找”。代码如下:

# coding=utf-8
import urllib2 as ulb
import numpy as np
import PIL.ImageFile as ImageFile
import cv2
import random# 免费代理IP不能保证永久有效,如果不能用可以更新
# https://www.goubanjia.com/
proxy_list = ['183.95.80.102:8080','123.160.31.71:8080','115.231.128.79:8080','166.111.77.32:80','43.240.138.31:8080','218.201.98.196:3128'
]# 获取影像数据
def getImage(url):# 随机从IP列表中选择一个IPproxy = random.choice(proxy_list)# 基于选择的IP构建连接urlhandle = ulb.ProxyHandler({'http': proxy})opener = ulb.build_opener(urlhandle)ulb.install_opener(opener)# 用urllib2库链接网络图像response = ulb.Request(url)# 打开网络图像文件句柄fp = ulb.urlopen(response)# 定义图像IOp = ImageFile.Parser()# 开始图像读取while 1:s = fp.read(1024)if not s:breakp.feed(s)# 得到图像im = p.close()# 将图像转换成numpy矩阵arr = np.array(im)# 将图像RGB通道变成BGR通道,用于OpenCV显示pic = np.zeros(arr.shape, np.uint8)pic[:, :, 0] = arr[:, :, 2]pic[:, :, 1] = arr[:, :, 1]pic[:, :, 2] = arr[:, :, 0]return picimg = getImage('https://mt2.google.cn/vt/lyrs=s&hl=zh-CN&gl=CN&x=214345&y=107714&z=18')
cv2.imshow('image', img)
cv2.waitKey(0)

在之前由于过多使用,导致本机IP被封,所以无法访问Google地图瓦片,出现如下提示。

运行这段代码后,就可以成功获取瓦片,如下所示:

这样就成功解决访问瓦片403问题了。代码列表中的IP就是在这里找的。 网站中还有更多付费的高级功能,如果有需要也可以购买。这里只是简单测试,就不买了。

3.终极方法

说了上面两种方法后,很自然地就会想到把两种方法结合起来。这样就会大大提高请求的种类。 如在下面的代码中Header有13个,IP有6个,排列组合就有78中请求。从理论上来说, 组合数越多就越不容易被封。同时再加上请求延迟,是较好的解决方案。

# coding=utf-8
import urllib2 as ulb
import numpy as np
import PIL.ImageFile as ImageFile
import cv2
import random
import time# 免费代理IP不能保证永久有效,如果不能用可以更新
# https://www.goubanjia.com/
proxy_list = ['183.95.80.102:8080','123.160.31.71:8080','115.231.128.79:8080','166.111.77.32:80','43.240.138.31:8080','218.201.98.196:3128'
]# 收集到的常用Header
my_headers = ["Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36","Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36","Mozilla/5.0 (Windows NT 6.1; WOW64; rv:30.0) Gecko/20100101 Firefox/30.0","Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.75.14 (KHTML, like Gecko) Version/7.0.3 Safari/537.75.14","Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Win64; x64; Trident/6.0)",'Mozilla/5.0 (Windows; U; Windows NT 5.1; it; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11','Opera/9.25 (Windows NT 5.1; U; en)','Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)','Mozilla/5.0 (compatible; Konqueror/3.5; Linux) KHTML/3.5.5 (like Gecko) (Kubuntu)','Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.12) Gecko/20070731 Ubuntu/dapper-security Firefox/1.5.0.12','Lynx/2.8.5rel.1 libwww-FM/2.14 SSL-MM/1.4.1 GNUTLS/1.2.9',"Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.7 (KHTML, like Gecko) Ubuntu/11.04 Chromium/16.0.912.77 Chrome/16.0.912.77 Safari/535.7","Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:10.0) Gecko/20100101 Firefox/10.0 "
]# 获取影像数据
def getImage(url):# 设置暂停时间为0.1秒t = 0.1time.sleep(t)# 随机从列表中选择IP、Headerproxy = random.choice(proxy_list)header = random.choice(my_headers)print proxy, header# 基于选择的IP构建连接urlhandle = ulb.ProxyHandler({'http': proxy})opener = ulb.build_opener(urlhandle)ulb.install_opener(opener)# 用urllib2库链接网络图像response = ulb.Request(url)# 增加Header伪装成浏览器response.add_header('User-Agent', header)# 打开网络图像文件句柄fp = ulb.urlopen(response)# 定义图像IOp = ImageFile.Parser()# 开始图像读取while 1:s = fp.read(1024)if not s:breakp.feed(s)# 得到图像im = p.close()# 将图像转换成numpy矩阵arr = np.array(im)# 将图像RGB通道变成BGR通道,用于OpenCV显示pic = np.zeros(arr.shape, np.uint8)pic[:, :, 0] = arr[:, :, 2]pic[:, :, 1] = arr[:, :, 1]pic[:, :, 2] = arr[:, :, 0]return picimg = getImage('https://mt2.google.cn/vt/lyrs=s&hl=zh-CN&gl=CN&x=214345&y=107714&z=18')
cv2.imshow('image', img)
cv2.waitKey(0)

上述代码中,将每一次使用的代理IP、Header都输出到了控制台中,利用for循环连续获取15次。 输出的结果如下:

在上述代码中使用了请求伪装、代理IP和请求延迟。 可以看到效果很好,15次请求都没有被拒绝。以上这些手段只是增加了不被服务器拒绝的概率, 并不代表一定会成功。但相比于不加任何处理的请求,成功几率高很多。

Python爬虫403错误的解决方案相关推荐

  1. python爬虫 403 Forbidden 解决方法

    python爬虫 403 Forbidden 解决方法 参考文章: (1)python爬虫 403 Forbidden 解决方法 (2)https://www.cnblogs.com/tian-sun ...

  2. Python爬虫被封ip解决方案

    在使用 Python 程序进行网络爬虫开发时,可能因以下原因导致被封 IP 或封禁爬虫程序: 1.频繁访问网站 爬虫程序可能会在很短的时间内访问网站很多次,从而对目标网站造成较大的负担和压力,这种行为 ...

  3. python爬虫ssl错误_Python爬虫:Requests的SSLError:certificate verify failed问题解决方案6条...

    问题:脚本是用Python写的,用到开源库play-scraper,调用其collectionAPI来获取Google Play的Top App列表.该库使用了requests作为客户端来对Googl ...

  4. 使用爬虫代理错误问题解决方案

    在如今的互联网时代,网络爬虫成了许多企业的重要岗位之一.当然在数据采集中会遇到各种问题,例如限制IP,出现访问验证码等.这种时候就需要各种反爬策略和使用HTTP代理去解决问题.在爬虫用在使用代理的时候 ...

  5. python 爬虫 requests 错误汇总

    1.发生异常: ProxyError HTTPSConnectionPool(host='www.baidu.com', port=443): Max retries exceeded with ur ...

  6. python爬虫安装错误与解决方式

    # 安装错误: error:Microsoft Visual C++ 14.0 is required... 下载地址:http://www.lfd.uci.edu/~gohlke/pythonlib ...

  7. 网站403错误解决方案

    有一次在宝塔中不小心修改了网站的运行目录,一开始没有什么事情,但是!当我重启了 Apache 服务时,出现了403错误!我怀疑是 httpd.conf 被我不小心修改错了,但是网上的解决方案大部分和我 ...

  8. python爬虫遇到403错误

    这段时间我很想去p站爬一爬,之前有试过,但都失败了,有一次用phantomJS尝试,结果卡死在登录页面,太复杂了.有一次卡死在编码上,一直无法获取到页面.这次是卡死在403上,我获取了图片的链接,正要 ...

  9. python token post403原因_Django中ajax发送post请求 报403错误CSRF验证失败解决方案

    前言 今天学习Django框架,用ajax向后台发送post请求,直接报了403错误,说CSRF验证失败:先前用模板的话都是在里面加一个 {% csrf_token %} 就直接搞定了CSRF的问题了 ...

最新文章

  1. SQL中IN与EXISTS的比较
  2. myeclipse使用git图文教程
  3. oracle 拼接_老品牌福建泉州49寸液晶拼接屏多少钱品质
  4. C#LeetCode刷题之#415-字符串相加(Add Strings)
  5. 对方服务器未响应,重新投递中 postfix手心,我配置的Postfix邮件服务器邮件发不出去,在mail.log里显示如下~请求帮助...
  6. 面试题_翻转句子中单词的顺序
  7. ZooKeeper、Eureka、Consul 、Nacos,微服务注册中心怎么选?
  8. 函数名应用,闭包,装饰器初识
  9. [转载] 七龙珠第一部——第068话 最后的龙珠
  10. hadoop+hbase安装
  11. mysql索引,索引结构,索引类型,索引失效
  12. CAD制图初学入门 零基础学CAD要掌握技能精选
  13. Python_阿基米德浮力问题
  14. 怎样下载安装python编程软件3.85_【Python下载】Python安装 v3.8.1 官方版-七喜软件园...
  15. 微信小程序商城篇(一)首页功能
  16. android模拟power键,android 发送模拟按键
  17. 微信公众号获取用户信息(新)
  18. python实现人脸识别(face_recognition)
  19. 118 Servlet_1 _Tomcat服务器
  20. mysql数据库1067错误解决方法

热门文章

  1. 【luogu AGC035E】Develop(分类讨论)(DP)
  2. 重磅快讯:《大数据》入选CCF推荐中文科技期刊目录!
  3. 零基础学Python(全彩版)
  4. 啊哈C!思考快你一步——用编程轻松提升逻辑力
  5. 十二届蓝桥杯省赛c++(下)
  6. 压力测试中 4 个常见面试题总结
  7. bfs优化技巧——键盘输入
  8. php采购系统,jsp2161采购管理系统mysql
  9. golang原生数据库的使用
  10. 抖音旅游号视频文案技巧