我需要下载某个网站上的多个文件,本来用 requests,但是下载速度非常慢,而且是同步的
查了一些资料后发现这个库:grequests
人家基本是这么用:
urls = ['http://letiantian.me/'] * 10
req = (grequests.get(u) for u in urls)
resp = grequests.map(req, size=10) # 10 个并发
但是我仿照这样写了以后,得到的结果 with open 后不是正确的文件,哪位大佬知道如何异步爬取文件并保存?
1
gwy15 2019-12-25 10:48:22 +08:00 via Android 1
用 aiohttp
|
2
BryceBu OP @gwy15 试过了,爬下来是 1kb。。。
<a href="https://sm.ms/image/JAXNikaO5GgCpEs" target="_blank"><img src="https://i.loli.net/2019/12/25/JAXNikaO5GgCpEs.png" ></a> |
3
1462326016 2019-12-25 11:58:31 +08:00
1 楼正解
|
4
1462326016 2019-12-25 11:59:36 +08:00
如果爬取的文件不正常的话那么就是你发送的请求有问题。requests 和 aiohttp 基本用法是一致的
|
5
rimutuyuan 2019-12-25 12:00:58 +08:00
爬取成功后加到队列,依次保存
|
6
BryceBu OP @1462326016
返回码是 [200 OK] |
7
1462326016 2019-12-25 12:05:05 +08:00 1
@BryceBu 不能光看状态码,还有下载下来的文件是不是正常的,如果请求一样的话,只是异步发送的,那么同样的 URL 下载的内容应该是一样的。如果可以的话贴个网址大家看下
|
8
gwy15 2019-12-25 12:35:52 +08:00 1
如果不是文件大到内存装不下,不需要按 stream 读。直接
data = await resp.read() with open(): write 就可以了。 你只传了 cookie 和 params,很大概率是因为 UA、host、referer 之类的被挡下来了,自己检查下就知道了。 |
9
ixuuux 2019-12-25 14:01:04 +08:00 1
#2 写入文件的方式有误,改为 ab 试下
![6435a8b4c9163e28fbd8a66451a744b7]( http://tvax3.sinaimg.cn/large/005WOYz1ly1ga8xhtkpusj30hv052q3n.jpg) |
10
whoops 2019-12-25 18:29:56 +08:00
不是解答你 问题的答案,但是可以参考一下
python 爬虫把要下载的文件丢给 aria2 去下载 |