首页 > 编程语言 >【Python爬虫笔记】爬虫代理IP与访问控制

【Python爬虫笔记】爬虫代理IP与访问控制

时间:2023-09-05 16:37:46浏览次数:35  
标签:return Python IP 代理 爬虫 proxy proxies

一、前言

在进行网络爬虫的开发过程中,有许多限制因素阻碍着爬虫程序的正常运行,其中最主要的一点就是反爬虫机制。为了防止爬虫程序在短时间内大量地请求同一个网站,网站管理者会使用一些方式进行限制。这时候,代理IP就是解决方案之一。

本文主要介绍如何在爬虫程序中使用代理IP以应对反爬虫机制,以及如何进行访问控制,保障程序的正常运行。

二、什么是代理IP

代理IP即为代理服务器的IP地址,在爬虫程序中,我们可以使用代理IP来隐藏真实的IP地址,从而达到访问网站的目的。使用代理IP可以解决以下问题:

  1. 突破访问限制:有些网站会限制某些地区的访问,使用代理IP可以突破这些限制。
  2. 绕过反爬虫机制:有些网站会根据同一IP访问频率的高低来判断是否为爬虫行为,使用代理IP可以隐藏真实IP地址,从而防止被封禁或检测。
  3. 提高访问速度:使用代理IP可以使得请求被代理服务器缓存,从而提高访问速度。

三、如何获取代理IP

有许多免费或收费的代理IP提供商,我们可以在这些网站上获取代理IP,这里推荐一个:

站大爷代理ip

获取代理IP后,我们需要进行有效性检测、筛选和存储,以确保代理IP的可用性。

下面是一个Python代码示例,可以实现对代理IP的有效性检测并存储可用的代理IP:

import requests
import time


def check_proxy(proxy):
    """
    检测代理IP的有效性
    :param proxy: 代理IP
    :return: True or False
    """
    proxies = {
        'http': proxy,
        'https': proxy,
    }
    try:
        response = requests.get('https://www.baidu.com/', proxies=proxies, timeout=5)
        if response.status_code == 200:
            return True
        else:
            return False
    except:
        return False


def save_proxy(ip, port, protocol='http'):
    """
    存储可用代理IP
    :param ip: IP地址
    :param port: 端口号
    :param protocol: 协议类型
    :return: None
    """
    with open('proxies.txt', 'a+', encoding='utf-8') as f:
        f.write('{}://{}:{}\n'.format(protocol, ip, port))


def main():
    for page in range(1, 11):  # 获取前10页的代理IP
        url = 'https://www.zdaye.com/nn/{}'.format(page)
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
                          'Chrome/89.0.4389.82 Safari/537.36'
        }
        response = requests.get(url, headers=headers)
        if response.status_code == 200:
            html = response.text
            proxy_list = html.split('\n')
            for proxy in proxy_list:
                if proxy:
                    ip = proxy.split(':')[0]
                    port = proxy.split(':')[1]
                    if check_proxy(proxy):
                        save_proxy(ip, port)


if __name__ == '__main__':
    main()
    print('Done!')

上述代码使用了requests库来请求代理IP网站,获取到代理IP后进行有效性检测,并将可用的代理IP存储到本地文件中。

四、如何应用代理IP

在爬虫程序中使用代理IP,可以使用requests库提供的proxies参数,示例代码如下:

import requests


def get_page(url, proxy):
    """
    使用代理IP请求网页
    :param url: 网页url
    :param proxy: 代理IP
    :return: 网页内容
    """
    proxies = {
        'http': proxy,
        'https': proxy,
    }
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
                      'Chrome/89.0.4389.82 Safari/537.36'
    }
    try:
        response = requests.get(url, headers=headers, proxies=proxies, timeout=10)
        if response.status_code == 200:
            return response.text
        else:
            return None
    except:
        return None


def main():
    url = 'https://www.baidu.com/'
    proxy = 'http://121.69.46.218:9000'
    page = get_page(url, proxy)
    print(page)


if __name__ == '__main__':
    main()

上述代码使用了requests库提供的proxies参数,将代理IP传入访问请求中,从而实现了使用代理IP请求网页的功能。

五、如何进行访问控制

在使用代理IP进行访问时,我们需要进行访问控制,以确保程序的正常运行。具体来说,我们可以通过以下方式进行访问控制:

  1. 控制请求频率:通过设置时间间隔、请求次数等方式,控制爬虫的访问速度,避免给网站带来过大的压力。
  2. 轮流使用代理IP:通过存储多个可用的代理IP,并轮流使用它们,以分散访问压力。
  3. 随机使用代理IP:从可用代理IP池中随机选择一个进行使用,增加反爬虫的难度。

下面是一个Python代码示例,可以实现访问控制并轮流使用代理IP:

import requests
import time


def get_proxy():
    """
    从代理IP池中取出一个代理IP
    :return: 代理IP
    """
    proxy_list = []
    with open('proxies.txt', 'r', encoding='utf-8') as f:
        for line in f:
            proxy = line.strip()
            proxy_list.append(proxy)
    return proxy_list[0]


def check_proxy(proxy):
    """
    检测代理IP的有效性
    :param proxy: 代理IP
    :return: True or False
    """
    proxies = {
        'http': proxy,
        'https': proxy,
    }
    try:
        response = requests.get('https://www.baidu.com/', proxies=proxies, timeout=5)
        if response.status_code == 200:
            return True
        else:
            return False
    except:
        return False


def save_proxy(ip, port, protocol='http'):
    """
    存储可用代理IP
    :param ip: IP地址
    :param port: 端口号
    :param protocol: 协议类型
    :return: None
    """
    with open('proxies.txt', 'a+', encoding='utf-8') as f:
        f.write('{}://{}:{}\n'.format(protocol, ip, port))


