内容: 引言 · 准备工作 · 基本概念 · 第1步:安装Python和库 · 第2步:无代理的快速测试 · 第3步:通过移动代理发送请求 · 第4步:IP轮换 · 第5步:错误、超时和重试 · 第6步:验证码处理 · 检查结果 · 常见错误 · 附加功能 · 常见问题 · 结论

引言

在本分步指南中,您将设置Python的工作环境,通过移动代理发出网页请求,使用BeautifulSoup解析所需数据,并学习安全和稳定地进行IP轮换。我们将使用requests库进行网络请求,并使用BeautifulSoup解析HTML。最终,您将获得一个最小可行的爬虫,它将:通过移动代理发送HTTP请求,正确替换移动设备的头信息,在遇到错误时以智能的方式重试请求,轮换移动代理提供商的IP,在遇到验证码时进行处理,并以便于使用的形式保存数据。

本指南适合:刚入门网页抓取的新手;需要简单可靠工具的相关领域专业人士(营销、研究、OSINT);需要快速搭建工作原型并进一步开发的开发者。

需要事先了解的知识:计算机的基本操作技能;了解文件、文件夹是什么以及如何打开命令行;对Python有基本了解将是加分项,但不是必需的,因为我们将分步进行。重要的是:您必须合法地处理目标页面,并遵循网站的规则,包括robots.txt和用户协议。

预计所需时间:按照顺序进行的话需要2-4小时。环境安装和快速测试大约需要30分钟,连接移动代理和设置轮换需要40分钟到1.5小时。添加错误处理和验证码处理需要30到60分钟。

建议: 保存第4步:IP轮换第5步:错误、超时和重试的链接。这些部分通常在调试和提高稳定性时最为需要。

⚠️ 注意: 所有材料仅供学习和合法抓取实践使用。不要使用技术绕过访问限制,不要违反法律和网站使用条款。我们也不讨论VPN和其他绕过封锁的方法。

准备工作

所需工具和访问权限:一台运行Windows、macOS或Linux的计算机;互联网连接;安装的Python 3.11–3.13(建议使用最新版本);包管理器pip;文本编辑器(如Visual Studio Code、PyCharm Community或其他)。您还需要一个移动代理提供商的账户。可以参考mobileproxy.space等服务提供的功能要求:独立的代理端点,通过用户名和密码或IP进行身份验证,可配置的轮换(基于定时器或API),请求统计。

系统要求:至少4GB内存;Python和库需要1-2GB的磁盘空间;稳定的互联网速度至少为10Mbps;需要安装软件的权限。只有在安装Python(Windows)时才需要管理员权限。

需要下载和安装的内容:Python安装程序;代码编辑器(如VS Code);requests、beautifulsoup4、lxml(用于加速HTML解析)库。

创建备份(如适用):在更改现有项目之前,请创建代码文件夹的副本。如果您是第一次创建项目,请建立一个单独的工作目录。请将访问代理的文件保存在代码库外部,并尽可能使用.env文件和秘密管理器。

建议: 创建项目文件夹时,请确保名称中没有空格和西里尔字母,例如parser_mobile_proxy。这将简化脚本的运行并避免路径错误。

基本概念

关键术语的简单解释:解析或网页抓取是从网站页面自动收集公开可用数据。requests是用于发出HTTP请求的Python库。BeautifulSoup是用于解析HTML并根据标签、类、属性提取内容片段的Python库。代理是中间服务器,以自己的名义向网站发送请求。移动代理是使用移动运营商IP地址的代理。IP轮换是以特定频率或根据命令更改出口IP。

工作原理的基本原则:您向网站发出HTTP请求;请求通过移动代理发送;网站看到的是代理地址,而不是您的实际地址。您将获得HTML页面,并使用BeautifulSoup进行解析。

