python爬虫代理ip关于设置proxies的问题

目录

前言

一、什么是代理IP?

二、为什么需要设置代理IP?

三、如何设置代理IP?

四、完整代码

总结


前言

在进行Python爬虫开发时,经常会遇到被封IP或者频繁访问同一网站被限制访问等问题,这时,使用代理IP就可以避免这些问题,保证爬虫程序正常运行。本文将介绍如何使用Python设置代理IP,以及如何使用代理IP访问指定的网站。主要介绍通过urllib库实现网页访问时,如何通过设置代理IP来实现IP轮换、反反爬虫等功能。

一、什么是代理IP?

代理IP是指通过代理服务器获取的IP地址,因为代理服务器具有隐藏用户真实IP、改变客户端访问地址、提高访问速度、突破访问限制等功能,所以使用代理IP可以实现一些数据获取的目的。

二、为什么需要设置代理IP?

在爬虫开发过程中,经常会遇到被封IP或者频繁访问同一网站被限制访问等问题。这时,使用代理IP就可以避免这些问题,保证爬虫程序正常运行。

三、如何设置代理IP?

在Python中,使用urllib库实现网页访问时,可以通过设置代理IP来实现IP轮换、反反爬虫等功能。下面,我们以爬取某个网站为例,讲解如何设置代理IP。

首先,我们需要从免费的代理IP网站上获取代理IP,这里以站大爷代理为例,代码如下:

import requests
from bs4 import BeautifulSoup

def get_proxy():
    url = 'https://www.zdaye.com/free/'
    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.36 Edge/16.16299'}
    r = requests.get(url, headers=headers)
    soup = BeautifulSoup(r.text, 'html.parser')
    table = soup.find('table', attrs={'id': 'ip_list'})
    proxies = []
    for row in table.tbody.find_all('tr'):
        if row.find_all('td')[4].string == 'HTTP':
            proxy = ':'.join([row.find_all('td')[1].string, row.find_all('td')[2].string])
            proxies.append(proxy)
    return proxies

上面的代码中,我们使用requests库访问站大爷代理网站,获取网页内容。然后,使用BeautifulSoup库解析网页内容,获取代理IP信息。

获取到代理IP后,我们需要测试这些代理IP是否可用,筛选出可用的代理IP。代码如下:

import requests

def test_proxy(proxy):
    url = 'https://www.baidu.com'
    proxies = {'http': 'http://' + proxy, 'https': 'https://' + proxy}
    try:
        r = requests.get(url, proxies=proxies, timeout=10)
        if r.status_code == 200:
            return True
        else:
            return False
    except:
        return False

def get_valid_proxies(proxies):
    valid_proxies = []
    for proxy in proxies:
        if test_proxy(proxy):
            valid_proxies.append(proxy)
    return valid_proxies

在上面的代码中,我们使用requests库通过代理IP访问百度网站,如果返回状态码为200,则说明代理IP可用。如果访问出现异常或者状态码不为200,则说明代理IP不可用。

获取到可用的代理IP后,我们就可以使用这些代理IP来访问指定的网站。代码如下:

import random
import requests

def get_html(url, proxies):
    proxy = random.choice(proxies)
    proxies = {'http': 'http://' + proxy, 'https': 'http://' + proxy}
    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.36 Edge/16.16299'}
    try:
        r = requests.get(url, headers=headers, proxies=proxies, timeout=10)
        if r.status_code == 200:
            return r.text
        else:
            return None
    except:
        return None

上面的代码中,我们使用random库随机选择一个代理IP,然后使用requests库访问指定的网站。在访问时,需要将代理IP添加到proxies参数中,这样就可以使用代理IP来访问指定的网站了。

四、完整代码

import random
import requests
from bs4 import BeautifulSoup

def get_proxy():
    url = 'https://www.zdaye.com/free/'
    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.36 Edge/16.16299'}
    r = requests.get(url, headers=headers)
    soup = BeautifulSoup(r.text, 'html.parser')
    table = soup.find('table', attrs={'id': 'ip_list'})
    proxies = []
    for row in table.tbody.find_all('tr'):
        if row.find_all('td')[4].string == 'HTTP':
            proxy = ':'.join([row.find_all('td')[1].string, row.find_all('td')[2].string])
            proxies.append(proxy)
    return proxies

