嗨嗨嗨,兄弟姐妹们。我是喔的嘛呀。今天的学习内容是:爬虫 urllib代理和代理池
目录
一、爬虫 urllib——代理
二、爬虫 urllib——代理池
一、爬虫 urllib——代理
在 Python爬虫 中,可以使用 urllib
库来发送 HTTP 请求,从而实现网络爬虫功能。使用代理(Proxy)可以隐藏真实 IP 地址,防止被目标网站封禁或限制访问频率。下面是使用 urllib
库发送带代理的 HTTP 请求的示例代码:
from urllib import request
# 代理地址,格式为 <http://host>:port
proxy_address = 'http://your_proxy_host:your_proxy_port'
# 构建代理处理器
proxy_handler = request.ProxyHandler({'http': proxy_address})
# 创建Opener
opener = request.build_opener(proxy_handler)
# 安装Opener
request.install_opener(opener)
# 发送请求
response = request.urlopen('<http://www.example.com>')
# 输出响应内容
print(response.read().decode('utf-8'))
在上面的代码中,首先构建了一个代理处理器 proxy_handler
,指定了代理地址 proxy_address
,然后通过 build_opener
创建了一个 Opener,并通过 install_opener
安装 Opener,使得后续的请求都会使用这个 Opener 发送。最后使用 urlopen
发送带有代理的请求,获取并输出响应内容。
请注意,使用代理需要注意代理服务器的稳定性和合法性,不当使用可能会触犯相关法律法规。
案例:
展示如何使用代理 IP 来爬取豆瓣电影 Top 250 的数据。请注意,豆瓣网站有反爬虫机制,使用代理 IP 可以帮助降低被封禁的风险。(主要演示如何使用代理)
from urllib import request
from bs4 import BeautifulSoup
import random
import time
# 代理地址,格式为 <http://host>:port 需要自己在网站上购买,或者找能够免费使用的(质量不高,不稳定)
proxy_address = 'http://your_proxy_host:your_proxy_port'
# 豆瓣电影 Top 250 的 URL
url = '<https://movie.douban.com/top250>'
# 用户代理列表,模拟不同浏览器的访问
user_agents = [
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36',
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36',
'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:86.0) Gecko/20100101 Firefox/86.0',
'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:85.0) Gecko/20100101 Firefox/85.0',
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36'
]
# 设置代理和随机用户代理
proxy_handler = request.ProxyHandler({'http': proxy_address})
opener = request.build_opener(proxy_handler)
opener.addheaders = [('User-Agent', random.choice(user_agents))]
request.install_opener(opener)
# 发送请求
response = request.urlopen(url)
# 解析HTML内容
soup = BeautifulSoup(response.read(), 'html.parser')
movies = soup.find_all('div', class_='hd')
# 输出电影名字和链接
for movie in movies:
movie_name = movie.a.span.text
movie_link = movie.a['href']
print(f'电影名字:{movie_name}\\n链接:{movie_link}\\n\\n')
# 模拟爬取过程
for i in range(5):
print(f"模拟第{i+1}次爬取...")
time.sleep(random.randint(1, 3))
在这个示例中,我们使用了一个代理服务器(proxy_address
),并通过随机选择用户代理(User-Agent)来发送请求。我们爬取了豆瓣电影 Top 250 的页面,并提取了每部电影的名字和链接信息。为了模拟更真实的访问行为,我们添加了一个简单的循环,模拟多次爬取过程,并在每次爬取之间随机等待一段时间。
二、爬虫 urllib——代理池
使用代理池进行爬虫可以帮助我们更好地隐藏真实 IP 地址、绕过访问限制或提高访问速度。下面是一个使用代理池的详细示例,展示了如何使用 urllib
库和代理池进行网页爬取:
from urllib import request
import random
# 代理池,包含多个代理地址
proxy_pool = [
'<http://proxy1.example.com>:port',
'<http://proxy2.example.com>:port',
'<http://proxy3.example.com>:port'
]
# 从代理池中随机选择一个代理
proxy = random.choice(proxy_pool)
proxy_handler = request.ProxyHandler({'http': proxy})
# 创建Opener并安装
opener = request.build_opener(proxy_handler)
request.install_opener(opener)
# 发送请求
url = '<https://www.example.com>'
response = request.urlopen(url)
# 读取并打印响应内容
print(response.read().decode('utf-8'))
在这个示例中,我们首先定义了一个代理池 proxy_pool
,包含了多个代理地址。然后,我们随机选择了一个代理地址,并使用 ProxyHandler
创建了代理处理器。接着,我们创建了一个 Opener,并安装了代理处理器。最后,我们发送了一个请求到指定的 URL,并读取并打印了响应内容。
需要注意的是,使用代理池时应该遵守网站的爬取规则,避免对网站造成不必要的负担。
以下是一个示例,展示如何使用代理池和 urllib
库来爬取网站的内容,并处理可能的异常情况,同时设置了请求头和超时时间:
from urllib import request, error
import random
import time
# 代理池,包含多个代理地址
proxy_pool = [
'<http://proxy1.example.com>:port',
'<http://proxy2.example.com>:port',
'<http://proxy3.example.com>:port'
]
# 用户代理列表,模拟不同浏览器的访问
user_agents = [
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36',
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36',
'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:86.0) Gecko/20100101 Firefox/86.0',
'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:85.0) Gecko/20100101 Firefox/85.0',
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36'
]
# 设置超时时间(秒)
timeout = 10
# 最大重试次数
max_retries = 3
# 从代理池中随机选择一个代理
proxy = random.choice(proxy_pool)
proxy_handler = request.ProxyHandler({'http': proxy})
# 随机选择一个用户代理
user_agent = random.choice(user_agents)
# 创建Opener并安装
opener = request.build_opener(proxy_handler)
opener.addheaders = [('User-Agent', user_agent)]
request.install_opener(opener)
# 网站 URL
url = '<https://www.example.com>'
# 记录重试次数
retries = 0
while retries < max_retries:
try:
# 发送请求
response = request.urlopen(url, timeout=timeout)
# 读取并打印响应内容
print(response.read().decode('utf-8'))
break
except error.HTTPError as e:
print(f"HTTPError: {e.code} - {e.reason}")
except error.URLError as e:
print(f"URLError: {e.reason}")
except Exception as e:
print(f"Error: {e}")
# 等待一段时间后重试
time.sleep(1)
retries += 1
if retries == max_retries:
print("Reached maximum number of retries. Failed to retrieve data.")
在这个示例中,我们定义了一个代理池和用户代理列表,随机选择代理地址和用户代理,并设置了请求头和超时时间。然后,使用代理池和设置的请求头发送请求,处理可能的异常情况,并实现了重试机制。
每天进步一点点,不管做什么都是一样的。加油兄弟姐妹们!