穿越迷宫:动态内容抓取的免费代理工作流程
了解动态内容抓取
动态内容,这股驱动现代网页活力的活力,无法通过简单的 HTTP 请求实现。它由 JavaScript 渲染,需要的不仅仅是简单的 GET 请求;它需要精心编排——伪装成合法浏览器的请求、绕过 IP 禁令的代理,以及能够解读字里行间含义的代码。
代理在动态抓取中的作用
代理是我们数字伪装中的面具,对于以下方面至关重要:
- 规避基于 IP 的速率限制
- 规避地理限制
- 分配流量以避免检测
但如何才能在不花大钱的情况下获得这种匿名性呢?免费代理——转瞬即逝、难以驾驭,却又不可或缺。让我们以外科手术般的精准度剖析它们的用途。
工作流程 1:使用 Requests 和 BeautifulSoup 轮换免费公共代理
原料
- 免费代理列表
请求
,BeautifulSoup
在 Python 中
步骤
- 收获代理
抓取免费代理列表,例如来自 免费代理列表.net.
“`python
导入请求
从 bs4 导入 BeautifulSoup
定义获取代理():
url = 'https://free-proxy-list.net/'
汤 = BeautifulSoup(requests.get(url).content,'html.parser')
代理=设置()
对于 soup.find('table', id='proxylisttable').tbody.find_all('tr') 中的行:
如果 row.find_all('td')[6].text == 'yes': 仅限 # HTTPS 代理
ip = row.find_all('td')[0].文本
端口 = row.find_all('td')[1].文本
proxies.add(f'{ip}:{port}')
返回列表(代理)
“`
- 轮换请求代理
“`python
随机导入
代理=获取代理()
def fetch_with_proxy(url):
代理 = 随机.选择(代理)
尝试:
resp = 请求.get(url,代理={“http”:f”http://{proxy}”,“https”:f”http://{proxy}”},超时=5)
如果 resp.status_code == 200:
返回相应文本
例外情况:
经过
返回 None
“`
- 处理动态内容
对于 JS 最少的页面,检查网络流量以找到 XHR 端点并直接获取数据。
优点和缺点
特征 | 优点 | 缺点 |
---|---|---|
设置 | 快速、简单 | 代理通常不可靠 |
匿名 | IP轮换减少禁令 | 代理频繁死机/缓慢 |
动态内容 | 仅适用于简单的 JS 渲染网站 | 完整的 JS 网站需要浏览器模拟器 |
工作流程 2:使用 Selenium 和免费代理轮换进行抓取
原料
步骤
- 获取代理列表
与上述逻辑类似,但针对 sslproxies.org.
- 配置 Selenium 使用代理
“`python
从 selenium 导入 webdriver
从 selenium.webdriver.chrome.options 导入选项
def get_chrome_driver(代理):
选项=选项()
选项.add_argument(f'--proxy-server=http://{proxy}')
选项.add_argument('--无头')
返回 webdriver.Chrome(options=options)
“`
- 抓取动态内容
Python
代理=获取代理()
驱动程序 = get_chrome_driver(随机选择(代理))
driver.get('https://quotes.toscrape.com/js/')
内容 = 驱动程序.page_source
驱动程序.退出()
诗意注解
使用 Selenium,浏览器就是您的画笔,以人类用户看到的方式绘制页面 - JavaScript、CSS 和所有微妙的交互色调。
优点和缺点
特征 | 优点 | 缺点 |
---|---|---|
JS渲染 | 处理任何动态内容 | 资源密集型 |
代理轮换 | 有效屏蔽 IP | 代理可能会减慢或阻止浏览器 |
检测 | 更像人类,更难察觉 | 免费代理经常被大型网站屏蔽 |
工作流程 3:面向 Node.js 爱好者的 Puppeteer 与 ProxyChain
原料
步骤
- 获取免费代理
JavaScript的
const axios = require('axios');
异步函数 getProxies() {
const res = await axios.get('https://www.proxy-list.download/api/v1/get?type=https');
返回 res.data.split('\r\n').filter(Boolean);
}
- 使用 ProxyChain 和 Puppeteer 轮换代理
“`javascript
const puppeteer = require('puppeteer');
const ProxyChain = require('proxy-chain');
(异步 () => {
const proxies = 等待 getProxies();
for (代理的 const proxyUrl) {
const anonymizedProxy = await ProxyChain.anonymizeProxy(http://${proxyUrl}
);
const browser = await puppeteer.launch({
参数:[--proxy-server=${anonymizedProxy}
, '–no-sandbox', '–disable-setuid-sandbox'],
无头:是的,
});
const page = await browser.newPage();
尝试 {
等待页面.goto('https://quotes.toscrape.com/js/',{waitUntil:'networkidle2'});
const content = await page.content();
// 处理内容...
} 捕获(e){
// 跳过坏代理
}
等待浏览器.关闭();
}
})();
“`
优点和缺点
特征 | 优点 | 缺点 |
---|---|---|
自动化 | Node.js 中的健壮脚本 | Node.js 依赖项 |
代理轮换 | ProxyChain 管理故障 | 免费代理通常不稳定/缓慢 |
动态内容 | Puppeteer 渲染所有 JS | 通过代理速度限制速率 |
工作流程4:使用Scrapy + 免费代理中间件进行智能请求调度
原料
- 刮擦
- scrapy-旋转代理
- 免费代理列表(proxyscrape.com)
步骤
- 安装中间件
pip 安装 scrapy-rotating-proxies
- 配置 Scrapy 设置
Python
#设置.py
旋转代理列表路径 = 'proxies.txt'
下载器中间件 = {
'rotating_proxies.middlewares.RotatingProxyMiddleware':610,
'rotating_proxies.middlewares.BanDetectionMiddleware': 620,
}
- 填充代理列表
下载并保存代理至 代理.txt
:
https://api.proxyscrape.com/v2/?request=getproxies&protocol=http&timeout=1000&country=all&ssl=all&anonymity=all
- 使用 Scrapy Spider 进行抓取
Scrapy 借助旋转代理,在动态内容的花园中轻手轻脚地穿梭。完整的 JS 代码,请使用 scrapy 剧作家:
狂欢
pip 安装 scrapy-playwright
在你的蜘蛛中:
“`python
导入 scrapy
类 QuotesSpider(scrapy.Spider):
名称 =“引号”
start_urls = ['https://quotes.toscrape.com/js/']
def start_requests(self): 对于 self.start_urls 中的 url:yield scrapy.Request(url,meta={“playwright”:True}) def parse(self,response): 对于 request.css(“div.quote”) 中的 quote:yield { “text”:quote.css(“span.text::text”).get(), “author”:quote.css(“small.author::text”).get(), }
“`
优点和缺点
特征 | 优点 | 缺点 |
---|---|---|
速度 | 高效的请求调度 | Scrapy的学习曲线 |
代理轮换 | 中间件处理禁令 | 免费代理不太可靠 |
JS 支持 | 使用 Playwright 处理完整的 JS | 重量级设置 |
工作流程 5:通过免费代理网关进行面向 API 的数据抓取
原料
- Web 共享 API (有限免费套餐)
- ScraperAPI 免费计划 (限制使用)
步骤
- 获取 API 密钥或代理端点
注册并获取免费端点。
- 通过代理网关路由请求
对于 ScraperAPI:
Python
api_key = '你的 API 密钥'
url = f'http://api.scraperapi.com/?api_key={api_key}&url=https://quotes.toscrape.com/js/'
响应 = 请求.get(url)
对于 Web 共享代理,使用方法与前面的示例相同。
优点和缺点
特征 | 优点 | 缺点 |
---|---|---|
可靠性 | 托管代理,减少停机时间 | 有限的免费请求 |
易于使用 | 摘要代理轮换 | 可能会阻止某些网站 |
动态内容 | 一些 API 在返回之前渲染 JS | 频繁使用的付费套餐 |
比较汇总表
工作流程 | 动态 JS 支持 | 代理轮换 | 可靠性 | 免费限制 | 最佳用例 |
---|---|---|---|---|---|
请求+免费代理 | 低的 | 手动的 | 低的 | 代理被阻止/速度慢 | 简单的 XHR API |
Selenium + 免费代理 | 高的 | 手动的 | 中等的 | 代理被阻止,CPU 使用率高 | 复杂 JS 网站,规模较小 |
Puppeteer + ProxyChain | 高的 | 自动化 | 中等的 | 代理频繁失败 | Node.js 自动化 |
Scrapy + 旋转代理 | 高(与剧作家合作) | 自动化 | 中等的 | 中间件配置,慢速代理 | 可扩展、先进的抓取 |
代理 API 网关 | 高(取决于 API) | 自动化 | 高的 | 请求数量有限,需要注册 | 一次性、可靠的抓取 |
资源
- 免费代理列表.net
- sslproxies.org
- 代理列表.下载
- proxyscrape.com/免费代理列表
- scrapy-旋转代理
- scrapy 剧作家
- Puppeteer 额外插件代理
- Web共享免费代理列表
- ScraperAPI
让你的代码成为凿子,让你的代理成为大理石——耐心雕刻,因为每一个动态页面都是一个数字雕塑,等待着表面之下的启示。
评论 (0)
这里还没有评论,你可以成为第一个评论者!