python爬取 * 并进行有效的IP测试实现

作者:Jack-yuan 时间:2021-05-08 15:31:38 

爬取 * 及测试是否可用

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

在这里我选择的是89免费 * 网站进行爬取,并且每一个IP都进行比对测试,最后会将可用的IP进行另存放为一个列表

https://www.89ip.cn/

python爬取 * 并进行有效的IP测试实现

一、准备工作

导入包并且设置头标签


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请求百度网站,并且传入 * ,如果网站返回状态码为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)
       else:
         print("该 * 无效:" + ip)
     except:
       print("该 * 无效:" + 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
# 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)
       else:
         print("该 * 无效:" + ip)
     except:
       print("该 * 无效:" + 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)

来源:https://blog.csdn.net/weixin_45066966/article/details/108952056

标签:python,爬取, ,
0
投稿

猜你喜欢

  • 深入浅出SQL之左连接、右连接和全连接

    2009-08-30 15:14:00
  • 解决Python安装后pip不能用的问题

    2023-05-10 04:52:14
  • Python调用服务接口的实例

    2021-06-04 18:22:06
  • UCenter 批量添加用户的php代码

    2024-05-11 09:25:09
  • python占位符输入方式实例

    2022-10-26 11:46:16
  • Python实战之多种音乐格式批量转换

    2023-07-12 20:24:42
  • 栈和队列数据结构的基本概念及其相关的Python实现

    2022-03-14 23:18:28
  • Python发送邮件功能示例【使用QQ邮箱】

    2021-08-29 10:27:41
  • php删除二维数组中的重复值方法

    2024-06-05 09:51:20
  • 基于vue-resource jsonp跨域问题的解决方法

    2023-07-02 16:33:44
  • JS 显示当前日期+星期(静态)

    2007-09-11 13:29:00
  • Python使用进程Process模块管理资源

    2023-08-08 07:08:01
  • go第三方库sqlx操作MySQL及ORM原理

    2024-01-18 21:12:32
  • python实现五子棋小程序

    2023-12-04 20:49:37
  • Python抓包程序mitmproxy安装和使用过程图解

    2023-12-09 19:45:12
  • python opencv把一张图片嵌入(叠加)到另一张图片上的实现代码

    2021-08-11 12:52:30
  • Python借助with语句实现代码段只执行有限次

    2022-08-07 15:52:29
  • Python 解析pymysql模块操作数据库的方法

    2021-05-07 07:46:13
  • Java基于正则表达式实现的替换匹配文本功能【经典实例】

    2023-03-15 22:27:44
  • Pycharm更换python解释器的方法

    2023-03-23 10:02:58
  • asp之家 网络编程 m.aspxhome.com