def test_proxy(proxy):
    url = 'https://www.baidu.com'
    proxies = {'http': 'http://' + proxy, 'https': 'http://' + proxy}
    try:
        r = requests.get(url, proxies=proxies, timeout=10)
        if r.status_code == 200:
            return True
        else:
            return False
    except:
        return False

def get_valid_proxies(proxies):
    valid_proxies = []
    for proxy in proxies:
        if test_proxy(proxy):
            valid_proxies.append(proxy)
    return valid_proxies

def get_html(url, proxies):
    proxy = random.choice(proxies)
    proxies = {'http': 'http://' + proxy, 'https': 'http://' + proxy}
    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.36 Edge/16.16299'}
    try:
        r = requests.get(url, headers=headers, proxies=proxies, timeout=10)
        if r.status_code == 200:
            return r.text
        else:
            return None
    except:
        return None

if __name__ == '__main__':
    url = 'https://www.baidu.com'
    proxies = get_proxy()
    valid_proxies = get_valid_proxies(proxies)
    html = get_html(url, valid_proxies)
    print(html)

在上面的代码中,我们首先定义了一个函数get_proxy(),用于获取代理IP。然后,定义了一个函数test_proxy(),用于测试代理IP是否可用。接下来,定义了一个函数get_valid_proxies(),用于获取可用的代理IP。最后,定义了一个函数get_html(),用于使用代理IP访问指定的网站,并返回HTML内容。

在主函数中,我们先访问西刺代理网站,获取代理IP信息。然后,使用get_valid_proxies()函数获取可用的代理IP。最后,使用get_html()函数访问百度网站,并输出返回内容。

总结

以上就是关于Python爬虫代理IP设置proxies的介绍,包括代理IP的概念、代理IP的设置和使用方法。在实际爬虫开发中,使用代理IP可以避免IP封禁和反反爬虫等问题,提高爬虫的效率和稳定性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/142128.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CSS特效008:鼠标悬浮文字跳动动画效果

总第 010 篇文章, 查看专栏目录 本专栏记录的是经常使用的CSS示例与技巧,主要包含CSS布局,CSS特效,CSS花边信息三部分内容。其中CSS布局主要是列出一些常用的CSS布局信息点,CSS特效主要是一些动画示例,CSS花…

【算法与数据结构】78、90、LeetCode子集I, II

文章目录 一、题目二、78.子集三、90.子集II三、完整代码 所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、78.子集 思路分析:【算法与数据结构】77、LeetCode组合。本题可以参考77题的组合问题代码&#xff0…

路由器的结构以及工作原理

目录 路由器的结构 交换结构三种常用的交换方式 1.通过存储器 2.通过总线 3.通过纵横交换结构(crossbar switch fabric) 路由器的结构 路由器结构可划分为两大部分:路由选择部分,分组转发部分 路由选择部分也叫做控制部分&…

java高并发系列-第2天:并发级别

这是java高并发系列第2篇文章,一个月,咱们一起啃下java高并发,欢迎留言打卡,一起坚持一个月,拿下java高并发。 由于临界区的存在,多线程之间的并发必须受到控制。根据控制并发的策略,我们可以把…

P6入门:项目初始化7-项目详情之代码/分类码Code

前言 使用项目详细信息查看和编辑有关所选项目的详细信息,在项目创建完成后,初始化项目是一项非常重要的工作,涉及需要设置的内容包括项目名,ID,责任人,日历,预算,资金,分类码等等&…

排序算法之-快速

