注:此文章只用作技术讨论(请勿用作非法用途)
通常我们使用爬虫时,多次爬取或网站带有防爬虫等,本地ip就会得到禁封,为了实现避免 IP 封禁,我们需要使用代理服务器,并定期更换代理。下面是一个使用 Python 编写的爬虫示例:
import requests
from bs4 import BeautifulSoup
import random
import time
# 定义要爬取的网站的 URL
url = "https://www.baidu.com/"
# 定义代理服务器的 URL 列表
proxy_list = [
"http://xxx.xxxe.com",
"http://xxx2.xxxe.com",
"http://xxx3.xxxe.com"
]
# 设置请求头信息
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"
}
# 定义请求失败的最大重试次数
max_retry = 5
# 定义每次请求之间的间隔时间
interval = 5
# 定义当前使用的代理服务器
current_proxy = None
# 定义当前的重试次数
current_retry = 0
# 循环发送请求直到成功或达到最大重试次数
while current_retry < max_retry:
try:
# 随机选择一个代理服务器
current_proxy = random.choice(proxy_list)
# 发送 HTTP 请求并获取 HTML 内容
response = requests.get(url, headers=headers, proxies={"http": current_proxy, "https": current_proxy})
# 如果请求成功,退出循环
if response.status_code == 200:
break
except Exception as e:
# 如果请求失败,记录日志并重试
print("请求失败:", e)
current_retry += 1
time.sleep(interval)
# 如果达到最大重试次数仍然失败,抛出异常
if current_retry == max_retry:
raise Exception("请求失败次数过多")
# 使用 BeautifulSoup 解析 HTML 内容
soup = BeautifulSoup(response.content, "html.parser")
# 获取网站标题
title = soup.title.string
# 获取所有链接
links = []
for link in soup.find_all("a"):
href = link.get("href")
if href:
links.append(href)
# 打印结果
print("网站标题:", title)
print("所有链接:", links)
我们定义了一个代理服务器的 URL 列表,并随机选择一个代理服务器来发送 HTTP 请求。如果请求失败,我们将重试指定的最大次数,并在每次请求之间等待一定的时间。这将有助于避免被封禁。如果达到最大重试次数仍然失败,将抛出异常。
请注意,代理服务器的选择和使用需要谨慎处理,以避免遭受其他类型的封禁和安全风险。使用代理服务器时,请遵守相关规定和网站的条款和条件。