开始前需要理解的重要内容:遵循robots.txt和网站条款;避免频繁请求给服务器施加压力;使用超时设置;合理地同时发送请求;处理4xx和5xx响应代码。移动代理有助于降低触发欺诈警报和限制的概率,因为移动IP段通常被真实用户使用。但稳定性依赖于提供商的质量、负载和代码的正确性。

⚠️ 注意: 不要使用抓取技术绕过授权或未经允许访问受限区域。不要试图干扰网站的正常运行。只处理您有权处理的公开数据。

第1步:安装Python和库

步骤目标

安装Python和必要的库,创建项目和基本文件。完成此步骤后,您将能够运行脚本并发出HTTP请求。

分步指导

  1. 从官方网站下载并安装Python。在Windows安装时,请勾选“将Python添加到PATH”。在macOS上,可以使用包管理工具brew或官方安装程序。在Linux上,使用您系统的库。
  2. 检查安装情况。在终端中输入命令:python --version 或 python3 --version。确保版本在3.11到3.13之间。
  3. 创建项目文件夹,例如C:\Users\您的用户名\parser_mobile_proxy 或 /Users/您的用户名/parser_mobile_proxy。
  4. 在代码编辑器中打开项目文件夹。创建main.py文件和requirements.txt文件。
  5. 在requirements.txt中添加:requests==2.32.3; beautifulsoup4==4.12.3; lxml==5.2.2。
  6. 使用命令pip install -r requirements.txt 或 pip3 install -r requirements.txt安装依赖。
  7. 检查库是否已安装。在终端执行python -c "import requests, bs4, lxml; print('ok')"。应输出ok。

重要事项

重要: 在虚拟环境中安装库,以避免版本冲突。您可以使用命令python -m venv .venv创建环境,并通过source .venv/bin/activate(macOS、Linux)或 .venv\Scripts\activate(Windows)激活它,然后使用pip install -r requirements.txt运行。

建议: 如果您没有管理员权限,请使用用户安装pip install --user -r requirements.txt或在虚拟环境中工作。

预期结果

您可以运行一个简单的脚本且无误地导入所需模块。

可能的问题和解决方案

  • 找不到python命令。解决方案:使用python3或检查PATH设置。重新安装Python时确保勾选“添加到PATH”。
  • lxml版本冲突。解决方案:升级pip (python -m pip install --upgrade pip),然后重新安装lxml。
  • 安装时权限不足。解决方案:激活虚拟环境或使用--user标记。

✅ 检查: 命令python -c "import requests, bs4; print('ready')"输出ready,而main.py文件存在于项目文件夹中。

第2步:无代理的快速测试

步骤目标

在连接移动代理之前,确认requests + BeautifulSoup的基本组合有效。我们将对测试页面发出普通请求并提取标题。

分步指导

  1. 在编辑器中打开main.py文件。
  2. 插入基本的请求和解析代码。
  3. 运行脚本并检查输出。

示例代码

import requests; from bs4 import BeautifulSoup; session = requests.Session(); session.headers.update({"User-Agent": "Mozilla/5.0 (Linux; Android 13; Pixel 7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0 Mobile Safari/537.36"}); url = "https://example.com"; resp = session.get(url, timeout=30); html = resp.text; soup = BeautifulSoup(html, "lxml"); title = soup.title.text.strip() if soup.title else "(没有title标签)"; print("状态:", resp.status_code, "标题:", title)

重要事项

重要: 我们使用移动User-Agent模拟移动浏览器。这将有助于在下一步骤中与移动代理的行为一致。

建议: 如果目标页面可能返回桌面版和移动版,请将HTML保存到文件以进行调试:open("page.html", "w", encoding="utf-8").write(html)。这样您可以检查标签结构。

预期结果

脚本打印响应代码和页面标题。这是一个基本检查,可以确认爬虫可以看到HTML并正常解析。

可能的问题和解决方案

  • 代码403或404。解决方案:检查URL;尝试更改User-Agent;确保网站可访问。
  • 超时。解决方案:将超时增加到60,检查互联网连接。
  • 编码不正确。解决方案:在解析之前使用resp.encoding = resp.apparent_encoding。

