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中何种情况下需要使用断言
Apr 01 Python
python采用django框架实现支付宝即时到帐接口
May 17 Python
Python查询IP地址归属完整代码
Jun 21 Python
Python 闭包的使用方法
Sep 07 Python
Python读取指定日期邮件的实例
Feb 01 Python
Python3安装Pillow与PIL的方法
Apr 03 Python
关于windows下Tensorflow和pytorch安装教程
Feb 04 Python
pytorch 使用加载训练好的模型做inference
Feb 20 Python
Python中免验证跳转到内容页的实例代码
Oct 23 Python
在Ubuntu中安装并配置Pycharm教程的实现方法
Jan 06 Python
Python绘制数码晶体管日期
Feb 19 Python
python模拟浏览器 使用selenium进入好友QQ空间并留言
Apr 12 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
php安全配置 如何配置使其更安全
2011/12/16 PHP
注册页面之前先验证用户名是否存在的php代码
2012/07/14 PHP
php实现的双向队列类实例
2014/09/24 PHP
浅谈PHP中单引号和双引号到底有啥区别呢?
2015/03/04 PHP
thinkPHP框架自动填充原理与用法分析
2018/04/03 PHP
js类的静态属性和实例属性的理解
2009/10/01 Javascript
菜鸟javascript基础资料整理2
2010/12/06 Javascript
JavaScript中的函数重载深入理解
2014/08/04 Javascript
jQuery实现简单二级下拉菜单
2015/04/12 Javascript
情人节单身的我是如何在敲完代码之后收到12束玫瑰的(javascript)
2015/08/21 Javascript
谈谈AngularJs中的隐藏和显示
2015/12/09 Javascript
微信小程序 for 循环详解
2016/10/09 Javascript
JavaScript实现多重继承的方法分析
2018/01/09 Javascript
Javascript中parseInt的正确使用方式
2018/10/17 Javascript
vue-router命名路由和编程式路由传参讲解
2019/01/19 Javascript
详解小程序设置缓存并且不覆盖原有数据
2019/04/15 Javascript
python连接远程ftp服务器并列出目录下文件的方法
2015/04/01 Python
用Python实现一个简单的能够上传下载的HTTP服务器
2015/05/05 Python
21行Python代码实现拼写检查器
2016/01/25 Python
python用fsolve、leastsq对非线性方程组求解
2018/12/15 Python
网易2016研发工程师编程题 奖学金(python)
2019/06/19 Python
django框架面向对象ORM模型继承用法实例分析
2019/07/29 Python
调用其他python脚本文件里面的类和方法过程解析
2019/11/15 Python
python-web根据元素属性进行定位的方法
2019/12/13 Python
python 负数取模运算实例
2020/06/03 Python
使用opencv中匹配点对的坐标提取方式
2020/06/04 Python
Django配置Bootstrap, js实现过程详解
2020/10/13 Python
python中pow函数用法及功能说明
2020/12/04 Python
python中random模块详解
2021/03/01 Python
Java基础面试题
2014/07/19 面试题
Java中各种基本数据类型的默认值都是什么
2016/12/22 面试题
工程概预算专业毕业生求职信
2013/10/04 职场文书
医药专业应届毕业生求职信范文
2014/01/01 职场文书
幼儿园小班教学反思
2014/02/02 职场文书
宿舍卫生管理制度
2015/08/05 职场文书
导游词之秦皇岛燕塞湖
2020/01/03 职场文书