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


Posted in Python onOctober 09, 2020

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

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

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

https://www.89ip.cn/

python爬取代理IP并进行有效的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请求百度网站,并且传入代理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)

到此这篇关于python爬取代理IP并进行有效的IP测试实现的文章就介绍到这了,更多相关python爬取代理IP内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python中内建函数的简单用法说明
May 05 Python
利用Python读取文件的四种不同方法比对
May 18 Python
Python WXPY实现微信监控报警功能的代码
Oct 20 Python
Python在不同目录下导入模块的实现方法
Oct 27 Python
Kali Linux安装ipython2 和 ipython3的方法
Jul 11 Python
python 同时读取多个文件的例子
Jul 16 Python
python将字符串list写入excel和txt的实例
Jul 20 Python
Python requests模块基础使用方法实例及高级应用(自动登陆,抓取网页源码)实例详解
Feb 14 Python
在tensorflow下利用plt画论文中loss,acc等曲线图实例
Jun 15 Python
详解Windows下PyCharm安装Numpy包及无法安装问题解决方案
Jun 18 Python
Python如何在单元测试中给对象打补丁
Aug 03 Python
python 偷懒技巧——使用 keyboard 录制键盘事件
Sep 21 Python
Python中Selenium模块的使用详解
Oct 09 #Python
python利用platform模块获取系统信息
Oct 09 #Python
python smtplib发送多个email联系人的实现
Oct 09 #Python
python 决策树算法的实现
Oct 09 #Python
Python+unittest+requests 接口自动化测试框架搭建教程
Oct 09 #Python
Python实现http接口自动化测试的示例代码
Oct 09 #Python
python两种注释用法的示例
Oct 09 #Python
You might like
追忆往昔!浅谈收音机的百年发展历史
2021/03/01 无线电
10条PHP编程习惯助你找工作
2008/09/29 PHP
PHP eval函数使用介绍
2013/12/08 PHP
php通过array_merge()函数合并关联和非关联数组的方法
2015/03/18 PHP
Aster vs Newbee BO3 第二场2.18
2021/03/10 DOTA
经典的解除许多网站无法复制文字的绝招
2006/12/31 Javascript
jQuery的Ajax的自动完成功能控件简要说明
2013/02/22 Javascript
javascript实现动态侧边栏代码
2014/02/19 Javascript
使用jQuery jqPlot插件绘制柱状图
2014/12/18 Javascript
js判断浏览器是否支持严格模式的方法
2016/10/04 Javascript
使用snowfall.jquery.js实现爱心满屏飞的效果
2017/01/05 Javascript
JavaScript30 一个月纯 JS 挑战中文指南(英文全集)
2017/07/23 Javascript
微信小程序中使用 async/await的方法实例分析
2020/05/06 Javascript
nodeJS与MySQL实现分页数据以及倒序数据
2020/06/05 NodeJs
在vue中使用el-tab-pane v-show/v-if无效的解决
2020/08/03 Javascript
[01:07:47]Secret vs Optic Supermajor 胜者组 BO3 第一场 6.4
2018/06/05 DOTA
python实现计算倒数的方法
2015/07/11 Python
pygame实现俄罗斯方块游戏
2018/06/26 Python
python实现简单tftp(基于udp协议)
2018/07/30 Python
Python-while 计算100以内奇数和的方法
2019/06/11 Python
python中while和for的区别总结
2019/06/28 Python
django 2.2和mysql使用的常见问题
2019/07/18 Python
Python 元组操作总结
2019/09/18 Python
Python sqlite3查询操作过程解析
2020/02/20 Python
大数据分析用java还是Python
2020/07/06 Python
HTML5本地存储之Web Storage应用介绍
2013/01/06 HTML / CSS
大二学生职业生涯规划书
2014/02/05 职场文书
环保建议书
2014/03/12 职场文书
班长竞选演讲稿
2014/04/24 职场文书
“四风”问题的主要表现和危害思想汇报
2014/09/19 职场文书
新闻稿标题
2015/07/18 职场文书
为什么MySQL选择Repeatable Read作为默认隔离级别
2021/07/26 MySQL
Python学习之时间包使用教程详解
2022/03/21 Python
Python使用永中文档转换服务
2022/05/06 Python
Win11怎么解除儿童账号限制?Win11解除微软儿童账号限制方法
2022/07/07 数码科技
关于MySQL中explain工具的使用
2023/05/08 MySQL