✅ 检查: 您看到状态200和标题行(页面标题)。如果您保存了HTML,则文件夹中可能会出现page.html。

第3步:通过移动代理发送请求

步骤目标

将移动代理连接到requests,发送请求并确认流量确实通过代理,而不是直接发送。同时添加身份验证并检查标题。

准备的内容

您的移动代理数据:主机(如proxy.provider.local或IP地址)、端口(如12345)、身份验证的用户名和密码,或者如果提供商按IP地址进行身份验证则需确认的IP白名单。大多数移动提供商,包括mobileproxy.space级别的解决方案,在个人账户中提供这些参数。

分步指导

  1. 打开main.py文件。
  2. 添加包含您的代理信息的字典proxies。
  3. 通过session.get发送带有proxies参数的请求。
  4. 检查响应并解析页面。

示例代码

import requests; from bs4 import BeautifulSoup; PROXY_HOST = "PROXY_HOST"; PROXY_PORT = 12345; PROXY_USER = "USER"; PROXY_PASS = "PASS"; proxy_auth = f"http://{PROXY_USER}:{PROXY_PASS}@{PROXY_HOST}:{PROXY_PORT}"; proxies = {"http": proxy_auth, "https": proxy_auth}; session = requests.Session(); session.headers.update({"User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 16_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.2 Mobile/15E148 Safari/604.1", "Accept-Language": "ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7"}); url = "https://example.com"; resp = session.get(url, proxies=proxies, timeout=45); print("HTTP:", resp.status_code); soup = BeautifulSoup(resp.text, "lxml"); print("标题:", soup.title.text.strip() if soup.title else "(没有)")

重要事项

重要: 如果您的提供商通过IP进行身份验证,请使用无用户名和密码的proxies格式:"http": f"http://{PROXY_HOST}:{PROXY_PORT}"。确保您当前的IP已在提供商的白名单中。

建议: 首次运行时,为了诊断TLS错误,添加参数verify=False。不要将其留在生产环境中。如果提供商要求,最好安装根证书。

建议: 将代理设置保存到.env文件中:PROXY_HOST、PROXY_PORT、PROXY_USER、PROXY_PASS。通过os.getenv或python-dotenv库加载它们,以避免将秘密保留在代码中。

预期结果

您将获得响应状态200和正确的TITLE。如果目标页面显示IP,则与您不同,因为请求是通过移动代理发送的。

可能的问题和解决方案

  • 407 代理身份验证失败。解决方案:检查用户名和密码;确保使用了正确的带身份验证的URL格式。
  • 403 禁止访问。解决方案:将User-Agent更改为移动版;检查Accept-Language标题;减少请求频率。
  • ConnectionError或ReadTimeout。解决方案:增加超时,检查提供商的代理稳定性,使用回退策略重试请求。

✅ 检查: 响应状态为200。如果您测试的页面显示您的IP,则该IP将与移动代理的IP相符(请查看提供商的仪表板)。

第4步:安全且可预测地轮换IP地址

步骤目标

设置移动代理的IP轮换,基于定时器或API命令。这可以提高抓取的稳定性并减少受到保护限制的几率。我们将实现两种方法:循环代理端点和通过API或定时器在同一端点内轮换。

分步指导

  1. 确定轮换策略:按时间(例如每5-10分钟)、按请求数量(例如每10-20次请求)或混合方式。
  2. 如果您有多个代理端点,准备一个列表并实现轮询切换。
  3. 如果提供商提供API进行IP更换,将调用添加到代码中,并等待确认的轮换窗口(通常是10-60秒)。
  4. 考虑提供商的限制:轮换的最小时间间隔和每天的API调用限制。
  5. 安排暂停和轮换后检查IP,以确认新IP是否有效。

多个端点的轮询示例

