使用requests-html爬取免费代理IP返回空列表的解决方法求助
问题原因及修复方案
核心错误原因
resp.html.find("data-ip")的参数格式错误:
requests-html的find()方法默认传入的是HTML标签名,该写法会搜索页面中所有<data-ip>标签,而实际IP存储在普通元素的data-ip自定义属性中,需要用属性选择器语法[data-ip]匹配所有携带该属性的元素。
补充优化项
- 新增
User-Agent请求头模拟浏览器访问,避免站点拦截无标识的爬虫请求 - 渲染时添加
sleep参数等待页面资源加载完成,避免未渲染完成就开始解析 - 匹配到元素后需要通过
attrs属性提取data-ip的值,才能拿到最终的IP内容
修正后可运行代码
from requests_html import HTMLSession # 创建HTML会话对象 session = HTMLSession() # 模拟浏览器请求头 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" } resp = session.get("https://advanced.name/freeproxy", headers=headers) # 渲染JS,sleep参数控制渲染后等待时间,可根据网络情况调整 resp.html.render(sleep=2) # 用属性选择器匹配所有带data-ip属性的元素 ip_elements = resp.html.find("[data-ip]") # 提取所有IP值 ip_list = [element.attrs["data-ip"] for element in ip_elements] print(ip_list)
注意事项
- 首次运行
render()方法时,requests-html会自动下载适配的Chromium内核,需要等待下载完成后才会正常执行渲染,不要中途终止程序 - 代理站点普遍有反爬策略,多次请求失败可间隔一段时间再尝试
内容的提问来源于stack exchange,提问作者PythonC
相关产品推荐
相关产品推荐

