标签:python,爬取, ,
爬取 * 及测试是否可用
很多人在爬虫时为了防止被封IP,所以就会去各大网站上查找免费的 * ,由于不是每个IP地址都是有效的,如果要进去一个一个比对的话效率太低了,我也遇到了这种情况,所以就直接尝试了一下去网站爬取免费的 * ,并且逐一的测试,最后将有效的IP进行返回。
在这里我选择的是89免费 * 网站进行爬取,并且每一个IP都进行比对测试,最后会将可用的IP进行另存放为一个列表
https://www.89ip.cn/
一、准备工作
导入包并且设置头标签
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请求百度网站,并且传入 * ,如果网站返回状态码为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)
else:
print("该 * 无效:" + ip)
except:
print("该 * 无效:" + 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
# 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)
else:
print("该 * 无效:" + ip)
except:
print("该 * 无效:" + 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)
来源:https://blog.csdn.net/weixin_45066966/article/details/108952056
0
投稿
猜你喜欢
- 一、python魔法方法Python的魔法方法会在特定的情况下自动调用,且他们的方法名通常被双下划线包裹,之前我们学习的构造函数和析构函数就
- 本文介绍了一种将英文字符首个字母串转换为大写的asp代码,当然这个功能可能英文网站比较有用。转换大写功能英文介绍:Code Title: P
- 在NumPy中,所有的标准三角函数如sin、cos、tan等均有对应的通用函数。一、利萨茹曲线(Lissajous curve)利萨茹曲线是
- 浏览器的具体功能都储存在服务器端的Browscap.ini中:<% SET
- 一、list 合并第一种方法:a =[91,95,97,99]b =[92,93,96,98]c = a+b # 合并c.sor
- 1、异常的传播当在函数中出现异常时,如果在函数中对异常进行了处理,则异常不会再继续传播。如果函数中没有对异常进行处理,则异常会继续向函数调用
- 这个是JS控制图片滚动的效果,当鼠标结果新闻标题时开始滚动到对应的图片,可以作为图片新闻。效果图:<!DOCTYPE HTML PUB
- 之前介绍过通过cookie 绕过验证码实现登录的方法。这里并不多余,会增加分析和另外一种方法实现登录。1、思路介绍 1.1、直接看
- 如下所示:import sysfrom PyQt5 import QtGui, QtCore, QtWidgetsfrom PyQt5.Qt
- 笔者之前用R开发评分卡时,需要进行分箱计算woe及iv值,采用的R包是smbinning,它可以自动进行分箱。近期换用python开发, 也
- Plotly 是目前已知的Python最强绘图库,它比上次我们讲的Echarts还强大许多许多,它的绘制通过生成一个web页面完成,并且支持
- 本文实例讲述了php mysql procedure实现获取多个结果集的方法。分享给大家供大家参考,具体如下:protected funct
- 本文实例讲述了Python中unittest的用法,分享给大家供大家参考。具体用法分析如下:1. unittest module包含了编写运
- pyquery的使用一、pyquery的介绍使用pyquery需要在Web和了解jQuery的基础上,使用该CSS选择器。二、pyquery
- 我们可以通过这样子的方式去理解apache的工作原理1 单进程TCP服务(堵塞式)这是最原始的服务,也就是说只能处理个客户端的连接,等当前客
- 问:把数据从MySQL迁移到Oracle需要注意些什么?答:以下是MySQL迁到Oracle需要掌握的注意事项,希望对你有所帮助。1.自动增
- 目的是想通过给定一个ID,取出所有的子ID,包括子ID的子ID。一开始写成FUNCTION,因为FUNCTION调用方便,但是报错:ERRO
- 说明本文根据https://github.com/liuchengxu/blockchain-tutorial的内容,用python实现的,
- 【原文地址】New "Orcas" Language Feature: Extension Methods【原文发表日期
- 引言本文主要梳理了flask源码中route的设计思路。首先,从WSGI协议的角度介绍flask route的作用;其次,详细讲解如何借助w