Python爬虫403错误的解决方案

news2024/11/27 16:45:38

前言

程序使用一段时间后会遇到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)

    # 定义图像IO
    p = ImageFile.Parser()

    # 开始图像读取
    while 1:
        s = fp.read(1024)
        if not s:
            break
        p.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 pic


img = 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列表中选择一个IP
    proxy = 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)

    # 定义图像IO
    p = ImageFile.Parser()

    # 开始图像读取
    while 1:
        s = fp.read(1024)
        if not s:
            break
        p.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 pic


img = 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.1
    time.sleep(t)

    # 随机从列表中选择IP、Header
    proxy = 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)

    # 定义图像IO
    p = ImageFile.Parser()

    # 开始图像读取
    while 1:
        s = fp.read(1024)
        if not s:
            break
        p.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 pic


img = 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次请求都没有被拒绝。以上这些手段只是增加了不被服务器拒绝的概率, 并不代表一定会成功。但相比于不加任何处理的请求,成功几率高很多。

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

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

相关文章

1.浮动float

提示:如果多一个盒子(都设置浮动,则它们会按照属性值一行内显示并且顶端对齐排列) 注意: 浮动的元素是互相贴靠在一起的,(没有缝隙),如果父级宽度装下这些浮动盒子&#…

MyBatis 详解 (2) -- 增删改操作

MyBatis 详解 2 -- 增删改操作前言一、准备工作1.1 创建数据库和表1.2 添加实体类1.3 添加 mapper 接口 (数据持久层)1.4 创建与接口对应的 xml 文件二、增加操作2.1 默认返回受影响的行数2.2 特殊的新增:返回自增 id三、删除操作四、修改操作五、实现完整交互5.1 添…

爆肝9万字,我已从小白晋升ARM嵌入式工程师!带你从零熟悉常用的M4嵌入式功能,建议收藏(含码源)

📚 前言 📑博客主页:丘比特惩罚陆 💖欢迎关注:点赞收藏⭐留言✒ 💬系列专栏:web前端、嵌入式、笔记专栏 🎮 加入社区: 丘比特惩罚陆 🥇人生格言:选…

【教学赛】金融数据分析赛题1:银行客户认购产品预测(0.9676)

本文是对天池教学赛,银行客户认购产品预测的记录,教学赛网址如下: 【教学赛】金融数据分析赛题1:银行客户认购产品预测_学习赛_天池大赛-阿里云天池 1. 读取数据 import pandas as pd# 加载数据 train pd.read_csv(train.csv) …

P5587 打字练习————C++

题目 打字练习 题目描述 R 君在练习打字。 有这样一个打字练习网站,给定一个范文和输入框,会根据你的输入计算准确率和打字速度。可以输入的字符有小写字母、空格和 .(英文句号),输入字符后,光标也会跟…

c语言小练pintia11-20

11.计算平均分已知某位学生的数学、英语和计算机课程的成绩分别是87分、72分和93分,求该生3门课程的平均成绩(结果按整型输出)。输入格式:本题无输入输出格式:按照下列格式输出结果:math 87, eng 72, com…

深耕地市区县市场,新华三智行中国走新路

2022年就这样结束了,但是企业数字化的进程从未结束。回顾这一年,对于任何企业而言,数字化优先的战略仍然在继续。不仅如此,数字化走向地市区县市场,带来了更多的机遇和发展,让我们看到了中国的数字经济还有…

Flurry iOS端调研和使用

Flurry iOS端调研使用 flurry官方资料较少,且只有英文文档没有代码demo。公司项目确定要用Flurry,所以深入调研,顺便记录过程。有需要的小伙伴也可以顺便参考 一.创建应用拿api_key 官网:https://www.flurry.com/ 用邮箱去官网…

【目标检测】55、YOLOv8 | YOLOv5 团队 Ultralytics 再次出手,又实现了 SOTA

