主要思路是分两步:第一步判断代理IP是否有效,第二步爬取免费网站代理IP,第三步循环判断爬取的代理IP是否有效
一、判断代理IP是否有效
- proxies:代理,分为http与https两种,爬取不同网站时需要选用不同类型的proxies,只有当proxies类型与想访问的网站类型相同时代理ip才会起作用,否则request请求使用的是你真实的ip地址,参考代理IP中的 proxies 介绍及使用
- re.findall():返回string中所有与pattern相匹配的全部字串,返回形式为数据,详细用法参考正则表达式 re.findall 用法、正则表达式 – 元字符
re.findall(pattern,string,flags=0)
代码如下,主要参考测试代理ip是否可用的方法:
import random import requests import re
''' 设计思路:利用http://icanhazip.com/返回的IP进行校验,如返回的是代理池的IP,说明代理有效,否则实际代理无效(也可以利用) '''
# 代理ip池:proxies主要指定代理 PROXIES_NEW = { "https": [ "https://175.42.129.107:9999", "https://115.221.246.181:9999", "https://121.233.207.161:9999", "https://36.248.133.23:9999", "https://117.69.150.50:9999", ] }
#提取代理ip池中ip数量,循环提取 lens = len(PROXIES_NEW['https']) print(lens) num = 1 i=0 while num <= lens:
try: #设置一个三次重连的机制 requests.adapters.DEFAULT_RETRIES = 3 proxies = PROXIES_NEW['https'] #IP = random.choice(proxies)采用随机读取可能会造成部分重复读,部分未读到 #循环读取代理ip池中ip IP = proxies[i] # print(IP) # print(type(IP)) #将下一个字符标记为一个特殊字符,d匹配一个数字字符,等价于[0–9],d+匹配一个以上数字字符 b = re.findall('//(d+.d+.d+.d+):', IP)[0] b = b.replace('.', '') print(b) # thiProxy = "http://" + IP # thisIP = "".join(IP.split(":")[0:1]) # print(thisIP) #res = requests.get(url="http://icanhazip.com/", timeout=8, proxies={"https": "https://113.140.1.82:53281"}) #利用http://icanhazip.com/返回的IP进行校验,如返回的是代理池的IP,说明代理有效,否则实际代理无效 #设置连接超时:你的客户端实现到远端及其端口的连接时,request会等待的描述,如果不设置,那么请求超时代码就会卡在哪里,不报错也没有request请求的响应 res = requests.get(url="http://icanhazip.com/", timeout=8) proxyIP = res.text # print(proxyIP) a = proxyIP.replace('.', '') print(a) if int(a) == int(b): print("代理IP:'" + proxyIP + "'有效!") else: print("返回不是代理池中的ip,代理IP无效!") i=i+1 except: print("代理IP无效!") #print(111) # else: # print('success') num += 1
神龙|纯净稳定代理IP免费测试>>>>>>>>天启|企业级代理IP免费测试>>>>>>>>IPIPGO|全球住宅代理IP免费测试