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.")

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

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

相关推荐
西柚与蓝莓44 分钟前
【开源开放体系总结】
python
一颗花生米。2 小时前
深入理解JavaScript 的原型继承
java·开发语言·javascript·原型模式
问道飞鱼2 小时前
Java基础-单例模式的实现
java·开发语言·单例模式
学习使我快乐012 小时前
JS进阶 3——深入面向对象、原型
开发语言·前端·javascript
通信仿真实验室3 小时前
(10)MATLAB莱斯(Rician)衰落信道仿真1
开发语言·matlab
勿语&3 小时前
Element-UI Plus 暗黑主题切换及自定义主题色
开发语言·javascript·ui
belldeep4 小时前
python:reportlab 将多个图片合并成一个PDF文件
python·pdf·reportlab
吾爱星辰6 小时前
Kotlin 处理字符串和正则表达式(二十一)
java·开发语言·jvm·正则表达式·kotlin
ChinaDragonDreamer6 小时前
Kotlin:2.0.20 的新特性
android·开发语言·kotlin
FreakStudio6 小时前
全网最适合入门的面向对象编程教程:56 Python字符串与序列化-正则表达式和re模块应用
python·单片机·嵌入式·面向对象·电子diy