python爬-------urllib代理和代理池(第十七天)

🎈🎈作者主页: 喔的嘛呀🎈🎈

🎈🎈所属专栏:python爬虫学习🎈🎈

✨✨谢谢大家捧场,祝屏幕前的小伙伴们每天都有好运相伴左右,一定要天天开心哦!✨✨

嗨嗨嗨,兄弟姐妹们。我是喔的嘛呀。今天的学习内容是:爬虫 urllib代理和代理池

目录

[一、爬虫 urllib------代理](#一、爬虫 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.")

在这个示例中,我们定义了一个代理池和用户代理列表,随机选择代理地址和用户代理,并设置了请求头和超时时间。然后,使用代理池和设置的请求头发送请求,处理可能的异常情况,并实现了重试机制。

每天进步一点点,不管做什么都是一样的。加油兄弟姐妹们!

相关推荐
冯汉栩6 分钟前
Swift Control RollingCountdownView(动画倒计时)
开发语言·ios·swift
lisanmengmeng9 分钟前
搭建elk环境并接入frostmourne,实现监控报警效果(五)
开发语言·elk·日志·日志监控
Groundwork Explorer36 分钟前
W5500 网卡编程初始化与使用指南
python·单片机
oh,huoyuyan42 分钟前
JS 动态网页抓不到?试试火车采集器网页抓取工具
开发语言·javascript·ecmascript
风流 少年1 小时前
hutool
java·服务器·开发语言
逸Y 仙X1 小时前
MCP(模型控制协议)完全指南:从核心概念到实战开发
python·大模型·llm·ai编程·mcp
一木 之林2 小时前
四、STL容器与数据结构
开发语言·数据结构·c++
QX_hao2 小时前
【Go】--Cobra-cli的用法
开发语言·后端·golang
艾醒(AiXing-w)2 小时前
LangChain 1.0 入门(三):稳定性双核心——重试机制+速率限速器参数详解与实战
开发语言·langchain·php
WILLF2 小时前
前端视角:Python requests vs JS axios
前端·python