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 22 Python
对于Python装饰器使用的一些建议
Jun 03 Python
Python随手笔记第一篇(2)之初识列表和元组
Jan 23 Python
解决python3爬虫无法显示中文的问题
Apr 12 Python
详解python调用cmd命令三种方法
Jul 08 Python
Django中Middleware中的函数详解
Jul 18 Python
python脚本调用iftop 统计业务应用流量的思路详解
Oct 11 Python
python pyecharts 实现一个文件绘制多张图
May 13 Python
python用什么编辑器进行项目开发
Jun 17 Python
零基础学python应该从哪里入手
Aug 11 Python
详解Python之Scrapy爬虫教程NBA球员数据存放到Mysql数据库
Jan 24 Python
详解Python flask的前后端交互
Mar 31 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面向对象
2012/02/22 PHP
php配合jquery实现增删操作具体实例
2013/12/12 PHP
WordPress中重置文章循环的rewind_posts()函数讲解
2016/01/11 PHP
PHP MySql增删改查的简单实例
2016/06/21 PHP
javascript代码加载优化方法
2011/01/30 Javascript
用javascript模仿ie的自动完成类似自动完成功的表单
2012/12/12 Javascript
JavaScript作用域链示例分享
2014/05/27 Javascript
Node.js的MongoDB驱动Mongoose基本使用教程
2016/03/01 Javascript
js方法数据验证的简单实例
2016/09/17 Javascript
javascript 定时器工作原理分析
2016/12/03 Javascript
如何提高数据访问速度
2016/12/26 Javascript
Node.js的特点详解
2017/02/03 Javascript
微信小程序 PHP生成带参数二维码
2017/02/21 Javascript
jQuery插件FusionCharts实现的MSBar3D图效果示例【附demo源码】
2017/03/23 jQuery
Vue响应式原理详解
2017/04/18 Javascript
初探JavaScript 面向对象(推荐)
2017/09/03 Javascript
分分钟学会vue中vuex的应用(入门教程)
2017/09/14 Javascript
VUE中使用MUI方法
2019/02/12 Javascript
解决IOS端微信H5页面软键盘弹起后页面下方留白的问题
2019/06/05 Javascript
浅析Vue 防抖与节流的使用
2019/11/14 Javascript
利用python发送和接收邮件
2016/09/27 Python
python中多层嵌套列表的拆分方法
2018/07/02 Python
Python使用pymongo模块操作MongoDB的方法示例
2018/07/20 Python
Python功能点实现:函数级/代码块级计时器
2019/01/02 Python
Django获取model中的字段名和字段的verbose_name方式
2020/05/19 Python
使用JS+CSS3技术:让你的名字动起来
2013/04/27 HTML / CSS
Html5 canvas实现粒子时钟的示例代码
2018/09/06 HTML / CSS
葡萄牙航空官方网站:TAP Air Portugal
2019/10/31 全球购物
中层干部竞争上岗演讲稿
2014/01/13 职场文书
《在山的那边》教学反思
2014/02/23 职场文书
年终总结会主持词
2014/03/25 职场文书
考研英语复习计划
2015/01/19 职场文书
2015年小学生自我评价范文
2015/03/03 职场文书
2019年怎样才能撰写出优秀的自荐信
2019/03/25 职场文书
FP-growth算法发现频繁项集——构建FP树
2021/06/24 Python
浅谈resultMap的用法及关联结果集映射
2021/06/30 Java/Android