Python 爬虫如何伪装 Referer?从随机生成到动态匹配

本文涉及的产品
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
实时数仓Hologres,5000CU*H 100GB 3个月
实时计算 Flink 版,5000CU*H 3个月
简介: Python 爬虫如何伪装 Referer?从随机生成到动态匹配

一、Referer 的作用与重要性
Referer 是 HTTP 请求头中的一个字段,用于标识请求的来源页面。它在网站的正常运行中扮演着重要角色,例如用于统计流量来源、防止恶意链接等。然而,对于爬虫来说,Referer 也可能成为被识别为爬虫的关键因素之一。许多网站会检查 Referer 字段,如果发现请求头中缺少 Referer 或者 Referer 的值不符合预期,网站可能会拒绝服务或者返回错误信息。
因此,伪装 Referer 成为了爬虫开发者的重要任务。通过合理地设置 Referer,可以降低爬虫被检测到的风险,提高数据采集的成功率。
二、随机生成 Referer
随机生成 Referer 是一种简单但有效的伪装方法。通过生成一些常见的、看似合法的 Referer 值,可以欺骗网站的反爬虫机制。以下是一个使用 Python 实现随机生成 Referer 的示例代码:
```import random

定义一些常见的 Referer 值

referer_list = [
"https://www.google.com",
"https://www.bing.com",
"https://www.baidu.com",
"https://www.sogou.com",
"https://www.yahoo.com",
"https://www.duckduckgo.com",
"https://www.yandex.com",
"https://www.bing.com/search?q=python+爬虫",
"https://www.google.com/search?q=python+爬虫",
"https://www.sogou.com/web?query=python+爬虫",
"https://www.baidu.com/s?wd=python+爬虫",
"https://www.yandex.com/search/?text=python+爬虫",
"https://www.duckduckgo.com/?q=python+爬虫"
]

随机选择一个 Referer

def random_referer():
return random.choice(referer_list)

使用 requests 库发送请求

import requests

def fetch_with_random_referer(url):
headers = {
"Referer": random_referer(),
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3"
}
response = requests.get(url, headers=headers)
return response

测试

url = "https://example.com"
response = fetch_with_random_referer(url)
print(response.status_code)
print(response.headers)



代码解析
1. 定义 Referer 列表:我们定义了一个包含常见搜索引擎和搜索结果页面的 Referer 列表。这些 Referer 值看起来像是用户通过搜索引擎访问目标页面的来源。
2. 随机选择 Referer:通过 random.choice() 方法从列表中随机选择一个 Referer 值。
3. 发送请求:使用 requests 库发送 HTTP 请求时,将随机选择的 Referer 添加到请求头中。同时,我们还添加了一个常见的 User-Agent,以进一步伪装请求。
优点
● 简单易实现:随机生成 Referer 的方法非常简单,只需要定义一个 Referer 列表并随机选择即可。
● 成本低:不需要复杂的逻辑和额外的资源,适合初学者快速上手。
缺点
● 容易被识别:虽然随机生成的 Referer 可以欺骗一些简单的反爬虫机制,但对于复杂的网站,这种方法可能很容易被识别。因为随机生成的 Referer 可能与实际的用户行为模式不一致。
三、动态匹配 Referer
为了进一步提高伪装效果,我们可以采用动态匹配 Referer 的方法。动态匹配是指根据目标网站的页面结构和链接关系,动态生成合理的 Referer 值。这种方法需要对目标网站的结构进行分析,并根据实际的用户行为路径生成 Referer。
以下是一个动态匹配 Referer 的实现示例:
```import requests
from bs4 import BeautifulSoup

# 获取目标页面的链接
def get_links(url):
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3"
    }
    response = requests.get(url, headers=headers)
    soup = BeautifulSoup(response.text, "html.parser")
    links = []
    for link in soup.find_all("a", href=True):
        links.append(link["href"])
    return links

