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

🎈🎈作者主页: 喔的嘛呀🎈🎈
🎈🎈所属专栏:python爬虫学习🎈🎈
✨✨谢谢大家捧场,祝屏幕前的小伙伴们每天都有好运相伴左右,一定要天天开心哦!✨✨ 

嗨嗨嗨,兄弟姐妹们。我是喔的嘛呀。今天的学习内容是:爬虫 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.")

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

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

  • 22
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

喔的嘛呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值