鱼C论坛

 找回密码
 立即注册
查看: 2774|回复: 25

[已解决]python使用grequests爬取图片保存到本地

[复制链接]
发表于 2024-2-17 18:03:32 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
python使用grequests爬取图片保存到本地,代码怎么写?比如图片链接是https://img3.doubanio.com/view/photo/s_ratio_poster/public/p480747492.webp
最佳答案
2024-2-17 19:20:28
  1. import grequests
  2. with open("1.png", "wb") as f:
  3.   f.write(list(grequests.map([grequests.get("你的链接")]))[0].content)
复制代码

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-2-17 18:03:48 | 显示全部楼层
使用grequests库爬取图片并保存到本地,首先需要安装grequests库:

  1. pip install grequests
复制代码


然后根据图片链接创建一个请求对象,并指定回调函数用于处理响应:

  1. import grequests

  2. image_url = 'https://img3.doubanio.com/view/photo/s_ratio_poster/public/p480747492.webp'

  3. def save_image(response, *args, **kwargs):
  4.     # 获取图片文件名
  5.     file_name = image_url.split('/')[-1]
  6.     # 保存图片到本地
  7.     with open(file_name, 'wb') as f:
  8.         f.write(response.content)
  9.     print(f"图片 {file_name} 已保存!")

  10. # 创建请求对象
  11. req = grequests.get(image_url, hooks=dict(response=save_image))

  12. # 发送请求并等待响应
  13. grequests.map([req])
复制代码


以上代码中,`image_url`是要下载的图片链接。定义了一个名为`save_image`的回调函数,用于将响应内容保存到本地。在回调函数中,我们可以通过`response.content`获取到图片的二进制数据。

然后,利用`grequests.get()`创建一个请求对象,将回调函数与请求对象绑定。

最后,使用`grequests.map()`发送请求并等待响应。请求完成后,会自动触发回调函数保存图片到本地。

请注意,由于grequests使用了异步请求,所以在处理多个请求时,可以大大提高爬取速度。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-2-17 18:41:19 | 显示全部楼层
FishC 发表于 2024-2-17 18:03
使用grequests库爬取图片并保存到本地,首先需要安装grequests库:
  1. import pathlib
  2. import grequests
  3. from pyquery import PyQuery

  4. headers = {
  5.     "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36 Edg/121.0.0.0"
  6. }

  7. ooo = 1
  8. for i in range(0,226,25):
  9.     ressss = grequests.get(f"https://movie.douban.com/top250?start={i}&filter=",headers=headers),
  10.     bbbb = grequests.map(ressss)
  11.     a = bbbb[0].text
  12.     py_qu = PyQuery(a)
  13.     aa = py_qu.find("img").items()
  14.     for pp in aa:
  15.         urls = pp.attr("src")
  16.         path_p = pathlib.Path(f"pic/{ooo}.jpg")
  17.         path_p.write_text(urls)
  18.         ooo = ooo + 1
复制代码


爬到的数据不行,没有添加content,请问在哪里添加content呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-2-17 18:41:35 | 显示全部楼层
python小小白哟 发表于 2024-02-17 18:41
import pathlib
import grequests
from pyquery imp ...


在你的代码中,你已经通过`res = grequests.get()`发送了请求,但是你没有使用`res.content`来获取图片的二进制数据。为了将图片内容保存到本地,你需要在循环中使用`res.content`,并将其写入文件。下面是修改后的代码:

  1. import pathlib
  2. import grequests
  3. from pyquery import PyQuery

  4. headers = {
  5.     "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36 Edg/121.0.0.0"
  6. }

  7. ooo = 1

  8. for i in range(0, 226, 25):
  9.     res = grequests.get(f"https://movie.douban.com/top250?start={i}&filter=", headers=headers)
  10.     bbbb = grequests.map([res])  # 注意这里需要将请求对象放入列表中
  11.     a = bbbb[0].content  # 获取响应内容
  12.     py_qu = PyQuery(a)
  13.     aa = py_qu.find("img").items()
  14.    
  15.     for pp in aa:
  16.         url = pp.attr("src")
  17.         path_p = pathlib.Path(f"pic/{ooo}.jpg")
  18.         
  19.         with open(path_p, 'wb') as f:  # 将图片内容写入文件
  20.             f.write(url)
  21.         
  22.         ooo += 1
复制代码