文章目录一、YOLO 系列算法的简单回顾二、YOLOv8 简介2.1 安装和简单使用2.2 Ultralytics HUB2.2.1 Upload Dataset2.3 YOLOv8 主要改动三、YOLOv8 细节详述论文:暂无 官方文档:https://docs.ultralytics.com/ 代码:https://github.com/ult…

【算法数据结构初阶篇】:链表问题

一、反转单双链表 一、数据结构图 二、代码演示 public class Code01_ReverseList {public static class Node {public int value;public Node next;public Node(int data) {value data;}}public static class DoubleNode {public int value;public DoubleNode last;public …

Spring Cloud Gateway从注册中心自动注册配置路由信息

环境信息Spring Boot:2.0.8.RELEASESpring Boot内置的tomcat:tomcat-embed-core 8.5.37Spring Cloud Gateway:2.0.4.RELEASENacos:2.0.4.RELEASE需求Spring Cloud Gateway注册到注册中心(这里是Nacos,其它注…

Spring学习系列(二)

Spring_特殊值的注入问题和各种类型的自动装配1.set两种方式的区别第4中赋值方式:自动装配(只适用于ref类型)使用注解定义bean1.set两种方式的区别 (1)把值写到value属性里面,必须加引号,写到子…

【学习】计算机系统硬件和数据结构

学习内容描述: 1、CPU包含哪些部分? 2、数据结构基础知识。 重点知识: 1、CPU(中央处理器,Central Processing Unit) 主要包括运算器、控制器两大部件;内部结构包含控制单元、运算单元、存储单元和时钟等几个主要部…

虚拟直播(虚拟场景直播)要怎么做?

阿酷TONY / 2022-11-21 / 长沙 绿幕抠像 虚拟场景(三维场景)实时渲染,来一场虚拟直播。 附案例效果:PC端案例、移动端案例效果。 目录 1. 绿幕虚拟直播间 2. 虚拟场景(炫酷舞台) 3. 案例:PC端 4. 案例&#xff1a…

光纤内窥镜物镜光学设计

光纤内窥镜物镜光学设计 工作原理 典型的光纤传像束内窥镜主要由前置物镜、光纤传像束、目镜/耦接镜、 探测器等组成,如图1所示。通过物镜把目标成像于光纤传像束的前端面上,该端面上的图像被离散分布的大量光纤采样,每根光纤都有良好的光学…

[极客大挑战 2019]Upload

目录 解题步骤 常见的绕过思路 解题步骤 直接上传shell 回显:Not image! bp抓包 修改类型 Content-Type: application/octet-stream改为Content-Type: image/jpg 回显:NOT!php! 修改后缀为phtml 回显:NO! HACKER! your file inc…

SAP MM 物料分类账的启用配置

一、前言 物料账就是一本账,管理物料的数量和价值。 通常物料有两种计价方法: 移动平均价V(移动加权平均) 标准价S 移动平均价的优点:能够及时响应市场原材料价格的波动。 价差科目(总账科目)…

MyBatis-Plus基本操作

依赖 <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.3</version> </dependency>基础操作 DAO层 public interface UserMapper extends BaseMapper<User…

nohup + 命令实现后台不挂断地运行程序

nohup&#xff1a; nohup&#xff1a;不挂断地运行程序&#xff0c;就是即便关闭终端的窗口&#xff0c;程序还会继续执行。 $ nohup python merge_reasons.py可以看到终端仍在被占用&#xff0c;同级目录下生成了一个nohup.out文件&#xff0c;本来输出到终端的信息&#xf…

python人工智能数据算法(下)

文章目录差分法逼近微分背景引入差分法简介差分的不同形式及其代码实现蒙特卡罗方法背景引入蒙特卡罗方法原理蒙特卡罗方法应用计算圆周率计算定积分梯度下降算法算法简介方向导数与梯度梯度下降基于梯度下降算法的线性回归算法总结差分法逼近微分 背景引入 几乎所有的机器学…