算法原理 丛待排序的数列中选择一个基准值,通过遍历数列,将数列分成两个子数列:小于基准值数列、大于基准值数列,准确来说还有个子数列:等于基准值即: 算法图解 选出基准元素pivot(可以选择…

P36[11-1]SPI通信协议

SPI相比于IIC的优缺点: 1.SPI传输速度快(IIC高电平驱动能力较弱,因此无法高速传输) 2.使用简单 3.通信线多 SCK(SCLK,CK,CLK):串行时钟线 MOSI(DO):主机输出,从机输入 MISO(DI): 主机输入,从机输出 SS(NSS,CS):从机选择(有多少个从机,主机就要用几根SS分别与从机连接…

Windows环境下ADB调试——安装adb

一、下载 Windows版本:https://dl.google.com/android/repository/platform-tools-latest-windows.zipMac版本:https://dl.google.com/android/repository/platform-tools-latest-darwin.zipLinux版本:https://dl.google.com/android/reposit…

HTTP服务器——tomcat的安装和使用

文章目录 前言下载tomcattomcat 文件bin 文件夹conf 文件lib 文件log 文件temp 文件webapps 文件work 目录 如何使用 tomcat 前言 前面我们已经学习了应用层协议 HTTP 协议和 HTTP 的改进版——HTTPS,这些协议是我们在写与服务器相关的代码的时候息息相关的&#x…

专访|OpenTiny 社区 Mr 栋:结合兴趣,明确定位,在开源中给自己一些技术性挑战

前言 OpenTiny 开源之夏项目终于迎来了圆满的结局。借此机会,我们采访了 TinyReact 的共建者 Mr 栋同学。 Mr 栋同学是一位热衷于前端技术的开发者,对前端开发充满了激情和热爱。同时他也是一位即将毕业的大四在校生。在 OpenTiny 开源项目中&#xff0…

Java18新增特性

前言 前面的文章,我们对Java9、Java10、Java11、Java12 、Java13、Java14、Java15、Java16、Java17 的特性进行了介绍,对应的文章如下 Java9新增特性 Java10新增特性 Java11新增特性 Java12新增特性 Java13新增特性 Java14新增特性 Java15新增特性 Java…

做一个Sprngboot文件上传-阿里云

概述 这个模块是用来上传头像以及文章封面的,图片的值是一个地址字符串,一般存放在本地或阿里云服务中 1、本地文件上传 我们将文件保存在一个本地的文件夹下,由于可能两个人上传不同图片但是却同名的图片,那么就会一个人的图片就…

Mac 本地部署thinkphp8【部署环境以及下载thinkphp】

PHP的安装以及环境变量配置 1 PHP安装:在终端输入brew install php 这里是PHP下载的最新的 如果提示‘brew’找不到,自己搜索安装吧, 不是特别难 2 环境变量配置 终端输入vim ~/.bash_profile 输入export PATH"/usr/local/Cellar/php/8.…

ubuntu18.04安装google浏览器

下载google安装包 wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb 安装google浏览器 sudo dpkg -i google-chrome-stable_current_amd64.deb 执行安装 sudo apt-get -f install 启动浏览器 在应用程序中找到google图标点击运行

安全区域边界(设备和技术注解)

网络安全等级保护相关标准参考《GB/T 22239-2019 网络安全等级保护基本要求》和《GB/T 28448-2019 网络安全等级保护测评要求》 密码应用安全性相关标准参考《GB/T 39786-2021 信息系统密码应用基本要求》和《GM/T 0115-2021 信息系统密码应用测评要求》 1边界防护 1.1应保证跨…

Spark数据倾斜优化

1 数据倾斜现象 1、现象 绝大多数task任务运行速度很快,但是就是有那么几个task任务运行极其缓慢,慢慢的可能就接着报内存溢出的问题。 2、原因 数据倾斜一般是发生在shuffle类的算子,比如distinct、groupByKey、reduceByKey、aggregateByKey…

vue脚手架初始化项目搭建后配置路由【小白易学】

首先这里你已经创建好项目了,这是跑起来的效果 首先第一步,需要下载路由router npm install vue-router4下载好了之后找到main.js页面,加入router import { createApp } from vue; import App from ./App.vue; import router from ./routercreateApp(A…

采集标准Docker容器日志:部署阿里云Logtail容器以及创建Logtail配置,用于采集标准Docker容器日志

文章目录 引言I 预备知识1.1 LogtailII 查询语法2.1 具体查询语法2.2 查询示例2.3 设置token时间(登录过期时间)see also引言 I 预备知识 1.1 Logtail Logtail是日志服务提供的日志采集Agent,用于采集阿里云ECS、自建IDC、其他云厂商等服务器上的日志。本文介绍Logtail的功…

RTOS实时操作系统在嵌入式开发中的应用

随着各种嵌入式系统应用的日益复杂和对实时性要求的提高,使用实时操作系统(RTOS)成为嵌入式开发中的一种重要选择。STM32微控制器作为一种强大的嵌入式处理器,与各种RTOS相结合,能够提供更高效、可靠并且易于维护的系统…

ESP32网络开发实例-BME280传感器数据保存到InfluxDB时序数据库

BME280传感器数据保存到InfluxDB时序数据库 文章目录 BME280传感器数据保存到InfluxDB时序数据库1、BM280和InfluxDB介绍2、软件准备3、硬件准备4、代码实现在本文中,将详细介绍如何将BME280传感器数据上传到InfluxDB中,方便后期数据处理。 1、BM280和InfluxDB介绍 InfluxDB…