关于爬虫异步多线程的问题

2020-05-31 12:59:31 +08:00
 yuban10703

最近一直在研究 py 的异步......

所以想把之前整的一个 P 站收藏夹的爬虫换成异步,但是想了想,貌似收藏夹翻页的部分好像整不了异步?..

爬虫代码

(写的很乱.....😶)

爬虫大概是这样运行的:

  1. 先登录获取用户信息
  2. 然后请求收藏夹的 api(这一步里会返回我收藏夹中第一页的信息和下一页的 url)
  3. 然后把上一步中第一页收藏夹的信息处理一下存进数据库
  4. 休眠一段时间后请求上一步中返回的 url(这里返回的信息和第二步一样,返回当前页的信息和下一页的 url)
  5. 然后处理信息存进数据库,一直循环第 4 步,直到下一页的 url 为 none

返回的下一页的 url 貌似不固定,得从上一步的结果中取...,所以这步好像不能异步?...🤔

但是数据库存储数据这步好像可以异步执行,但是怎么操作.......(创建了异步任务后需要 await 任务,await 任务这步貌似是堵塞的)😢

不知道单用异步能不能解决这个问题...

所以我想再开一个线程,把存数据库的操作丢到另一个线程里去操作...

各位有什么想法么?.........还有 有关于 python asyncio 的教程推荐么..(中文的...)

2770 次点击
所在节点    Python
11 条回复
ClericPy
2020-05-31 13:26:49 +08:00
前几天刚看到的...
Guide to Concurrency in Python with Asyncio ⋆ Mark McDonnell - https://www.integralist.co.uk/posts/python-asyncio/

其他的搜索结果 https://www.clericpy.top/newspaper/articles.query.html?query=asyncio&date=&start_time=&end_time=&source=&lang=ANY&order_by=ts_create&sorting=desc&limit=10&offset= 只看四星以上结果吧, 这个过滤器当初忘了写... 过几天再补

然后, asyncio 用的时候和多线程有点像, 但是又很多区别, 官方如果能设计的像 gevent 那种就好了... 不吐槽了, 大致要看的就是 Future 的思想, 然后知道 asyncio.Task 是一个已经在执行的协程任务, 如果你的数据库操作库不支持协程, 就只能丢到一个 "线程 executor" 里面做一个协程包装(也就是丢给线程, 但可以被 await)

至于你说的从上一步结果里取, 那就是个串行关联了, 因为第二步可能也要用协程, 所以就尽量别用 add_done_callback, 做好 await 就行了

多数人用协程的时候很少会开多个线程然它单独跑一个事件循环, 因为一不小心通信过程会遇到 different loop thread 之类的 runtime error, 所以用 executor 包装下更省心

没代码也说不了太多了
renmu123
2020-05-31 13:37:13 +08:00
你可以获取全部资料后一口气存到数据库,没必要获取一次存一次
yuban10703
2020-05-31 13:40:39 +08:00
@renmu123 emm, api 的请求之间有 5s 左右的间隔,主要是想利用这些时间....
jugelizi
2020-05-31 14:07:46 +08:00
哈哈 这种一般我丢任务队列
一个任务去抓列表 存数据库 再推送队列
另外一个不断消费
yuban10703
2020-05-31 14:14:14 +08:00
@jugelizi 我去研究研究🤔
daimiaopeng
2020-05-31 15:59:08 +08:00
我用 cpp 写的多线程 http 库可以了解一下: https://github.com/daimiaopeng/fast_requests
yuban10703
2020-05-31 16:06:52 +08:00
@daimiaopeng (☆▽☆)
ruanimal
2020-05-31 17:27:34 +08:00
你想异步需要换库,requests 得换成对应的异步库,还有数据库相关的库也是,不然异步没啥意义
octobersnow
2020-05-31 21:58:31 +08:00
@daimiaopeng 最快在哪里?
black11black
2020-06-01 12:36:08 +08:00
建议老实先看一遍庞杂的 aysncio 文档,了解一下异步大概是什么,你这些问的都哪跟哪啊
coderunI
2020-06-01 15:49:23 +08:00
你需要 redis

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/677155

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX