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实现文件分组复制到不同目录的例子
Jun 04 Python
利用pyinstaller或virtualenv将python程序打包详解
Mar 22 Python
python flask 多对多表查询功能
Jun 25 Python
使用python的pandas库读取csv文件保存至mysql数据库
Aug 20 Python
wtfPython—Python中一组有趣微妙的代码【收藏】
Aug 31 Python
python实现计数排序与桶排序实例代码
Mar 28 Python
对python中基于tcp协议的通信(数据传输)实例讲解
Jul 22 Python
使用python执行shell脚本 并动态传参 及subprocess的使用详解
Mar 06 Python
python GUI库图形界面开发之PyQt5表单布局控件QFormLayout详细使用方法与实例
Mar 06 Python
2020最新pycharm汉化安装(python工程狮亲测有效)
Apr 26 Python
python 实时调取摄像头的示例代码
Nov 25 Python
Python 避免字典和元组的多重嵌套问题
Jul 15 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创建PDF中文文档
2006/10/09 PHP
一个程序下载的管理程序(三)
2006/10/09 PHP
Zend Guard一些常见问题解答
2008/09/11 PHP
PHP递归算法的详细示例分析
2013/02/19 PHP
thinkphp跨库操作的简单代码实例
2016/09/22 PHP
javascript innerText和innerHtml应用
2010/01/28 Javascript
JS中typeof与instanceof之间的区别总结
2013/11/14 Javascript
Blocksit插件实现瀑布流数据无限( 异步)加载
2014/06/20 Javascript
avascript中的自执行匿名函数应用示例
2014/09/15 Javascript
深入理解JavaScript中的对象
2015/06/04 Javascript
JavaScript中的this,call,apply使用及区别详解
2016/01/29 Javascript
NPM 安装cordova时警告:npm WARN deprecated minimatch@2.0.10: Please update to minimatch 3.0.2 or higher to
2016/12/20 Javascript
Angular JS数据的双向绑定详解及实例
2016/12/31 Javascript
vue2.0中click点击当前li实现动态切换class
2017/06/21 Javascript
Avalonjs双向数据绑定与监听的实例代码
2017/06/23 Javascript
详解js静态资源文件请求的处理
2017/08/01 Javascript
vue移动端城市三级联动组件使用详解
2019/07/26 Javascript
小程序websocket心跳库(websocket-heartbeat-miniprogram)
2020/02/23 Javascript
vue跳转页面的几种方法(推荐)
2020/03/26 Javascript
12 种使用Vue 的最佳做法
2020/03/30 Javascript
解决python文件字符串转列表时遇到空行的问题
2017/07/09 Python
对python中for、if、while的区别与比较方法
2018/06/25 Python
python实现事件驱动
2018/11/21 Python
对Xpath 获取子标签下所有文本的方法详解
2019/01/02 Python
利用python提取wav文件的mfcc方法
2019/01/09 Python
django模板加载静态文件的方法步骤
2019/03/01 Python
linux环境中没有网络怎么下载python
2019/07/07 Python
PowerBI和Python关于数据分析的对比
2019/07/11 Python
Python中url标签使用知识点总结
2020/01/16 Python
python3.7调试的实例方法
2020/07/21 Python
python中操作文件的模块的方法总结
2021/02/04 Python
利用css3如何设置没有上下边的列表间隔线
2017/07/03 HTML / CSS
幼儿园母亲节活动方案
2014/03/10 职场文书
QQ空间主人寄语大全
2014/04/12 职场文书
婚宴祝酒词大全
2015/08/10 职场文书
校园之声广播稿
2015/08/18 职场文书