|  |      1NaVient      2020-05-11 14:21:35 +08:00 开源不是伸手,别人没实现的你可以实现了提 PR 方便下一个朋友 | 
|  |      2also24      2020-05-11 14:30:22 +08:00 via Android 第一行和第三行需求,直接 aiohttp 不就好了。 第二行需求,自己用 redis 实现一下估计也就一百行以内? | 
|      3dayeye2006199      2020-05-11 14:35:09 +08:00  3 这是传说中的伸手党? | 
|  |      4imn1 OP | 
|  |      5ruby0906      2020-05-11 15:14:56 +08:00 要不是轮子太多,看楼主的描述我都想自己写一个。 | 
|  |      6imn1 OP | 
|  |      7ClericPy      2020-05-11 15:51:45 +08:00 以前还真写过类似的... https://github.com/ClericPy/torequests 支持协程, 线程, 同步, 异步, 反正就是当年想在同步环境里享受到协程的高性能用的 和原生 aiohttp 比, 损失 10% 性能, 带上 uvloop 损失 15% ~ 20%... 损失这么多现在我都有点不想用它了... https://paste.ubuntu.com/p/fFWsNmvVX2/ 简单的小例子 | 
|      8tlemar      2020-05-11 16:11:11 +08:00 scrapy 可以满足需求 | 
|  |      9imn1 OP @ClericPy #7 哎呀,失敬失敬,刚刚在看 torequests,没想到下一秒作者就出现了 既然大驾光临,顺便问两个问题: 1.我写个 class 继承 FailureException,就可以自行处理了吧,error 是 http error code 么? 超时的 error 是什么,文档好像没写这个 2.自定义 header 好像只见到 torequests.utils.curlparse(string, encoding='utf-8') ? | 
|  |      10ClericPy      2020-05-11 16:36:46 +08:00 @imn1 #9  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... | 
|  |      11imn1 OP @ClericPy #10 自定义 header,例如 UA 用 firefox/chrome...,cookies 增加一些条文,如页面访问点击“同意”,cookies 会多了 agree=1 这样,程序首次访问 cookies 没有这条或者 agree=0,后面用代码添加上去才能访问后面的页面 我本来是想 requests 写个单函数,然后多进程执行,感觉放后台跑有点重,所以才找找有什么异步协程的,这样静默运行不影响我干其他事,所以能记录下载失败反而是最关键的 | 
|  |      12crella      2020-05-11 17:02:38 +08:00 楼主自己的 html parser 的其中比较好的几个可以给个链接吗?想看看是怎么解析 html 的。谢谢 | 
|  |      13ClericPy      2020-05-11 17:08:49 +08:00 @imn1 #11 这些自然是带的, torequests 要做的就是兼容 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') | 
|  |      14imn1 OP @crella #12 没公布,而且有些年头,这次也要重写 没什么特别,就是正则用得好而已(我不需要 bs4/lxml ) 加两三个函数,可以根据捕获"last page"生成一个组合 list,也就是 itertools.product()之类 有个函数是处理,分散在几个页面的信息,要各自取出合成一个 record,外面的框架很少见有做这个,但这个只是业务逻辑理顺,跟代码能力无关 可以导出 aria2/wget 可用的 list,wget 不能指定输出文件名,加个下载后对照改名的脚本 …… 总的一句,就是做了一个 py,然后不同站点写个 ini/cfg/yaml 什么的,把一堆正则、referrer 按顺序扔进去,就能跑,仅此而已,没什么特别,比别人强的地方可能就是我熟悉中日韩 unicode 字符,文字处理比人家写的要简洁顺手些 | 
|      15neoblackcap      2020-05-11 17:35:08 +08:00 @crella 解析 html ?你去看看 nginx 的不就结了。基本上都是拿 nginx 的代码改一下。要不然你去看 pichttpparser 也可以,不过那个到底有多标准,我不好说了。nginx 解析 html 的代码好像也就一个文件,非常短小精悍 | 
|  |      16triangle111      2020-05-12 11:58:06 +08:00 有个开源的 Ruia,也是异步爬虫,就是插件没人开发。LZ 说的这些功能刚好都有 |