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 相关文章推荐
pyqt4教程之实现windows窗口小示例分享
Mar 07 Python
Python解惑之整数比较详解
Apr 24 Python
Python生成短uuid的方法实例详解
May 29 Python
用python统计代码行的示例(包括空行和注释)
Jul 24 Python
Django添加KindEditor富文本编辑器的使用
Oct 24 Python
AUC计算方法与Python实现代码
Feb 28 Python
Django 拼接两个queryset 或是两个不可以相加的对象实例
Mar 28 Python
浅谈numpy中np.array()与np.asarray的区别以及.tolist
Jun 03 Python
浅谈keras中的目标函数和优化函数MSE用法
Jun 10 Python
python爬虫用scrapy获取影片的实例分析
Nov 23 Python
python用opencv 图像傅里叶变换
Jan 04 Python
Python使用openpyxl批量处理数据
Jun 23 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应用程序的七个习惯深入分析
2013/06/08 PHP
MooTools 1.2中的Drag.Move来实现拖放
2009/09/15 Javascript
Chrome Form多次提交表单问题的解决方法
2011/05/09 Javascript
js中实现多态采用和继承类似的方法
2014/08/22 Javascript
js实现带缓冲效果的仿QQ面板折叠菜单代码
2015/09/06 Javascript
jquery 动态合并单元格的实现方法
2016/08/26 Javascript
vue使用element-ui的el-input监听不了回车事件的解决方法
2018/01/12 Javascript
vue计算属性和监听器实例解析
2018/05/10 Javascript
浅谈Webpack多页应用HMR卡住问题
2019/04/24 Javascript
vue draggable resizable gorkys与v-chart使用与总结
2019/09/05 Javascript
微信小程序scroll-view的滚动条设置实现
2020/03/02 Javascript
jQuery+Ajax+js实现请求json格式数据并渲染到html页面操作示例
2020/06/02 jQuery
[01:05:32]DOTA2上海特级锦标赛主赛事日 - 3 败者组第三轮#1COL VS Alliance第一局
2016/03/04 DOTA
[01:10]DOTA2英雄背景故事第四期之混沌法则混沌骑士
2020/07/16 DOTA
Python入门篇之函数
2014/10/20 Python
用Python实现服务器中只重载被修改的进程的方法
2015/04/30 Python
python机器学习理论与实战(二)决策树
2018/01/19 Python
pycharm 实现显示project 选项卡的方法
2019/01/17 Python
Python for循环与range函数的使用详解
2019/03/23 Python
python3 批量获取对应端口服务的实例
2019/07/25 Python
Python3 集合set入门基础
2020/02/10 Python
pycharm实现print输出保存到txt文件
2020/06/01 Python
CSS3实现的闪烁跳跃进度条示例(附源码)
2013/08/19 HTML / CSS
德国古洛迷亚百货官网:GALERIA Kaufhof
2017/06/20 全球购物
巴西Bo.Bô官方在线商店:经营奢侈品时尚业务
2020/03/16 全球购物
全球异乡人的跨境社交电商平台:Kouhigh口嗨网
2020/07/24 全球购物
信息技术专业个人自我评价
2013/12/11 职场文书
电大本科自我鉴定
2014/02/05 职场文书
经典洗发水广告词
2014/03/13 职场文书
怎样填写就业意向
2014/04/02 职场文书
捐献物资倡议书范文
2014/05/19 职场文书
学校查摆问题整改措施
2014/09/28 职场文书
11.9消防日宣传标语
2014/10/08 职场文书
惊天动地观后感
2015/06/10 职场文书
经营场所使用证明
2015/06/19 职场文书
python Django框架快速入门教程(后台管理)
2021/07/21 Python