我们青果网络长期服务网站采集器、招投标数据这类公开数据采集业务,实践中反复看到:真正影响运行质量的不是哪一行语法,而是代理存活周期、并发模型和请求节奏是否匹配。 代理参数填对了,为什么任务还是不稳?代理IP接入的判断顺序应该是授权、连通、复用、切换,不能只看请求是否返回成功。一次测试能返回页面,只能证明当时的地址可连接,不能证明它适合长任务、并发任务或固定会话。 上线前先确认4项输入: 输入 应该确认什么 常见处理 代理地址 主机、端口、协议是否匹配 使用控制台或提取接口返回的真实代理地址 验证方式 白名单还是账密 固定服务器优先白名单,环境变化频繁时使用账密 存活周期 单个IP可使用多久 缓存截止时间,提前刷新,不把失效地址留给下一批任务 业务节奏 单次、批量、并发还是框架任务 分别选择requests、urllib、aiohttp或Scrapy 青果网络支持HTTP、HTTPS、SOCKS5协议,验证方式可选白名单或账密,终端数不限制,白名单数量为256个(来源:青果网络官网)。进入代理IP提取工具后,应记录返回结果里的server字段,它才是代码需要使用的代理地址。proxy_ip是实际出口IP,request_id用于定位接口调用问题(来源:青果网络官网)。需要按任务量评估资源时,可同时查看国内短效代理的存活周期、提取上限和验证方式。 下面的示例统一使用HTTP代理连接HTTPS目标。账号、密码和地址都从环境变量读取,避免把凭据写进仓库。测试目标只是公开的出口查询接口,正式采集前仍需确认数据授权范围、站点协议和访问频次要求。 export QG_PROXY_HOST="127.0.0.1" export QG_PROXY_PORT="8080" export QG_PROXY_USER="your_auth_key" export QG_PROXY_PASS="your_auth_password" 如果使用白名单验证,可不设置QG_PROXY_USER和QG_PROXY_PASS。先在控制台把运行机器的公网IP加入白名单,再执行代码。 方法一:单次请求怎么用requests配置代理IP?临时测试、低频接口采集和连通性验证,直接给requests.get传入proxies最清楚。这类写法没有隐式状态,适合先确认协议、鉴权和出口是否正确。 先安装依赖: python -m pip install requests 完整代码如下: import os from urllib.parse import quote import requests def build_proxy_url() -> str: host = os.environ["QG_PROXY_HOST"] port = os.environ["QG_PROXY_PORT"] user = os.getenv("QG_PROXY_USER") password = os.getenv("QG_PROXY_PASS") if user and password: safe_user = quote(user, safe="") safe_password = quote(password, safe="") return f"http://{safe_user}:{safe_password}@{host}:{port}" return f"http://{host}:{port}" def main() -> None: proxy_url = build_proxy_url() proxies = { "http": proxy_url, "https": proxy_url, } response = requests.get( "https://httpbin.org/ip", proxies=proxies, timeout=(5, 15), ) response.raise_for_status() print(response.json()) if __name__ == "__main__": main() 这段代码有3个值得保留的细节: quote会处理账号或密码中的特殊字符,避免代理URL被错误拆分。timeout同时设置连接超时和读取超时,避免任务长期卡住。raise_for_status把异常状态转换成显式错误,便于上层记录和重试。 不要把所有异常都立即重试。连接失败可以换一个已验证的代理后再试,目标站点返回频次提示时则应降低请求节奏,并检查任务是否符合站点允许的访问规则。 方法二:不安装第三方库,urllib怎么配置代理?受限环境或轻量脚本可以使用Python标准库urllib,代价是会话复用和异步能力较弱。它适合部署依赖严格、请求量不大的内部工具,也适合用来排除第三方库配置因素。 完整代码如下: import json import os from urllib.error import HTTPError, URLError from urllib.parse import quote from urllib.request import ProxyHandler, Request, build_opener def build_proxy_url() -> str: host = os.environ["QG_PROXY_HOST"] port = os.environ["QG_PROXY_PORT"] user = os.getenv("QG_PROXY_USER") password = os.getenv("QG_PROXY_PASS") if user and password: auth = f"{quote(user, safe='')}:{quote(password, safe='')}@" else: auth = "" return f"http://{auth}{host}:{port}" def main() -> None: proxy_url = build_proxy_url() opener = build_opener( ProxyHandler({"http": proxy_url, "https": proxy_url}) ) request = Request( "https://httpbin.org/ip", headers={"User-Agent": "QG-Proxy-Config-Demo/1.0"}, ) try: with opener.open(request, timeout=15) as response: body = response.read().decode("utf-8") print(json.loads(body)) except HTTPError as exc: print(f"HTTP error: {exc.code}") raise except URLError as exc: print(f"Network error: {exc.reason}") raise if __name__ == "__main__": main() urllib没有额外安装成本,但工程能力要自己补齐。批量采集时至少增加日志、有限重试、代理失效时间缓存和任务级失败统计。若需求已经包含连接池、Cookie保持或复杂重试,不要为了少一个依赖而继续堆代码,切到requests.Session或采集框架更合适。 方法三:并发采集怎么用aiohttp配置代理?并发任务应把代理配置放进异步请求入口,并用信号量控制真实并发,而不是一次创建大量协程。aiohttp适合网站可用性监测、公开页面批量检查这类I/O密集任务,但并发值必须根据目标站点规则和自身带宽逐步验证。 先安装依赖: python -m pip install aiohttp 完整代码如下: import asyncio import os from typing import Any import aiohttp TARGETS = [ "https://httpbin.org/ip?task=1", "https://httpbin.org/ip?task=2", "https://httpbin.org/ip?task=3", ] def load_proxy_config() -> tuple[str, aiohttp.BasicAuth | None]: host = os.environ["QG_PROXY_HOST"] port = os.environ["QG_PROXY_PORT"] user = os.getenv("QG_PROXY_USER") password = os.getenv("QG_PROXY_PASS") proxy_url = f"http://{host}:{port}" proxy_auth = aiohttp.BasicAuth(user, password) if user and password else None return proxy_url, proxy_auth async def fetch( session: aiohttp.ClientSession, semaphore: asyncio.Semaphore, url: str, proxy_url: str, proxy_auth: aiohttp.BasicAuth | None, ) -> dict[str, Any]: async with semaphore: for attempt in range(1, 3): try: async with session.get( url, proxy=proxy_url, proxy_auth=proxy_auth, ) as response: response.raise_for_status() return {"url": url, "data": await response.json()} except (aiohttp.ClientError, asyncio.TimeoutError) as exc: if attempt == 2: return {"url": url, "error": str(exc)} await asyncio.sleep(attempt) return {"url": url, "error": "unexpected state"} async def main() -> None: proxy_url, proxy_auth = load_proxy_config() timeout = aiohttp.ClientTimeout(total=20, connect=5) semaphore = asyncio.Semaphore(3) async with aiohttp.ClientSession(timeout=timeout) as session: tasks = [ fetch(session, semaphore, url, proxy_url, proxy_auth) for url in TARGETS ] results = await asyncio.gather(*tasks) for result in results: print(result) if __name__ == "__main__": asyncio.run(main()) 异步配置最容易出现两个误判。第一,协程数量不等于合理并发,信号量才是并发闸门。第二,重试不能无限叠加,代码里只做有限次数重试,并在最终失败时保留URL和错误原因。这样才能区分代理连接问题、目标响应问题和程序解析问题。 如果代理IP存活较短,应按截止时间分批调度任务。不要让同一批任务跨越代理有效期,也不要每发一个请求就调用一次提取接口。青果国内短效代理的按量提取规格中,IP存活周期为1分钟,单次提取上限为200,单IP带宽为2Mbps(来源:青果网络官网)。这类参数更适合按批次装载代理,再把同批任务限制在可用窗口内。 方法四:Scrapy项目怎么统一注入代理?Scrapy应通过下载中间件集中写入代理配置,避免每个Spider重复处理鉴权和切换。这种方式适合网站采集器等长期工程,后续可以在中间件里加入代理池、失败计数和刷新逻辑。 先安装依赖: python -m pip install scrapy 下面是一份可直接通过runspider运行的单文件示例: import base64 import os import scrapy from scrapy import Request from scrapy.crawler import CrawlerProcess class ProxyMiddleware: def __init__(self) -> None: host = os.environ["QG_PROXY_HOST"] port = os.environ["QG_PROXY_PORT"] self.proxy_url = f"http://{host}:{port}" user = os.getenv("QG_PROXY_USER") password = os.getenv("QG_PROXY_PASS") if user and password: token = base64.b64encode( f"{user}:{password}".encode("utf-8") ).decode("ascii") self.proxy_auth = f"Basic {token}" else: self.proxy_auth = None def process_request(self, request: Request, spider: scrapy.Spider) -> None: request.meta["proxy"] = self.proxy_url if self.proxy_auth: request.headers["Proxy-Authorization"] = self.proxy_auth class ProxyCheckSpider(scrapy.Spider): name = "proxy_check" start_urls = ["https://httpbin.org/ip"] custom_settings = { "DOWNLOADER_MIDDLEWARES": { "__main__.ProxyMiddleware": 350, }, "CONCURRENT_REQUESTS": 4, "DOWNLOAD_TIMEOUT": 15, "RETRY_TIMES": 1, "LOG_LEVEL": "INFO", } def parse(self, response: scrapy.http.Response): yield { "status": response.status, "body": response.json(), } if __name__ == "__main__": process = CrawlerProcess() process.crawl(ProxyCheckSpider) process.start() 保存为proxy_spider.py后执行: scrapy runspider proxy_spider.py -O proxy_result.json 正式项目里,中间件还应维护代理状态。建议把代理记录设计成server、deadline、fail_count、last_error4个字段。请求前检查截止时间,请求后按错误类型累计失败,不要因为一次业务响应异常就立刻淘汰代理。若不同采集任务对地区、会话和频次的要求不同,应分开管理代理队列,避免一个任务的调用节奏影响其他任务。 4种方法应该怎么选?选择标准不是代码长短,而是任务生命周期和并发模型。单次脚本优先简单,长期任务优先集中治理,只有确定需要并发时才引入异步。 方法 适合场景 主要优点 需要补齐的能力 requests 单次验证、低频接口采集 语义直接,排查成本低 会话复用、代理刷新、统计 urllib 受限部署、轻量内部脚本 无第三方依赖 连接复用、重试、日志 aiohttp 批量检查、异步I/O任务 并发控制集中 限流、批次切换、失败归因 Scrapy 长期网站采集器 中间件统一治理 代理池状态、任务隔离、监控 无论选择哪一种,都建议按同一顺序自测: 用出口查询接口确认请求确实经过代理。连续请求并记录状态、耗时和出口IP。等待一个代理周期后,验证刷新逻辑是否生效。在允许的访问规则内逐步增加并发,观察错误类型而不是只看错误总数。日志隐藏账号、密码和完整提取链接,只保留request_id等定位字段。 代理IP只解决请求出口与环境隔离问题,不替代数据授权、采集节奏设计和隐私保护。采集公开数据也应执行最小化原则,只保存业务必要字段,并为失败重试设置明确上限。 Python数据抓取配置代理,应该落到青果哪类产品?回到本篇判断:代码框架决定代理怎么接入,任务周期决定代理产品怎么选。高频公开数据采集需要业务自己控制IP批次时,可对应青果网络的国内短效代理。按量提取1万个IP为27元,有效期45天,IP存活1分钟,单次提取上限200(来源:青果网络官网)。长期运行的网站采集器若不想在代码内维护切换逻辑,可对应国内隧道代理。请求数5规格一个月360元,每次请求换IP,带宽峰值5Mbps(来源:青果网络官网)。前者把调度权留在代码,后者把切换交给服务端。选型不是看哪段代码更短,而是看团队愿意在哪一层承担状态管理。 常见问题Q1:访问HTTPS地址时,为什么代理URL仍写http://? A:这里的http://描述的是客户端连接代理服务器所用的协议,不是目标网页协议。访问HTTPS目标时,HTTP代理通常通过CONNECT建立通道。实际配置必须以服务商给出的协议为准,不能把目标URL的https://直接复制给代理地址。 Q2:白名单验证和账密验证应该怎么选? A:固定云服务器、出口公网IP稳定时,白名单配置更省去代码内的凭据处理。开发机、弹性环境或公网IP经常变化时,账密验证更容易迁移。无论选哪种,都不应把密钥写进代码仓库,优先使用环境变量或密钥管理服务。 Q3:短效代理需要每个请求都重新提取吗? A:通常不需要。更合理的做法是读取代理的截止时间,按可用窗口建立任务批次,并在到期前刷新。每个请求都调用提取接口会增加接口压力,也会让任务状态难以追踪。只有产品明确按请求自动切换时,才把切换交给服务端。 Q4:代理请求失败后应该立即更换IP吗? A:先区分错误来源。连接超时、代理鉴权失败和目标站点的业务状态不是同一类问题。连接类错误可以在有限次数内更换已验证代理,鉴权错误应检查白名单或账密,频次提示则应降低请求节奏。不要用无限重试掩盖配置错误。 Q5:并发值应该设多大? A:没有脱离业务的固定答案。应从较低并发开始,记录成功率、连接耗时、目标响应和代理出口分布,再逐步调整。我们青果网络在网站采集器实践中更看重并发下的错误归因:只有把代理、目标站点和解析程序分开统计,调参才有依据。 Q6:这4段代码可以直接用于生产吗? A:它们包含代理配置、鉴权、超时和基础异常处理,可作为接入基线。生产环境还要补充结构化日志、指标监控、凭据轮换、代理状态缓存、任务去重和合规审计。先在获授权的数据源上小规模验证,再按实际错误分布完善工程能力。
1.更新软件源后,执行 apt-get update更新到一半,出现 0% [Working] 2.问题原因 Debian 未自动支持 HTTPS 3.解决方式 执行apt install apt-transport-https ca-certificates -y 再次执行apt update