# 动态生成 Referer
def dynamic_referer(url, links):
    # 选择一个与目标页面相关的链接作为 Referer
    referer = random.choice(links)
    if not referer.startswith("http"):
        referer = url + referer
    return referer

# 使用动态 Referer 发送请求
def fetch_with_dynamic_referer(url):
    links = get_links(url)
    referer = dynamic_referer(url, links)
    headers = {
        "Referer": referer,
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3"
    }
    response = requests.get(url, headers=headers)
    return response

# 测试
url = "https://example.com"
response = fetch_with_dynamic_referer(url)
print(response.status_code)
print(response.headers)

代码解析

  1. 获取目标页面的链接:使用 requests 和 BeautifulSoup 库获取目标页面的 HTML 内容,并解析出页面中的所有链接。
  2. 动态生成 Referer:从获取到的链接列表中随机选择一个链接作为 Referer 值。如果链接是相对路径,则将其转换为绝对路径。
  3. 发送请求:将动态生成的 Referer 添加到请求头中,并发送请求。
    优点
    ● 伪装效果更好:动态生成的 Referer 更符合实际的用户行为模式,因为它是根据目标页面的实际链接关系生成的。
    ● 适应性强:这种方法可以根据不同的目标网站动态调整 Referer,具有较强的适应性。
    缺点
    ● 实现复杂:需要对目标网站的结构进行分析,并且需要解析 HTML 内容,实现成本较高。
    ● 性能问题:动态生成 Referer 的过程需要额外的网络请求和解析操作,可能会对爬虫的性能产生一定影响。
    四、结合代理和 IP 池
    除了伪装 Referer,结合代理和 IP 池可以进一步提高爬虫的伪装效果和稳定性。代理服务器可以隐藏爬虫的真实 IP 地址,而 IP 池可以提供多个代理 IP,避免因频繁访问而被封禁。
    以下是一个结合代理和 IP 池的实现示例:
    ```import random
    import requests
    from requests.auth import HTTPProxyAuth

定义代理服务器信息

proxyHost = "www.16yun.cn"
proxyPort = "5445"
proxyUser = "16QMSOML"
proxyPass = "280651"

构造代理地址

proxy_url = f"http://{proxyHost}:{proxyPort}"

定义代理认证信息

proxy_auth = HTTPProxyAuth(proxyUser, proxyPass)

动态生成 Referer(假设 get_links 和 dynamic_referer 函数已定义)

def get_links(url):
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3"
}
response = requests.get(url, headers=headers, proxies={"http": proxy_url, "https": proxy_url}, auth=proxy_auth)
soup = BeautifulSoup(response.text, "html.parser")
links = []
for link in soup.find_all("a", href=True):
links.append(link["href"])
return links

def dynamic_referer(url, links):
referer = random.choice(links)
if not referer.startswith("http"):
referer = url + referer
return referer

使用动态 Referer 和代理发送请求

def fetch_with_proxy_and_referer(url):
links = get_links(url)
referer = dynamic_referer(url, links)
headers = {
"Referer": referer,
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3"
}
proxies = {
"http": proxy_url,
"https": proxy_url
}
response = requests.get(url, headers=headers, proxies=proxies, auth=proxy_auth)
return response

测试

url = "https://example.com"
response = fetch_with_proxy_and_referer(url)
print(response.status_code)
print(response.headers)
```

代码解析

  1. 定义代理 IP 池:定义一个包含多个代理 IP 的列表。
  2. 随机选择代理:通过 random.choice() 方法从代理 IP 池中随机选择一个代理。
  3. 发送请求:将动态生成的 Referer 和随机选择的代理添加到请求中,并发送请求。
    优点
    ● 伪装效果更强:结合代理和 IP 池可以同时隐藏爬虫的真实 IP 地址和伪装 Referer,大大提高了伪装效果。
    ● 稳定性更高:使用 IP 池可以避免因频繁访问而被封禁,提高了爬虫的稳定性。
    总结
    伪装 Referer 是 Python 爬虫中应对反爬虫机制的重要手段之一。通过随机生成 Referer 和动态匹配 Referer,可以有效降低爬虫被检测到的风险。结合代理和 IP 池,可以进一步提高爬虫的伪装效果和稳定性。在实际应用中,开发者需要根据目标网站的反爬虫机制和自身的需求,选择合适的伪装方法。
