随着网络爬虫技术的日益发展,获取和使用免费代理IP已成为许多爬虫工作者关注的焦点。免费代理IP不仅能够帮助爬虫隐藏真实身份,还能提高数据抓取的效率。然而,在实际应用中,免费代理IP也带来了一系列挑战。接下来我提供三个篇文章来提供三个网站获取免费的代理IP。本文来实现云代理http://www.ip3366.net/提供的IP
免费代理IP通常来源于公开的代理IP池,这些代理IP池由志愿者或组织维护,提供免费的IP地址供用户使用。这些免费代理IP具有以下特点:
数量有限:免费代理IP池中的IP数量通常较少,且可能随时发生变化。
质量不稳定:免费代理IP的质量参差不齐,可能存在速度慢、连接不稳定等问题。
使用限制:部分免费代理IP可能有使用限制,如访问频率、使用时间等。
安全性问题:免费代理IP可能存在安全风险,如泄露用户隐私、传播恶意软件等。
在爬虫中,免费代理IP主要用于以下几个方面:
隐藏真实身份:通过使用免费代理IP,爬虫可以隐藏自己的真实IP地址,避免被目标网站封禁。
绕过反爬虫机制:部分网站采用反爬虫机制来限制爬虫的访问,使用免费代理IP可以绕过这些限制,提高数据抓取的效率。
分散请求压力:通过使用多个免费代理IP,爬虫可以将请求分散到不同的IP上,降低单个IP的请求压力。
在使用免费代理IP时,爬虫面临以下挑战:
IP失效问题:由于免费代理IP的不稳定性,可能在使用过程中出现IP失效的情况。解决方案是定期检测和更新代理IP池,及时剔除失效的IP。
访问速度受限:部分免费代理IP的访问速度较慢,影响爬虫的抓取效率。解决方案是对代理IP进行速度测试,选择速度较快的IP进行使用。
安全性风险:使用免费代理IP可能存在一定的安全风险。解决方案是采用安全措施,如使用HTTPS协议进行加密传输、定期更换代理IP等。
使用限制问题:部分免费代理IP有使用限制,可能导致爬虫无法正常使用。解决方案是了解并遵守代理IP的使用规则,避免超出限制范围。
import requests # 第三方模块
import parsel
import time # 时间模块
def check_ip(proxies_list):
"""检测代理ip的可用性"""
use_proxy = []
for ip in proxies_list:
try:
response = requests.get(url='http://httpbin.org/', proxies=ip, timeout=4)
if response.status_code == 200:
use_proxy.append(ip)
except Exception as e:
print('当前代理ip: ', ip, '请求超时, 检测不合格!!!')
else:
print('当前代理ip: ', ip, '检测通过')
return use_proxy
proxy_list = []
for page in range(1, 11):
time.sleep(0.5)
print(f'==================正在抓取第{page}页数据================')
# 1.确定数据所在地址<url>(分析网页性质<静态网页\动态网页>)
url = f'http://www.ip3366.net/?stype=1&page={page}'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36'}
# 2.发送网络请求
response = requests.get(url=url, headers=headers)
html_data = response.text # str
# print(html_data)
# 3.解析数据
# 3.1 转换数据类型
selector = parsel.Selector(html_data)
# 3.2 数据提取
trs = selector.xpath('//table[@class="table table-bordered table-striped"]/tbody/tr') # tr
"""
# 代理ip的结构
proxies_dict = {
"http": "http://" + ip:端口,
"https": "http://" + ip:端口,
}
"""
for tr in trs:
ip_num = tr.xpath('./td[1]/text()').get()
ip_port = tr.xpath('./td[2]/text()').get()
# print(ip_num, ip_port)
ip_proxy = ip_num + ':' + ip_port
# print(ip_proxy)
proxies_dict = {
'http': "http://" + ip_proxy,
'https': "https://" + ip_proxy
}
# 4.数据的保存
proxy_list.append(proxies_dict)
print('保存成功:', proxies_dict)
print(proxy_list)
print('获取到的代理ip数量: ', len(proxy_list))
print('============================正在检测代理===================================')
can_use = check_ip(proxy_list)
print('可用代理:', can_use)
print('可用代理数量:', len(can_use))