懒,求个异步爬虫,必要需求是方便处理异常
必要的是出现爬取失败的 url,能扔进队列重试若干次
持续失败( 403/404/50x,超时……等等)的能记录下来
其次是可以自定义 header,包括 cookies 、UA 等等,当然包括可重用(session)
搜了好几个简述都没这方面说明,估计不是逐个看文档,就是看代码……
谁知道有这样的,省我一点时间,谢了
必要的是出现爬取失败的 url,能扔进队列重试若干次
持续失败( 403/404/50x,超时……等等)的能记录下来
其次是可以自定义 header,包括 cookies 、UA 等等,当然包括可重用(session)
搜了好几个简述都没这方面说明,估计不是逐个看文档,就是看代码……
谁知道有这样的,省我一点时间,谢了
第二行需求,自己用 redis 实现一下估计也就一百行以内?
支持协程, 线程, 同步, 异步, 反正就是当年想在同步环境里享受到协程的高性能用的
和原生 aiohttp 比, 损失 10% 性能, 带上 uvloop 损失 15% ~ 20%… 损失这么多现在我都有点不想用它了…
https://paste.ubuntu.com/p/fFWsNmvVX2/ 简单的小例子
既然大驾光临,顺便问两个问题:
1.我写个 class 继承 FailureException,就可以自行处理了吧,error 是 http error code 么?
超时的 error 是什么,文档好像没写这个
2.自定义 header 好像只见到 torequests.utils.curlparse(string, encoding=’utf-8′) ?
1. FailureException 其实就是在 catch exception 的时候不抛错, 让它 Return 回来方便自省和排查, FailureException.error 实际就是原始抛出的错误
另一方面 FailureException 主要作用就是存放了 request 的 kwargs, 方便回调的时候用上
超时根据不同的依赖不一定是什么 error, 需要根据依赖来判断, aiohttp 或者 requests 里面都有很多细分, 超时也是区分了读超时和连接超时的, 所以得自己去他们源码里看看, 比如 requests.exceptions 里的 Timeout ConnectTimeout ReadTimeout, aiohttp 里面更复杂
因此, 这里面的重试的涵盖范围默认是 aiohttp 和 requests 里面的请求错误的基类, 避免 handle 一些非请求类错误 (早年间因为 handle 了 KeyboardInterrupt 导致我一个十万请求的脚本差点停不下来…
2. 没看懂自定义 Headers 是什么需求, 有个例子么. 可重用 Session 是默认的, tPool Requests 类都是只用一个 Client Session
3. 代码一开始是刚上班时候自己边学边折腾的, 实际没什么有价值的地方, 不如自己现写一个 wrapper…
我本来是想 requests 写个单函数,然后多进程执行,感觉放后台跑有点重,所以才找找有什么异步协程的,这样静默运行不影响我干其他事,所以能记录下载失败反而是最关键的
req = tPool()
task = req.get(‘http://httpbin.org’, headers={“Cookie”: “agree=0;”})
resp = task.x
这些都是 Requests 库原生的参数
记录下载失败, 拿到结果以后如果是错误, FailureException 对象的 bool 都是 false 的, 而且也有 self.ok 来兼容 Requests 的响应, 所以只要判断 self.ok 就能知道请求是否成功了. Requests 的 Response.ok 判断的好像是状态码在 range(200, 300) 之间
记录下载失败, 写个 Callback 函数做变量塞上应该就够了, lambda r: r.ok or open(‘file.txt’, ‘a’).write(‘xxx’)
总的一句,就是做了一个 py,然后不同站点写个 ini/cfg/yaml 什么的,把一堆正则、referrer 按顺序扔进去,就能跑,仅此而已,没什么特别,比别人强的地方可能就是我熟悉中日韩 unicode 字符,文字处理比人家写的要简洁顺手些