import itertools, requests; from bs4 import BeautifulSoup; proxies_list = [ {"http": "http://user1:pass1@host1:10001", "https": "http://user1:pass1@host1:10001"}, {"http": "http://user2:pass2@host2:10002", "https": "http://user2:pass2@host2:10002"} ]; cycle = itertools.cycle(proxies_list); def fetch(url): s = requests.Session(); s.headers.update({"User-Agent": "Mozilla/5.0 (Linux; Android 14) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0 Mobile Safari/537.36"}); proxies = next(cycle); r = s.get(url, proxies=proxies, timeout=45); return r; r = fetch("https://example.com/catalog"); print(r.status_code)

在同一端点通过API轮换的示例

许多移动代理提供商,包括mobileproxy.space等服务,允许在同一端点内根据定时器(例如每N分钟)或通过API请求更改IP。代码中的实现形式是额外的请求到提供商的服务URL。下面是一般模板。请根据您的提供商账户中的信息替换URL和令牌。考虑轮换的限制和窗口。

import time, requests; def rotate_ip(api_rotate_url, timeout=30): try: r = requests.get(api_rotate_url, timeout=timeout); return r.status_code, r.text; except Exception as e: return None, str(e); api_url = "http://PROXY_HOST:PORT/changeip?token=YOUR_TOKEN"; status, body = rotate_ip(api_url); print("轮换:", status, body); time.sleep(20); # 等待轮换窗口; s = requests.Session(); proxies = {"http": "http://USER:PASS@PROXY_HOST:PORT", "https": "http://USER:PASS@PROXY_HOST:PORT"}; resp = s.get("https://example.com", proxies=proxies, timeout=45); print(resp.status_code)

重要事项

重要: 轮换并不是银弹。如果在短时间内发出过多请求,保护触发器可能会在更换IP时触发。保持适度的请求频率,使用随机延迟和回退重试。

建议: 计划按小时和负载进行轮换。例如,每10-20分钟进行一次轮换,或在对同一域名发送15-25个请求后再进行更换。这使得行为更加平滑且显得自然。

建议: 保存请求的元数据:使用了哪个代理,使用的IP,服务器返回的状态。这将加速调试过程。

预期结果

您的代码稳定地切换代理端点或在同一端点发起IP更换并等待轮换窗口。更换后,请求将继续成功,状态为200。

可能的问题和解决方案

  • IP在API调用后未更改。解决方案:等待更长时间,检查限制;确保您调用的是正确的URL并且令牌有效;查看提供商面板的统计数据。
  • 在轮换时可用性下降。解决方案:在轮换期间切换到另一个端点,使用备用渠道进行轮询。
  • 频繁出现429请求过多。解决方案:增加请求间隔,减少同时的线程数。

✅ 检查: 如果在日志中定期打印当前IP,可以看到IP地址根据轮换策略变化,请求状态保持在200-299之间。

第5步:错误、超时和重试处理

步骤目标

使您的爬虫对网络故障和服务器暂时性错误具有鲁棒性。我们将添加超时、重试机制、随机延迟和日志记录。

分步指导

  1. 确定最大重试次数(例如3-5次)和基本延迟(例如1-2秒)。
  2. 实现回退机制:每次失败时将等待时间翻倍并增加一些随机馈送。
  3. 捕捉5xx和429错误代码为瞬时错误,谨慎对待4xx(403通常是永久性的封锁)。
  4. 添加清晰的日志,了解每一步发生了什么。
  5. 将网络调用封装到一个易于复用的fetch_safely函数中。

示例代码

import time, random, requests; from bs4 import BeautifulSoup; def fetch_safely(url, session, proxies=None, max_retries=4, base_delay=1.5, timeout=45): attempt = 0; while attempt <= max_retries: try: r = session.get(url, proxies=proxies, timeout=timeout); if r.status_code in (200, 201): return r; elif r.status_code in (429, 500, 502, 503, 504): delay = base_delay * (2 ** attempt) + random.uniform(0.0, 0.7); time.sleep(delay); attempt += 1; continue; elif r.status_code == 403: return r; else: return r; except (requests.exceptions.ConnectTimeout, requests.exceptions.ReadTimeout, requests.exceptions.ConnectionError) as e: delay = base_delay * (2 ** attempt) + random.uniform(0.1, 0.9); time.sleep(delay); attempt += 1; continue; return None