def rotate_proxy():
    """
    从代理IP池中轮流取出一个代理IP
    :return: 代理IP
    """
    proxy_list = []
    with open('proxies.txt', 'r', encoding='utf-8') as f:
        for line in f:
            proxy = line.strip()
            proxy_list.append(proxy)
    while True:
        for proxy in proxy_list:
            yield proxy


def main():
    proxy_generator = rotate_proxy()
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
                      'Chrome/89.0.4389.82 Safari/537.36'
    }
    for i in range(10):  # 控制访问次数
        proxy = next(proxy_generator)
        while not check_proxy(proxy):  # 检测代理IP是否可用
            proxy = next(proxy_generator)
        try:
            url = 'https://www.baidu.com/'
            response = requests.get(url, headers=headers, proxies={'http': proxy, 'https': proxy}, timeout=10)
            if response.status_code == 200:
                print(response.text)
        except:
            pass
        time.sleep(1)  # 控制请求间隔


if __name__ == '__main__':
    main()
    print('Done!')

上述代码使用了生成器和yield语句实现了轮流取出可用代理IP的功能,并增加了时间间隔控制,确保爬虫程序不会过于频繁地请求。同时,代码也实现了对代理IP的有效性检测,确保使用的代理IP都是可用的。

六、总结

本文主要介绍了如何在爬虫程序中使用代理IP进行反爬虫机制的应对,以及如何进行访问控制,保障程序的正常运行。实现代理IP使用和访问控制需要理解网络爬虫的原理和反爬虫机制,同时应当遵守网站的访问规则,以确保不会对网站造成过大的负担。

标签:return,Python,IP,代理,爬虫,proxy,proxies
From: https://blog.51cto.com/u_16022798/7373606

相关文章

  • Python学习 -- Math模块和Random模块
    math模块提供了许多数学函数,用于执行各种数学运算。以下是一些常用的math函数以及相应的示例代码:math.sqrt(x):计算平方根。importmathx=25square_root=math.sqrt(x)print(f"√{x}={square_root}")math.pow(x,y):计算x的y次方。importmathx=2y=3result......
  • 笔记 | element table show-overflow-tooltip 位置偏移的问题
    一、问题因为我目前的项目是微前端的工程,最外层有一个50px的通用头部,所以页面要减去50px。所有页面看似都很完美,但是使用el-table-column的show-overflow-tooltip属性时,tooltip会向下偏移50px。想到的解决办法:按照el-tooltip的属性更改placement="right"能解决。但......
  • 无涯教程-JavaScript - DAY函数
    描述DAY函数返回日期的日期,由序列号表示。日期以1到31之间的整数形式给出。语法DAY(serialnumber)争论Argument描述Required/Optionalserialnumber您要查找的日期。应该使用DATE函数或其他公式或函数的输出输入日期。如,在2008年5月的第23天使用DATE(2008,5,23......
  • Python目录管理(os库)
    在Python中,os库是处理文件和目录操作的常用库之一。它提供了许多函数,使得我们可以轻松地与操作系统进行交互,执行各种目录管理任务。本文将介绍os库中一些常用的目录管理函数,帮助你更好地理解和应用它们。os.path.join():这个函数用于将多个路径组合成一个完整的路径。它接收任意......
  • D依赖倒置原则DIP
    Dependency-InversionPrinciple要依赖抽象,而不要依赖具体的实现,具体而言就是高层模块不依赖于底层模块,二者共同依赖于抽象。抽象不依赖于具体,具体依赖于抽象。定义高层模块不应该依赖低层模块,它们都应该依赖抽象。抽象不应该依赖于细节,细节应该依赖于抽象。简单的说,依......
  • Python——10days
    二进制模式下读写操作控制文件内指针(光标)的移动文件的修改函数的简介函数的语法结构函数的返回值如何调用函数二进制模式下读写:t模式下:f.read()如果不指定参数,默认情况下是一次性读取所有f.read(5)如果指定了参数,返回的就是字符个数b模式下:f.read(5)如果指定了参......
  • JavaScript之同站多域名共享Token实现方案
    背景由于公司业务涉及到多个国家,每个国家站的访问的域名不同(指向同一个Web服务)在站内能够切换不同的国家,服务端一个token支持所有国家鉴权此时需要前端将Token等相关信息共享到即将跳转到的新站点,因为不同域,浏览器不会共享Cookie方案将Token相关信息通过URLQuery......
  • Python 字典的合并和值相加
    python实现:字典的合并(相同key的value相加)及字典的输出排序(各种意义下)_python字典合并与排序_Roxannekkk的博客-CSDN博客dict1={'a':2,'b':3}dict2={'a':3,'b':2}dict3={'c':3,'d':7}合并key相同,后一个字典覆盖前一个字典的value;key不同,新增dict1.update(dic......
  • 安装python GUI工具wxPython遇到的问题及解决方法
     报错很长,后面跟了一个: 网上搜了下,大概是安装wxPython前,需要安装编译工具,这里我直接安装了: 然后按照官网安装命令:pipinstall-UwxPython还是失败又按照网上讲的:配置mingw64,配置gcc环境变量,还是失败, 最后想了个办法,不安装最新版本4.2.1的wxPython了,我安装的4.1.1......
  • JavaScript判断数组是否包含某个值的6种方法
    循环functioncontains(arr,val){for(vari=0;i<arr.length;i++){if(arr[i]===val){returntrue;}}returnfalse;}contains([1,2,3],3);//true使用whilefunctioncontains(arr,val){vari=arr.length;......