onlyclxy 发表于 2021-11-16 18:33

求问大佬,关于Python批量下载续传的问题

本帖最后由 onlyclxy 于 2021-11-18 16:54 编辑

小白问下大佬们, 我要用Python爬一个网址, 大约4800条下载地址.   要是用协程异步爬取的话, 也需要打开近5000个网页.   但是怕中途出错程序挂了再重新打开5k个页面. 就想着做个续传的功能.. 就想着做个表, 已经爬过的页面就标记一下, 这样再次开始爬取的时候, 略过已经爬过的页面就好.
但是因为一个没接触过数据库, 用什么记录已爬取就犯难了. 暂时用的是csv, 但是如果是协程异步记录的话, 会不会出现同时调用一个csv从而打架的情况? .要是打架该怎么办呢?
之前已经把所有要爬的网址统计到一个csv表里了.

要是把已经爬取过直接记录在这个表的后面的列,又涉及csv增加列的问题. (要是xls处理速度就特别慢).要是新增加一个表,用a+的形式, 会不会就一个打开表后,另一个线程就不能写入了... 就感觉好头疼的样子...

大佬们对于这种情况一般是咋处理的呢?

微笑怪士 发表于 2021-11-16 19:23

仅供参考
可以直接增加一列,全都填充成0。
如果下载完成之后,修改0为1。这样不就记录了莫?

Syize 发表于 2021-11-16 20:53

如果不追求速度就换成线程+锁或者进程+锁+异步的方式吧,协程异步操作文件冲突还没遇到过,蹲一手大佬

Syize 发表于 2021-11-16 21:01

或者我有一个构思,但是没有实践过,定义一个全局的对象专门进行处理工作,并设置一个变量lock,操作文件时先检查lock,若值为0,说明空闲,将其赋值为1,并记录,记录完以后再改回0。
(没有代码检验过,不一定对)

shamozhihu 发表于 2021-11-16 21:13

异步锁的方式,或者在最后面加入一行,进行判断是不是进行传输就可以了

oudaidai 发表于 2021-11-16 21:21

不会用协程,说一下会不会出现csv打架的情况,你可以开多个python程序都去调用它试一试,好像是不会冲突的(我是用txt测试的),我觉得楼主可以尝试一下。上面有位同学说增加一列标明0和1也是可以的,我觉得维护一个id表也是可以的(5000个不算多),python用的不多,说的不对还请见谅哈

kafei000 发表于 2021-11-16 22:52

5000条数据其实用不上协程,线程池就行了
其实你这功能就是”更新“功能对吧,如果已有数据,直接顺序爬取,如果遇到重复的表项就结束爬取。e若
①打开csv文件,提读取项到内存中
②开始顺序爬取,如果表项重复就停止爬入,
③将爬取的信息写入csv

Prozacs 发表于 2021-11-17 09:39

队列,多线程就够了。5000又不多
页: [1]
查看完整版本: 求问大佬,关于Python批量下载续传的问题