重要事项

重要: 设置合理的超时:不稳定的网络应设置30-60秒,快速网络应设定10-20秒。除非有必要,否则不要关闭SSL检查。

建议: 使用logging模块来进行日志记录。在开始时设置最小配置:logging.basicConfig(level=logging.INFO, format="%(asctime)s [%(levelname)s] %(message)s"). 这有助于诊断。

建议: 区分“临时故障”和“永久故障”。临时故障进行重试,永久故障进行记录并继续,以避免死循环。

预期结果

脚本在临时错误出现时保持运行并返回响应,或者正确进入下一任务而不会崩溃。

可能的问题和解决方案

  • 重试无效,总是429。解决方案:减少请求频率,延长等待时间,提高IP轮换的间隔。
  • 持续出现403。解决方案:确认网站策略,检查头信息的正确性,减少请求频率,必要时使用官方API。
  • 频繁出现ConnectionError。解决方案:检查移动代理提供商;可能需要选择其他区域或其他端口。

✅ 检查: 通过模拟故障,您能在日志中看到增加延迟的重试。在1-2次尝试后,许多请求成功完成。

第6步:合法方式检测和处理验证码

步骤目标

学习识别页面是否返回验证码,并正确响应:减少负载、暂时暂停请求、合理使用IP轮换。我们并没有绕过保护,而是在公平抓取的框架内行事。

分步指导

  1. 确认目标网站的验证码特征:HTML中是否有关键词(captcha、g-recaptcha)、是否有不寻常字段的表单、是否有占位页面。
  2. 在进行主要逻辑解析之前,向代码中添加HTML内容检查。
  3. 出现验证码后,执行缓和措施:增加暂停;减少该域的请求频率;激活IP轮换;尝试重发请求。
  4. 如果验证码持续存在,请停止自动尝试并研究网站的使用规则。数据可能通过官方API获得。

示例代码

from bs4 import BeautifulSoup; import time, requests; def is_captcha(html): text = html.lower(); hints = ["captcha", "g-recaptcha", "hcaptcha", "distil", "cloudflare", "please verify", "are you a human"]; return any(h in text for h in hints); def get_with_captcha_handling(url, session, proxies, rotate_func=None): r = session.get(url, proxies=proxies, timeout=45); if r.status_code == 200 and not is_captcha(r.text): return r; time.sleep(10); if rotate_func: try: rotate_func(); time.sleep(20); except Exception: pass; r2 = session.get(url, proxies=proxies, timeout=60); return r2

重要事项

重要: 如果验证码继续返回,请降低扫描强度,等待下一次轮换窗口,或切换到其他端点。遵循公正性和网站规则。

建议: 有时验证码仅在某些路径中会出现。仅降低此类路径的频率,而不仅限于整个域。这将保持整体速度。

⚠️ 注意: 我们不讨论使用第三方服务、绕过脚本、浏览器模拟及类似技术的验证码绕过手段。请遵守允许的框架,使用官方API(如可用)。

预期结果

脚本能够温和地应对验证码的出现:暂停、激活IP轮换(如可用)并重试请求。这降低了误拒绝的数量,并有助于保持稳定性。

可能的问题和解决方案

  • 每次请求都出现验证码。解决方案:大幅降低请求频率,使用不同的请求间隔,切换代理的时区或区域(如可用),检查robots.txt。
  • 验证码消失但数据不稳定。解决方案:增加超时,保存和分析HTML,比较不同IP的页面版本。

✅ 检查: 在人为触发(例如,短时间内频繁请求)后,您会看到日志中存在暂停和轮换,接下来成功响应没有验证码。

检查结果

