做过一定规模的爬虫项目之后,你会发现:真正的难点往往不在「如何发请求」或者「如何解析 HTML」,而在 任务调度与任务组织。
刚开始的时候,一个简单的 URL 列表丢进队列,循环抓取就能跑起来。但随着业务需求增加,数据链路复杂起来,你就会发现:
所以,什么时候用「简单队列」就够,什么时候必须上「复杂流转」框架,这是爬虫系统设计绕不开的边界问题。下面我整理了一个速查式的小抄,结合两个典型场景:招聘市场监测 和 金融数据采集。
import requests
from queue import Queue
# === 爬虫代理配置(示例:亿牛云)===
proxy_host = "proxy.16yun.cn"
proxy_port = "3100"
proxy_user = "16YUN"
proxy_pass = "16IP"
proxies = {
"http": f"http://{proxy_user}:{proxy_pass}@{proxy_host}:{proxy_port}",
"https": f"http://{proxy_user}:{proxy_pass}@{proxy_host}:{proxy_port}",
}
# === URL 队列 ===
url_queue = Queue()
urls = [
"https://www.51job.com/joblist/page1",
"https://www.51job.com/joblist/page2"
]
for url in urls:
url_queue.put(url)
# === 简单消费队列 ===
while not url_queue.empty():
url = url_queue.get()
try:
resp = requests.get(url, proxies=proxies, timeout=10)
print("抓取成功:", url, len(resp.text))
# TODO: 在这里解析职位信息
except Exception as e:
print("抓取失败:", url, e)
import requests
from queue import Queue
# === 爬虫代理配置(示例:亿牛云)===
proxy_host = "proxy.16yun.cn"
proxy_port = "3100"
proxy_user = "16YUN"
proxy_pass = "16IP"
proxies = {
"http": f"http://{proxy_user}:{proxy_pass}@{proxy_host}:{proxy_port}",
"https": f"http://{proxy_user}:{proxy_pass}@{proxy_host}:{proxy_port}",
}
# === 初始任务: 股票列表 ===
task_queue = Queue()
task_queue.put(("https://example.com/stock/list", "stock_list", {}))
# === 任务流转调度 ===
while not task_queue.empty():
url, task_type, context = task_queue.get()
try:
resp = requests.get(url, proxies=proxies, timeout=10)
data = resp.text # 假设返回 JSON
if task_type == "stock_list":
# 假设解析出股票代码
stock_codes = ["600519", "000001"]
for code in stock_codes:
task_queue.put((f"https://api.example.com/finance/{code}/report", "financial_report", {"code": code}))
task_queue.put((f"https://api.example.com/finance/{code}/industry", "industry_compare", {"code": code}))
elif task_type == "financial_report":
print("财报数据:", context["code"], len(data))
elif task_type == "industry_compare":
print("行业对比数据:", context["code"], len(data))
except Exception as e:
print("任务失败:", url, task_type, e)
queue.Queue
足够。Redis + scrapy-redis
,分布式更稳。timeout=10
,并设置失败重试次数。test_url = "http://httpbin.org/ip"
resp = requests.get(test_url, proxies=proxies, timeout=5)
print(resp.json()) # 输出代理出口 IP
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。