Python中如何优雅地关闭爬虫?讨论一个关闭爬虫的脑洞问题
最近在写爬虫,那些简单的还好,稍等有点安全意识的网站,都是 https + 一大堆 js 加密算法。而且每个网站都不相同。这太耗时间与精力了。
所以我在想有没有 python 框架,可以实现内嵌一个浏览器,这个浏览器要支持方法调用,比如传个地址,修改某些表单 dom 的数据。而且还能拿到页面的内容。我查了一下 Python 内嵌浏览器还是有的,但是可能不支持调用。获得数据可以通过 python 实现一个代理服务器来拿。
请问各位大神有没有相应的框架或者思路?
我发现谷歌有几款插件支持类似的功能,但是我还想 python 原生实现 插件
Python中如何优雅地关闭爬虫?讨论一个关闭爬虫的脑洞问题
你是在说 selenium ?
在Python爬虫里,优雅关闭的核心就两点:捕获信号和清理现场。最直接的方式就是用signal模块处理SIGINT(Ctrl+C)和SIGTERM信号,让爬虫有机会完成当前任务、保存状态再退出。
这里给个简单但完整的例子,用requests和signal实现:
import signal
import sys
import requests
import time
from threading import Event
class GracefulShutdownSpider:
def __init__(self):
self.shutdown_event = Event()
# 注册信号处理器
signal.signal(signal.SIGINT, self.signal_handler)
signal.signal(signal.SIGTERM, self.signal_handler)
def signal_handler(self, signum, frame):
print(f"\n收到信号 {signum},开始优雅关闭...")
self.shutdown_event.set() # 设置事件,通知主循环该退出了
def run(self):
print("爬虫启动,按 Ctrl+C 停止")
url = "https://httpbin.org/delay/1" # 模拟一个延迟响应的接口
while not self.shutdown_event.is_set():
try:
resp = requests.get(url, timeout=5)
print(f"请求成功,状态码: {resp.status_code}")
time.sleep(0.5) # 避免请求过快
except requests.exceptions.RequestException as e:
print(f"请求出错: {e}")
if self.shutdown_event.is_set():
break
time.sleep(1)
print("正在保存爬取状态...")
# 这里可以添加保存进度、关闭数据库连接等清理操作
print("爬虫已安全退出")
sys.exit(0)
if __name__ == "__main__":
spider = GracefulShutdownSpider()
spider.run()
这个爬虫会在收到终止信号时,先完成当前循环迭代,然后执行清理代码再退出。如果你用asyncio或Scrapy,原理类似但实现稍有不同——asyncio用asyncio.run()的取消机制,Scrapy有内置的close_spider扩展点。
更“脑洞”一点的思路,可以监听特定文件变化、设置一个监控端口接收HTTP关闭命令,或者用进程间通信让另一个进程发关闭指令。不过对于大多数情况,信号处理已经足够优雅了。
总结:信号处理加状态保存就是优雅关闭的核心。
selenium
Python 有个封装 selenium 的包叫做 splinter
https://github.com/cobrateam/splinter
前些天写微博爬虫的时候,思考过这个问题,感觉可以写个 chrome or firefox 插件来爬,可将结果存到本地或者 post 传到指定服务器上。
headless 咯
google headless
#3 谢谢,selenium 我以为只是测试用的构架,涨知道了
#5 谢谢,好东西
#6 谢谢,我去学一下
#4 嗯,浏览器插件到是挺多
两年前我写的一个小说爬虫就是内嵌了一个浏览器,结果没有搞定动态操作浏览器的 DOM 
我工具党
我只是需要解析 DOM 的话,通常直接用 Xpath
需要 cookie 支持的话(用户验证、部分 asp.net 应用),会改用 Mechanize
如需执行 JS 才会用到 Selenium w/ Chrome,Firefox,PhantomJS
谷歌浏览器团队出了一个puppeteer,不过是 nodejs 的,楼主可以试试(其实也是用 headless browser )
#13 好的,谢谢
Selenium 真的好慢好慢啊,这样搞效率太低
phantomjs
参考目前闲鱼的防抓取:
—
* 不登录只循环显示少量资料
* 电脑端不登录,通过首页链接点击进入物品详情时限制物品类别数目,超出物品类别强制登陆否则不予显示
* 根据个人搜索记录强推个性化内容,每个人个性化内容不同无法查看全部资料,除非使用大量关键字搜索
* 对于大量关键字盲目搜索超标的,判定为抓取者,返回第一条,默认循环显示不登陆时显示的少量资料
—
感觉很独裁,但是没辙,除了芝麻信用基本没什么能用可信任的第三方征信平台。
—
我不知道要有什么样的技术突破才能避免以后做大了的服务都逐渐参考这种模式。简直反乌托邦
#16 嗯,我现在在尝试 selenium + phantomjs 去实现
嗯嗯。。。闲鱼登录挺麻烦的
#17 这种不登录只能看部分内容,登录了只能看账号绑定的推荐个性化的的内容是有点头大。目前来看也只能注册 n 个账号,每个账号偏向不同的类型搜索了。
目前只用多个账号都不行,得多个账号配合多地点 ISP 接入+定位配合多设备串号…
我 ios 装过一次闲鱼,卸载清空都不行,重装换 appleid 之后原来的推荐不消除…
#21 我服,这也是绝了
此种高级的爬虫还是用 js 写吧。 headless 浏览器或者 chrome 插件。
记得霍炬有一篇文章,互联网完了。互联网现在基本已经中心化了,正在朝着文章中的方向走。
PhantomJS 效率太差了,要是数据量少的话还行,上百万就很要命了。
#25 并且这个项目已经很少维护了,还是 headless 比较有发展
selenium + chrome headless mode
可以观察几项内容,是不是写入了 keychain ?
是不是通过 safari controller 写入了 cookie 来记录状态?
是不是通过 app group 保存了相关记录?
尝试清除隐私信息来重置 idfa 看看有没有变化。
如果没有,尝试更换 Wifi 和 IP 地址重新访问。