检查清单

  • Python已安装,依赖已设置。
  • 无代理的脚本获取HTML并解析标题。
  • 使用移动代理的脚本返回状态为200。
  • IP轮换已启用并经过验证。
  • 错误时的重试正常工作,超时设置完成。
  • 有对验证码特征的处理。
  • 数据按期望格式保存到文件或在控制台打印。

测试方法

  1. 运行无代理的基本请求,确保标题爬取正常。
  2. 启用代理并重复请求,比较结果。
  3. 调用提供商的IP切换(如可用),并在20-60秒后重复请求。
  4. 人为地将超时缩减到1-2秒,检查重试机制并在恢复超时后能否正常返回。
  5. 对网站进行多个连续请求,确保在出现验证码特征时设置暂停,并在需要时激活轮换。

成功执行指标

  • 在“平稳”网站上的成功请求比例超过90%。
  • 429和5xx代码出现频率低且通过重试处理。
  • IP轮换按要求进行,而没有长时间的停顿。

建议: 引入“响应时间”和“重试次数”的指标并记录它们。有助于理解何时更改轮换策略或请求频率。

常见错误和解决方案

  • 问题:407 代理身份验证失败。原因:用户名或密码不正确,代理URL格式不对。解决方案:检查http://USER:PASS@HOST:PORT格式,确保没有多余的符号和空格;如是IP身份验证,请移除用户名和密码。
  • 问题:403 禁止访问。原因:网站保护已触发,不合适的User-Agent或请求过频。解决方案:使用移动User-Agent,降低请求频率,启用IP轮换,检查Accept、Accept-Language和Referer。
  • 问题:429 请求过多。原因:超出请求频率限制。解决方案:引入指数回退策略,增加延迟,降低轮换频率,按照时间段分配请求。
  • 问题:ConnectionError或ReadTimeout。原因:代理渠道不稳定或网络负载高。解决方案:增加超时,使用备份频道进行重试,使用回退。
  • 问题:解析错误,数据为空。原因:HTML结构变化或内容通过JavaScript加载。解决方案:更新BeautifulSoup选择器;如数据动态生成,检查页面的网络请求并使用相应的官方JSON端点(如可用且允许的)。
  • 问题:每个页面都出现验证码。原因:过度负载或可疑活动。解决方案:降低频率,增加暂停时间,进行IP轮换,确保头信息正确并遵循robots.txt。
  • 问题:几次成功请求后被封锁。原因:脚本行为可预测。解决方案:引入随机延迟,变更请求顺序,轮换代理,更新头信息。

建议: 在事件发生时保存HTML示例。这将快速帮助区分版式变化和反机器人保护的迹象。

附加功能

高级设置

  • 会话和cookies:使用requests.Session自动存储cookies,这使得行为更接近真实浏览器。
  • 头信息:根据需要添加Accept、Accept-Language、Referer和DNT。改变Mobile User-Agent来自移动代理池。
  • SOCKS代理:如有需要,可以连接requests[socks]。但移动代理通常作为HTTP(S)提供。
  • 保存为CSV或JSON格式:抓取数据后将其保存为文件。这对集成是方便的。

抓取的迷你管道示例

import csv, requests, time; from bs4 import BeautifulSoup; MOBILE_UA = "Mozilla/5.0 (Linux; Android 14) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0 Mobile Safari/537.36"; session = requests.Session(); session.headers.update({"User-Agent": MOBILE_UA}); proxies = {"http": "http://USER:PASS@HOST:PORT", "https": "http://USER:PASS@HOST:PORT"}; urls = ["https://example.com/page1", "https://example.com/page2"]; rows = []; for u in urls: r = session.get(u, proxies=proxies, timeout=45); if r.status_code == 200: s = BeautifulSoup(r.text, "lxml"); title = s.title.text.strip() if s.title else ""; rows.append({"url": u, "title": title}); time.sleep(2); open("data.csv", "w", newline="", encoding="utf-8"); with open("data.csv", "w", newline="", encoding="utf-8") as f: w = csv.DictWriter(f, fieldnames=["url","title"]); w.writeheader(); w.writerows(rows); print("已保存:", len(rows))