希望这次能够成功保存爬取到的图片内容到本地。请注意,在写入文件时,需要以二进制(`'wb'`)模式打开文件,并使用`write()`方法将图片内容写入文件中。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-2-17 18:46:06 | 显示全部楼层
FishC 发表于 2024-2-17 18:41
在你的代码中,你已经通过`res = grequests.get()`发送了请求,但是你没有使用`res.content`来获取图片 ...

webp的内容是https://img3.doubanio.com/view/photo/s_ratio_poster/public/p480747492.jpg
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-2-17 18:46:25 | 显示全部楼层


如果要下载webp格式的图片,你需要修改图片的链接为webp格式链接,并将保存的文件名后缀也修改为.webp。下面是修改后的代码:import pathlibimport grequestsfrom pyquery import PyQueryheaders = {    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36 Edg/121.0.0.0"}ooo = 1for i in range(0, 226, 25):    res = grequests.get(f"https://movie.douban.com/top250?start={i}&filter=", headers=headers)    bbbb = grequests.map()    a = bbbb.content    py_qu = PyQuery(a)    aa = py_qu.find("img").items()        for pp in aa:        url = pp.attr("src")        if url.endswith('.webp'):            url = url.replace('[url=https://img3.doubanio.com/view/photo/s_ratio_poster/public',]https://img3.doubanio.com/view/photo/s_ratio_poster/public',[/url] '[url=https://img3.doubanio.com/view/photo/s_ratio_poster/public/p480747492.jpg')]https://img3.doubanio.com/view/photo/s_ratio_poster/public/p480747492.jpg')[/url] # 将webp链接替换为jpg链接            path_p = pathlib.Path(f"pic/{ooo}.webp")  # 修改文件名后缀为.webp                with open(path_p, 'wb') as f:            f.write(url)                ooo += 1希望这次能够成功保存爬取到的.webp格式的图片内容到本地。注意,在将webp链接替换为jpg链接时,需要根据你的需求进行相应的替换。同时,将保存的文件名后缀修改为.webp。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-2-17 18:48:08 | 显示全部楼层
FishC 发表于 2024-2-17 18:41
在你的代码中,你已经通过`res = grequests.get()`发送了请求,但是你没有使用`res.content`来获取图片 ...

报错 a bytes-like object is required, not 'str'
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-2-17 18:48:20 | 显示全部楼层
python小小白哟 发表于 2024-02-17 18:48
报错 a bytes-like object is required, not 'str'


对不起,我的错误。在打开文件并写入内容时,要确保将二进制数据写入文件而不是字符串。以下是修改后的代码:

  1. import pathlib
  2. import grequests
  3. from pyquery import PyQuery

  4. headers = {
  5.     "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36 Edg/121.0.0.0"
  6. }

  7. ooo = 1
  8. for i in range(0, 226, 25):
  9.     urls = [f"https://movie.douban.com/top250?start={i}&filter="]
  10.     ress = (grequests.get(url, headers=headers) for url in urls)
  11.     responses = grequests.map(ress)

  12.     for response in responses:
  13.         a = response.content
  14.         py_qu = PyQuery(a)
  15.         aa = py_qu.find("img").items()
  16.         
  17.         for pp in aa:
  18.             url = pp.attr("src")
  19.             path_p = pathlib.Path(f"pic/{ooo}.jpg")

  20.             with open(path_p, 'wb') as f:
  21.                 f.write(url.encode('utf-8'))
  22.             
  23.             ooo += 1
复制代码


这次,我们使用`url.encode('utf-8')`将URL转换为字节数据,然后再将其写入文件中。这样就能够成功保存爬取到的图片内容到本地了。请尝试运行代码并查看结果。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-2-17 18:53:46 | 显示全部楼层
FishC 发表于 2024-2-17 18:48
对不起,我的错误。在打开文件并写入内容时,要确保将二进制数据写入文件而不是字符串。以下是修改后的 ...
  1. import pathlib
  2. import grequests
  3. from pyquery import PyQuery

  4. headers = {
  5.     "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36 Edg/121.0.0.0"
  6. }

  7. ooo = 1
  8. for i in range(0,226,25):
  9.     ressss = grequests.get(f"https://movie.douban.com/top250?start={i}&filter=",headers=headers),
  10.     bbbb = grequests.map(ressss)
  11.     a = bbbb[0].content
  12.     py_qu = PyQuery(a)
  13.     aa = py_qu.find("img").items()
  14.     for pp in aa:
  15.         urls = pp.attr("src")
  16.         path_p = pathlib.Path(f"pic/{ooo}.webp")
  17.         path_p.write_text(urls)
  18.         ooo = ooo + 1
复制代码



以上代码运行后,保存的图片格式是webp,但是我用pycharm打开后没有正常显示图片,显示的是一个图片链接。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-2-17 18:53:59 | 显示全部楼层
python小小白哟 发表于 2024-02-17 18:53
import pathlib
import grequests
from pyquery imp ...


你好,在代码中,你使用了`path_p.write_text(urls)`来保存图片链接到文件中。这是错误的。`write_text()`方法用于将文本数据写入文件,而不是将二进制数据保存为图片。

要正确保存爬取到的图片,请修改代码如下:

  1. import pathlib
  2. import requests
  3. from pyquery import PyQuery

  4. headers = {
  5.     "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36 Edg/121.0.0.0"
  6. }

  7. ooo = 1
  8. for i in range(0, 226, 25):
  9.     response = requests.get(f"https://movie.douban.com/top250?start={i}&filter=", headers=headers)
  10.     a = response.content
  11.     py_qu = PyQuery(a)
  12.     aa = py_qu.find("img").items()
  13.    
  14.     for pp in aa:
  15.         url = pp.attr("src")
  16.         if url.startswith("https://"):
  17.             image_data = requests.get(url).content
  18.             file_path = f"pic/{ooo}.webp"
  19.             
  20.             with open(file_path, 'wb') as f:
  21.                 f.write(image_data)
  22.                
  23.             print(f"图片 {ooo}.webp 已保存!")
  24.             ooo += 1
复制代码


在这个修改后的代码中,我们使用`requests.get()`下载图片并获取二进制数据。然后,通过创建文件路径`file_path`和打开文件的方式,将二进制数据写入文件。这样就能够正确保存图片并显示了。请尝试运行修改后的代码。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-2-17 19:03:21 | 显示全部楼层
FishC 发表于 2024-2-17 18:53
你好,在代码中,你使用了`path_p.write_text(urls)`来保存图片链接到文件中。这是错误的。`write_text ...
  1. import grequests
  2. from pyquery import PyQuery

  3. headers = {
  4.     "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36 Edg/121.0.0.0"
  5. }

  6. ooo = 1
  7. for i in range(0,226,25):
  8.     ressss = grequests.get(f"https://movie.douban.com/top250?start={i}&filter=",headers=headers),
  9.     bbbb = grequests.map(ressss)
  10.     a = bbbb[0].content
  11.     py_qu = PyQuery(a)
  12.     aa = py_qu.find("img").items()
  13.     for pp in aa:
  14.         urls = pp.attr("src")
  15.         with open(f"pic/{ooo}.webp","wb") as file:
  16.             file.write(grequests.get(urls).content)

  17.         ooo = ooo + 1
复制代码



报错如下:      'AsyncRequest' object has no attribute 'content'
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-2-17 19:03:35 | 显示全部楼层
python小小白哟 发表于 2024-02-17 19:03
import grequests
from pyquery import PyQuery

h ...


在您提供的代码中,`bbbb`是一个包含`AsyncResponse`对象的列表,而不是直接包含响应内容。因此,您无法通过`bbbb.content`来获取响应的内容。要解决这个问题,可以修改代码如下:import grequestsfrom pyquery import PyQueryimport requestsheaders = {    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36 Edg/121.0.0.0"}ooo = 1for i in range(0, 226, 25):    urls = f"https://movie.douban.com/top250?start={i}&filter="    ressss = grequests.get(urls, headers=headers)    bbbb = grequests.map([ressss])    a = bbbb[0].content    py_qu = PyQuery(a)    aa = py_qu.find("img").items()    for pp in aa:        img_url = pp.attr("src")        response = requests.get(img_url)        if response.status_code == 200:            with open(f"pic/{ooo}.webp", "wb") as file:                file.write(response.content)            print(f"图片 {ooo}.webp 已保存!")        ooo += 1在修改后的代码中,我们使用`requests.get()`方法直接发送请求并获取响应的内容。这样可以确保正确获取图片的二进制数据并保存到本地。请尝试运行修改后的代码。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-2-17 19:04:27 | 显示全部楼层
FishC 发表于 2024-2-17 19:03
在您提供的代码中,`bbbb`是一个包含`AsyncResponse`对象的列表,而不是直接包含响应内容。因此,您无 ...

代码排下版
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-2-17 19:04:40 | 显示全部楼层


import grequests
from pyquery import PyQuery
import requests

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36 Edg/121.0.0.0"
}

ooo = 1
for i in range(0, 226, 25):
    urls = f"https://movie.douban.com/top250?start={i}&filter="
    ressss = grequests.get(urls, headers=headers)
    bbbb = grequests.map(ressss)
    a = bbbb.content
    py_qu = PyQuery(a)
    aa = py_qu.find("img").items()
    for pp in aa:
        img_url = pp.attr("src")
        response = requests.get(img_url)
        if response.status_code == 200:
            with open(f"pic/{ooo}.webp", "wb") as file:
                file.write(response.content)
            print(f"图片 {ooo}.webp 已保存!")
        ooo += 1

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-2-17 19:06:44 | 显示全部楼层
FishC 发表于 2024-2-17 19:04
import grequests
from pyquery import PyQuery
import requests

我想用grequests爬取图片  你这个代码使用但是requests获取图片的啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-2-17 19:06:54 | 显示全部楼层
python小小白哟 发表于 2024-02-17 19:06
我想用grequests爬取图片  你这个代码使用但是request ...


非常抱歉,我在之前的回答中犯了一个错误。确实要使用grequests来获取图片,而不是使用requests。下面是修正后的代码:

  1. import grequests

  2. image_url = 'https://img3.doubanio.com/view/photo/s_ratio_poster/public/p480747492.webp'
  3. save_path = 'image.jpg'

  4. def save_image(response, *args, **kwargs):
  5.     with open(save_path, 'wb') as f:
  6.         f.write(response.content)
  7.     print(f"图片已保存到 {save_path}")

  8. req = grequests.get(image_url, hooks=dict(response=save_image))
  9. grequests.map([req])
复制代码


上述代码会将指定的图片链接下载,并保存到本地的`image.jpg`文件中。注意,你可以根据自己的需求修改保存路径。在此代码中,我们定义了一个回调函数`save_image`,该函数会将响应内容保存到本地文件中。然后,我们利用`grequests.get()`创建一个请求对象,并将回调函数与请求对象进行绑定。最后,使用`grequests.map()`发送请求并等待响应。请求完成后,会自动触发回调函数保存图片到本地。

希望这次能满足你的需求!对于之前的错误回答,我再次表示歉意。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-2-17 19:14:51 | 显示全部楼层
  1. import requests
  2. with open("1.png", "wb") as f:
  3.     f.write(requests.get("你的链接").content)
复制代码

直接用requests更简单
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-2-17 19:15:23 | 显示全部楼层
FishC 发表于 2024-2-17 19:04
import grequests
from pyquery import PyQuery
import requests

报错代码如下:
TypeError: 'AsyncRequest' object is not iterable
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-2-17 19:15:35 | 显示全部楼层
python小小白哟 发表于 2024-02-17 19:15
报错代码如下:
TypeError: 'AsyncRequest' object i ...


抱歉,我之前的回答中有误导。grequests库返回的是异步请求对象,不能直接迭代。正确的做法是使用`grequests.send()`方法来发送请求并获取响应。

以下是修正后的代码:

  1. import grequests

  2. image_url = 'https://img3.doubanio.com/view/photo/s_ratio_poster/public/p480747492.webp'

  3. def save_image(response, *args, **kwargs):
  4.     # 获取图片文件名
  5.     file_name = image_url.split('/')[-1]
  6.    
  7.     # 保存图片到本地
  8.     with open(file_name, 'wb') as f:
  9.         f.write(response.content)
  10.     print(f"图片 {file_name} 已保存!")

  11. # 创建请求对象
  12. req = grequests.get(image_url, hooks=dict(response=save_image))

  13. # 发送请求并等待响应
  14. grequests.send(req)
复制代码


请注意,这里只是针对单个图片链接的情况,如果要批量爬取多个图片,可以使用循环遍历的方式来处理。另外,为了提高效率,可以使用`grequests.map()`方法同时发送多个请求。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-2-17 19:16:23 | 显示全部楼层

我就是想使用grequests实现一下
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-23 13:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表