当前位置: 首页 > 知识库问答 >
问题:

python - 为什么Python爬虫对一个网站一发请求就被封ip?

戴霖
2023-07-02

最近试着爬一个网站,只要一对这个网站用request请求,网站立马封ip,这是怎么回事,是网站太严了还是代码的问题,代码如下,新手爬虫

from lxml import etree

import requests

if __name__ == "__main__":

url = "********************"

headers = {

"User-Agent": "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.49",

}

response = requests.get(url, headers).text #content

print(response)

共有2个答案

洪和平
2023-07-02

反爬机制导致的。

使用 devtools,尽可能模仿用户从浏览器访问时候会携带的东西。如果爬取量很大,要么降低爬取频率,要么使用 IP 池。

任何网站的反爬策略都会尽量不影响正常用户的访问。

公西修文
2023-07-02

由于你的url被模糊了,所以我无法判断你想爬取的网址具体情况是否是怎样的。因此,我从爬虫机制常见的安全角度谈一谈。
首先,网站可能会允许爬取内容,比如知名的是中国天气网,这类网站通常会作为一些信息技术,爬虫或者安全教材里的案例实践。
当然绝大部分是不允许爬取内容的,涉及到一个版权违规甚至是违法的问题,举个最直观的例子,“国内最先进的技术社区之一”:思否技术社区,没错,也就是我们现在交流的这个网站里。所以技术探讨要符合规范,法律。不要越界。
R-C.jpg
聊完法律规范,再聊这段代码本身的问题,爬虫的设计思路一般是先通过浏览器模拟正常访问,能否成功获取到想要的数据,再进行代码爬取。因此,可以尝试加入代理、更改 User-Agent、添加请求间隔等反爬虫措施

import requests
import random
import time

url = "**********"

user_agents_list = [
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36",
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36",
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36",
]

proxies_list = [
    {
        "http": "http://127.0.0.1:1080",
        "https": "http://127.0.0.1:1080",
    },
    {
        "http": "http://127.0.0.1:1081",
        "https": "http://127.0.0.1:1081",
    },
    # more proxies here
]

for i in range(3):
    try:
        user_agent = random.choice(user_agents_list)
        proxies = random.choice(proxies_list)

        headers = {
            "User-Agent": user_agent,
        }

        response = requests.get(url, headers=headers, proxies=proxies, timeout=5)

        print(response.text)

        time.sleep(random.uniform(0.5, 3)) # 请求间隔时间,随机取 0.5 至 3 秒之间的值

    except requests.exceptions.RequestException as e:
        print(e)
        print("Connection failed, retrying...")
        time.sleep(random.uniform(1, 3)) # 连接失败时候重试间隔时间,随机取 1 至 3 秒之间的值

这里的代理和 user-agent 只是单纯的示例,如果你有更可靠的代理池和 user-agent 池,可以使用更高质量的代理和 user-agent 来避免被反爬虫策略封禁。

 类似资料:
  • 原始content: decode('utf-8')报错: UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe8 in position 1: invalid continuation byte decode('utf-8', 'ignore'): decode('gbk', 'ignore'): decode('utf-16', 'ig

  • 主要内容:获取网页html信息,常用方法本节编写一个最简单的爬虫程序,作为学习 Python 爬虫前的开胃小菜。 下面使用 Python 内置的 urllib 库获取网页的 html 信息。注意,urllib 库属于 Python 的标准库模块,无须单独安装,它是 Python 爬虫的常用模块。 获取网页html信息 1) 获取响应对象 向百度( http://www.baidu.com/)发起请求,获取百度首页的 HTML 信息,代码

  • 本文向大家介绍Python爬虫爬取美剧网站的实现代码,包括了Python爬虫爬取美剧网站的实现代码的使用技巧和注意事项,需要的朋友参考一下 一直有爱看美剧的习惯,一方面锻炼一下英语听力,一方面打发一下时间。之前是能在视频网站上面在线看的,可是自从广电总局的限制令之后,进口的美剧英剧等貌似就不在像以前一样同步更新了。但是,作为一个宅diao的我又怎甘心没剧追呢,所以网上随便查了一下就找到一个能用迅雷

  • 本文向大家介绍python爬虫实现爬取同一个网站的多页数据的实例讲解,包括了python爬虫实现爬取同一个网站的多页数据的实例讲解的使用技巧和注意事项,需要的朋友参考一下 对于一个网站的图片、文字音视频等,如果我们一个个的下载,不仅浪费时间,而且很容易出错。Python爬虫帮助我们获取需要的数据,这个数据是可以快速批量的获取。本文小编带领大家通过python爬虫获取获取总页数并更改url的方法,实

  • Tornado 的 模块对于协程实现了异步的 生产者 / 消费者 模型, 实现了类似于 Python 标准库中线程中的 模块. 一个协程 yield 将会在队列中有值时暂停. 如果队列设置了最大值, 协程会 yield 暂停直到有空间来存放. 从零开始维护了一系列未完成的任务. 增加计数; 来减少它. 在这个网络爬虫的例子中, 队列开始仅包含 base_url. 当一个 worker 获取一个页面