优化

  • 批量处理:根据延时和轮换将请求按域名分组。
  • 缓存:本地缓存已获得的页面,以避免重复请求。
  • 耐心策略:在“低峰”时段安排请求,这是网站负载较低的时间。

建议: 如果您有多个任务,将其分割成小批量并依次运行。这将提高稳定性并降低出现验证码的概率。

建议: 许多移动代理提供商(包括mobileproxy.space级别的解决方案)都提供直观的统计面板。检查时间、频率和响应代码——这将帮助您更好地理解何时进行轮换。

常见问题

问题: 如何确认请求确实通过移动代理? 回答: 检查服务提供商处的活动连接和当前外部IP,将其与页面响应中看到的进行比较。通常提供商也会显示对端点的请求统计。

问题: 如何选择User-Agent:Android还是iOS? 回答: 选择与您内容相对应的平台(网站的移动版本)。通常Android代理会产生可预期的结果。测试两者并记录下拒绝较少的情况。

问题: 抓取时应该多频繁更换IP? 回答: 基本建议是:不超过每10-20分钟更换一次,或在对同一域名进行15-25次请求后更换。根据负载情况进行调整,避免频繁更换。

问题: 如果网站的内容是通过JavaScript加载的,我该怎么办? 回答: 检查浏览器开发者工具中的网络请求。数据通常会通过JSON端点返回。如果访问是合法并且未违反网站条款,请使用这些端点。否则请遵循网站规则。

问题: 可以同时使用多个移动代理吗? 回答: 可以,如果需要分配负载。设置轮询并跟踪每个提供商的限制。

问题: 如何安全存储凭据? 回答: 使用环境变量和.env文件,不要将秘密提交到代码库。在生产中,使用秘密管理器存储秘密。

问题: 如果大规模出现错误,如何正确中止脚本? 回答: 定义不成功尝试的计数器和上限。如果连续N个域名请求失败,请长时间暂停,记录事件并结束进程。

问题: 如果有内置HTML解析器html.parser,lxml有必要吗? 回答: 内置解析器适用于简单情况。lxml更快且对部分不正确的HTML更具韧性。建议进行常规解析时使用lxml。

问题: 如果网站更改版式该怎么办? 回答: 保存测试页面,添加回归检查选择器。对更改做出响应时更新BeautifulSoup逻辑,并编写适应新结构的适配器函数。

问题: 如果普通代理能工作,为什么要使用移动代理? 回答: 移动地址通常因移动网络和流量分配的特性而产生更少的可疑性。这在合理负载下提供了更稳定的响应。

结论

已完成的操作总结:您已安装Python和requests及BeautifulSoup库,确认基本爬虫未使用代理情况下工作正常,纳入移动代理并验证请求确实通过它发送,设置多种方式进行IP轮换,实施错误处理和对验证码的温和响应。现在您有了一个支持公开数据抓取的基础项目。

下一步该做什么:根据自己的需求发展爬虫——添加新的选择器、将数据保存到数据库中、设置启动计划;当成功请求的比例下降或429和403状态上升时设置告警;添加配置文件以管理参数(频率、轮换、超时等)。

可以发展方向:探索Python的异步请求(aiohttp)、任务队列(Celery、RQ)、数据存储和分析(SQLite、PostgreSQL、Pandas)。单独查看数据处理和与网站交互的法律问题,以及通过合法API访问数据的方式。对移动代理使用类似于mobileproxy.space等现代服务所提供的功能:灵活的轮换、统计、不同区域和稳定支持。

建议: 保存本指南并定期返回第4步:IP轮换第5步:错误、超时和重试的部分。这些部分可以显著提高稳定性,帮助避免停工。

⚠️ 注意: 始终检查目标网站的robots.txt和服务条款。如果规则禁止自动数据抓取,请尊重限制并寻找合法的替代方案,例如开放或付费API。