相关文章
|
26天前
|
数据采集 存储 开发者
如何动态调整Python爬虫的Request请求延迟
如何动态调整Python爬虫的Request请求延迟
|
23天前
|
数据采集 NoSQL 关系型数据库
Python爬虫去重策略:增量爬取与历史数据比对
Python爬虫去重策略:增量爬取与历史数据比对
|
9天前
|
数据采集 Web App开发 前端开发
Python爬虫中time.sleep()与动态加载的配合使用
Python爬虫中time.sleep()与动态加载的配合使用
|
10天前
|
数据采集 存储 NoSQL
分布式爬虫去重:Python + Redis实现高效URL去重
分布式爬虫去重:Python + Redis实现高效URL去重
|
18天前
|
数据采集 XML 存储
Headers池技术在Python爬虫反反爬中的应用
Headers池技术在Python爬虫反反爬中的应用
|
6月前
|
数据采集 存储 JSON
Python网络爬虫:Scrapy框架的实战应用与技巧分享
【10月更文挑战第27天】本文介绍了Python网络爬虫Scrapy框架的实战应用与技巧。首先讲解了如何创建Scrapy项目、定义爬虫、处理JSON响应、设置User-Agent和代理,以及存储爬取的数据。通过具体示例,帮助读者掌握Scrapy的核心功能和使用方法,提升数据采集效率。
293 6
|
6月前
|
数据采集 前端开发 中间件
Python网络爬虫:Scrapy框架的实战应用与技巧分享
【10月更文挑战第26天】Python是一种强大的编程语言,在数据抓取和网络爬虫领域应用广泛。Scrapy作为高效灵活的爬虫框架,为开发者提供了强大的工具集。本文通过实战案例,详细解析Scrapy框架的应用与技巧,并附上示例代码。文章介绍了Scrapy的基本概念、创建项目、编写简单爬虫、高级特性和技巧等内容。
281 4
|
9月前
|
数据采集 存储 中间件
Python进行网络爬虫:Scrapy框架的实践
【8月更文挑战第17天】网络爬虫是自动化程序,用于从互联网收集信息。Python凭借其丰富的库和框架成为构建爬虫的首选语言。Scrapy作为一款流行的开源框架,简化了爬虫开发过程。本文介绍如何使用Python和Scrapy构建简单爬虫:首先安装Scrapy,接着创建新项目并定义爬虫,指定起始URL和解析逻辑。运行爬虫可将数据保存为JSON文件或存储到数据库。此外,Scrapy支持高级功能如中间件定制、分布式爬取、动态页面渲染等。在实践中需遵循最佳规范,如尊重robots.txt协议、合理设置爬取速度等。通过本文,读者将掌握Scrapy基础并了解如何高效地进行网络数据采集。
358 6
|
9月前
|
数据采集 存储 JSON
Python爬虫开发:BeautifulSoup、Scrapy入门
在现代网络开发中,网络爬虫是一个非常重要的工具。它可以自动化地从网页中提取数据,并且可以用于各种用途,如数据收集、信息聚合和内容监控等。在Python中,有多个库可以用于爬虫开发,其中BeautifulSoup和Scrapy是两个非常流行的选择。本篇文章将详细介绍这两个库,并提供一个综合详细的例子,展示如何使用它们来进行网页数据爬取。
|
数据采集 JSON 前端开发
Python爬虫进阶:使用Scrapy库进行数据提取和处理
在我们的初级教程中,我们介绍了如何使用Scrapy创建和运行一个简单的爬虫。在这篇文章中,我们将深入了解Scrapy的强大功能,学习如何使用Scrapy提取和处理数据。