python爬取代理IP并进行有效的IP测试

爬取代理IP及测试是否可用

很多人在爬虫时为了防止被封IP,所以就会去各大网站上查找免费的代理IP,由于不是每个IP地址都是有效的,如果要进去一个一个比对的话效率太低了,我也遇到了这种情况,所以就直接尝试了一下去网站爬取免费的代理IP,并且逐一的测试,最后将有效的IP进行返回。
在这里我选择的是89免费代理IP网站进行爬取,并且每一个IP都进行比对测试,最后会将可用的IP进行另存放为一个列表

https://www.89ip.cn/
在这里插入图片描述

一、准备工作

导入包并且设置头标签

import requests
from bs4 import BeautifulSoup

header = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36'
}

二、提取网页源码

提取网页源码返回的是整个网站的HTML

def getHtml(url):
    try:
        reponse = requests.get(url, headers=header)
        reponse.raise_for_status()
        reponse.encoding = reponse.apparent_encoding
        return reponse.text
    except:
        return "网页源码提取错误"

三、解析HTML并提取IP

函数传入的参数是HTML和存放IP地址的列表

# 解析网页,提取IP
def getIp(html, list):
    try:
        soup = BeautifulSoup(html, "html.parser")
        tr = soup.find("tbody").find_all_next("tr")
        for ip in tr:
            # 提取IP
            td = ip.find_next("td").string
            td = str(td).replace(" ", "").replace("\n", "").replace("\t", "")
            # 提取端口号
            dk = ip.find_all_next("td")[1].string
            dk = str(dk).replace(" ", "").replace("\n", "").replace("\t", "")
            # 将IP和端口号进行连接
            ip = td + ":" + dk
            list.append(ip)  # 再进IP地址存放至指定列表中去
    except:
        print("获取IP失败")

四、测试IP是否可用

在这里测试IP的原理是用requests请求百度网站,并且传入代理IP,如果网站返回状态码为200那么说明此IP有效,如果出现其他情况则判断IP地址无效

# 测试出可用IP
def ip_text(list, valid_IP):
    try:
        url = "https://www.baidu.com//"
        for ip in list:
            try:
                rep = requests.get(url, proxies={'https': ip}, headers=header, timeout=0.5)
                if rep.status_code == 200:  # 如果放回的状态码是200,那么说明该IP地址可用
                    valid_IP.append(ip)
                    print("该代理IP有效:" + ip)
                else:
                    print("该代理IP无效:" + ip)
            except:
                print("该代理IP无效:" + ip)
    except:
        print("IP测试失败")

五、主函数main

主函数中主要负责调用函数和自定义页数指定生成URL,并且在程序结束前会输出有效IP地址

if __name__ == '__main__':

    valid_IP = []  # 有效IP地址
    for i in range(1, 90):  # 可自定义页数
        ip_list = []  # 存放所有爬取到的ip
        url = "https://www.89ip.cn/index_" + str(i) + ".html"
        print(url)
        html = getHtml(url)
        getIp(html, ip_list)
        ip_text(ip_list, valid_IP)

    print("=" * 30)
    print("测试完成,有效IP如下:")
    print("-" * 30)
    for a in valid_IP:
        print(a)
    print("=" * 30)

代码整体框架已经结束完毕了,最后把所有代码呈现出了

完整代码

# -*- coding: utf-8 -*-
# Author : YRH
# Data : 2020/10/07
# Project : 爬取代理IP并且测试可用IP
# Tool : PyCharm

import requests
from bs4 import BeautifulSoup

header = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36'
}


# 提取网页源码
def getHtml(url):
    try:
        reponse = requests.get(url, headers=header)
        reponse.raise_for_status()
        reponse.encoding = reponse.apparent_encoding
        return reponse.text
    except:
        return "网页源码提取错误"


# 解析网页,提取IP
def getIp(html, list):
    try:
        soup = BeautifulSoup(html, "html.parser")
        tr = soup.find("tbody").find_all_next("tr")
        for ip in tr:
            # 提取IP
            td = ip.find_next("td").string
            td = str(td).replace(" ", "").replace("\n", "").replace("\t", "")
            # 提取端口号
            dk = ip.find_all_next("td")[1].string
            dk = str(dk).replace(" ", "").replace("\n", "").replace("\t", "")
            # 将IP和端口号进行连接
            ip = td + ":" + dk
            list.append(ip)  # 再进IP地址存放至指定列表中去
    except:
        print("获取IP失败")


# 测试出可用IP
def ip_text(list, valid_IP):
    try:
        url = "https://www.baidu.com//"
        for ip in list:
            try:
                rep = requests.get(url, proxies={'https': ip}, headers=header, timeout=0.5)
                if rep.status_code == 200:  # 如果放回的状态码是200,那么说明该IP地址可用
                    valid_IP.append(ip)
                    print("该代理IP有效:" + ip)
                else:
                    print("该代理IP无效:" + ip)
            except:
                print("该代理IP无效:" + ip)
    except:
        print("IP测试失败")


if __name__ == '__main__':

    valid_IP = []  # 有效IP地址
    for i in range(1, 90):  # 可自定义页数
        ip_list = []  # 存放所有爬取到的ip
        url = "https://www.89ip.cn/index_" + str(i) + ".html"
        print(url)
        html = getHtml(url)
        getIp(html, ip_list)
        ip_text(ip_list, valid_IP)

    print("=" * 30)
    print("测试完成,有效IP如下:")
    print("-" * 30)
    for a in valid_IP:
        print(a)
    print("=" * 30)

看到这里了,如果大家觉得有什么需要改进的或者有什么更好的建议可以在评论区提出来,然后大家共同进步,谢谢!!!

  • 8
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
引用\[1\]提供了一个示例代码,用于爬取西刺代理网站上的免费代理IP。这段代码使用了BeautifulSoup库来解析网页,并提取出IP地址和端口号。通过调用get_ip_list函数,可以获取到爬取到的代理IP列表。 引用\[2\]提供了一个检测IP可用性的函数。该函数使用了requests库发送请求,并设置了代理IP。如果请求成功(状态码为200),则将该代理IP保存在另一个列表中。 根据这些引用内容,你可以使用这些代码来实现一个爬虫代理IP的功能。首先,你可以使用引用\[1\]中的代码来爬取西刺代理网站上的免费代理IP。然后,使用引用\[2\]中的函数来检测这些代理IP的可用性。最后,你可以根据引用\[3\]中的运行结果来验证你的代码是否成功获取到了代理IP。 请注意,这只是一个示例代码,你可以根据自己的需求进行修改和优化。同时,使用代理IP需要遵守相关法律法规和网站的使用规定,确保合法合规地使用代理IP。 #### 引用[.reference_title] - *1* *3* [Python网络爬虫(五)——获取代理IP](https://blog.csdn.net/weixin_40431584/article/details/89736159)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Python爬虫实战(二):爬取代理构建代理IP池](https://blog.csdn.net/yuan2019035055/article/details/121334216)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值