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选择排序算法实例总结
Jul 01 Python
使用python加密自己的密码
Aug 04 Python
python实现聊天小程序
Mar 13 Python
在VS Code上搭建Python开发环境的方法
Apr 06 Python
Python可变参数*args和**kwargs用法实例小结
Apr 27 Python
Django Sitemap 站点地图的实现方法
Apr 29 Python
如何使用python操作vmware
Jul 27 Python
Python操作Mongodb数据库的方法小结
Sep 10 Python
Python数据处理篇之Sympy系列(五)---解方程
Oct 12 Python
浅析Python requests 模块
Oct 09 Python
matplotlib bar()实现多组数据并列柱状图通用简便创建方法
Feb 24 Python
Python语言中的数据类型-序列
Feb 24 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目录导航文件代码
2006/10/09 PHP
PHP 魔术函数使用说明
2010/05/14 PHP
php更改目录及子目录下所有的文件后缀扩展名的代码
2010/10/12 PHP
基于PHP常用字符串的总结(待续)
2013/06/07 PHP
PHP面向对象精要总结
2014/11/07 PHP
JavaScript与HTML结合的基本使用方法整理
2015/10/12 PHP
laravel实现一个上传图片的接口,并建立软链接,访问图片的方法
2019/10/12 PHP
php实现JWT(json web token)鉴权实例详解
2019/11/05 PHP
解决windows上php xdebug 无法调试的问题
2020/02/19 PHP
JavaScript Base64编码和解码,实现URL参数传递。
2006/09/18 Javascript
javascript demo 基本技巧
2009/12/18 Javascript
将函数的实际参数转换成数组的方法
2010/01/25 Javascript
node.js中的fs.truncate方法使用说明
2014/12/15 Javascript
实现前后端数据交互方法汇总
2015/04/07 Javascript
jQuery网页版打砖块小游戏源码分享
2015/08/20 Javascript
极力推荐10个短小实用的JavaScript代码段
2016/08/03 Javascript
原生JS实现网络彩票投注效果
2016/09/25 Javascript
Bootstrap Tooltip显示换行和左对齐的解决方案
2017/10/11 Javascript
浅谈Vuex的状态管理(全家桶)
2017/11/04 Javascript
JS实现的小火箭发射动画效果示例
2018/12/08 Javascript
[02:11]完美世界DOTA2联赛10月28日赛事精彩集锦:来吧展示实力强劲
2020/10/29 DOTA
用Python抢过年的火车票附源码
2015/12/07 Python
python版本的读写锁操作方法
2016/04/25 Python
Numpy中stack(),hstack(),vstack()函数用法介绍及实例
2018/01/09 Python
Python实现的拟合二元一次函数功能示例【基于scipy模块】
2018/05/15 Python
Pycharm 文件更改目录后,执行路径未更新的解决方法
2019/07/19 Python
python同时替换多个字符串方法示例
2019/09/17 Python
django实现web接口 python3模拟Post请求方式
2019/11/19 Python
python支持多线程的爬虫实例
2019/12/21 Python
python爬虫实例之获取动漫截图
2020/05/31 Python
pandas to_excel 添加颜色操作
2020/07/14 Python
美国礼品卡商城: Gift Card Mall
2017/08/25 全球购物
美国现代家具网站:Design Within Reach
2018/07/19 全球购物
2014年世界艾滋病日演讲稿
2014/11/28 职场文书
2015年档案管理工作总结
2015/04/08 职场文书
javascript条件式访问属性和箭头函数介绍
2021/11/17 Javascript