鱼C论坛

 找回密码
 立即注册
查看: 1296|回复: 16

[已解决]爬取图片执行结果打印两次的问题

[复制链接]
发表于 2021-8-22 17:39:56 | 显示全部楼层 |阅读模式

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

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

x
  1. import requests
  2. from bs4 import BeautifulSoup
  3. import time

  4. url = "https://sc.chinaz.com/tupian/weimeiyijingtupian.html"
  5. resp = requests.get(url)
  6. resp.encoding = 'utf-8'

  7. obj = BeautifulSoup(resp.text, 'html.parser')
  8. alist = obj.find('div', attrs={'class': 'text_left text_leftbq'}).find_all('a')
  9. for a in alist:
  10.     href = 'https:' + a.get('href')
  11.     child_resp = requests.get(href)
  12.     child_resp.encoding = 'utf-8'
  13.     child_obj = BeautifulSoup(child_resp.text, 'html.parser')
  14.     imga = child_obj.find('div', attrs={'class': 'imga'}).find('a').find('img')
  15.     img = 'https:' + imga.get('src')
  16.     img_resp = requests.get(img)
  17.     img_name = img.split('/')[-1]
  18.     with open('ibook/' + img_name, 'wb') as f:
  19.         f.write(img_resp.content)
  20.     print('开始下载:', img_name)
  21.     time.sleep(2)
  22. print('下载完成!!!')
复制代码


这个程序是用bs4爬取网站图片的,
但是执行结果出现了一点小意外:

  1. 开始下载: apic32712.jpg
  2. 开始下载: apic32712.jpg
  3. 开始下载: apic31743.jpg
  4. 开始下载: apic31743.jpg
  5. 开始下载: apic31609.jpg
  6. 开始下载: apic31609.jpg
复制代码


哪位大神帮忙看一下啊?谢谢啊
最佳答案
2021-8-22 18:09:26
  1. import requests
  2. from bs4 import BeautifulSoup
  3. import time

  4. url = "https://sc.chinaz.com/tupian/weimeiyijingtupian.html"
  5. resp = requests.get(url)
  6. resp.encoding = 'utf-8'

  7. obj = BeautifulSoup(resp.text, 'html.parser')
  8. alist2 = obj.find('div', attrs={'class': 'text_left text_leftbq'}).find_all('a')
  9. del alist2[-1]
  10. alist=[]
  11. for i in range(0,len(alist2),2):
  12.     alist.append(alist2[i])
  13. for a in alist:
  14.     href = 'https:' + a.get('href')
  15.     child_resp = requests.get(href)
  16.     child_resp.encoding = 'utf-8'
  17.     child_obj = BeautifulSoup(child_resp.text, 'html.parser')
  18.     imga = child_obj.find('div', attrs={'class': 'imga'}).find('a').find('img')
  19.     img = 'https:' + imga.get('src')
  20.     img_resp = requests.get(img)
  21.     img_name = img.split('/')[-1]
  22.     with open('ibook/' + img_name, 'wb') as f:
  23.         f.write(img_resp.content)
  24.     print('开始下载:', img_name)
  25.     time.sleep(2)
  26. print('下载完成!!!')





复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-8-22 18:09:26 | 显示全部楼层    本楼为最佳答案   
  1. import requests
  2. from bs4 import BeautifulSoup
  3. import time

  4. url = "https://sc.chinaz.com/tupian/weimeiyijingtupian.html"
  5. resp = requests.get(url)
  6. resp.encoding = 'utf-8'

  7. obj = BeautifulSoup(resp.text, 'html.parser')
  8. alist2 = obj.find('div', attrs={'class': 'text_left text_leftbq'}).find_all('a')
  9. del alist2[-1]
  10. alist=[]
  11. for i in range(0,len(alist2),2):
  12.     alist.append(alist2[i])
  13. for a in alist:
  14.     href = 'https:' + a.get('href')
  15.     child_resp = requests.get(href)
  16.     child_resp.encoding = 'utf-8'
  17.     child_obj = BeautifulSoup(child_resp.text, 'html.parser')
  18.     imga = child_obj.find('div', attrs={'class': 'imga'}).find('a').find('img')
  19.     img = 'https:' + imga.get('src')
  20.     img_resp = requests.get(img)
  21.     img_name = img.split('/')[-1]
  22.     with open('ibook/' + img_name, 'wb') as f:
  23.         f.write(img_resp.content)
  24.     print('开始下载:', img_name)
  25.     time.sleep(2)
  26. print('下载完成!!!')





复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-22 18:09:56 | 显示全部楼层
改完了,楼主先自己思考一下,有问题欢迎追问
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-22 18:45:19 | 显示全部楼层
我写了一个供参考
  1. import requests
  2. from bs4 import BeautifulSoup
  3. import time
  4. res = requests.get("https://sc.chinaz.com/tupian/weimeiyijingtupian.html")
  5. res.encoding = 'utf-8'
  6. soup = BeautifulSoup(res.text, 'html.parser')
  7. targets = soup.find_all('div', class_='box picblock col3')
  8. for each in targets:
  9.     file = each.div.a.img['src2'].replace('_s', '')
  10.     url = 'https:' + file
  11.     file = file.rsplit('/', 1)[-1]
  12.     with open(file, 'wb') as f:
  13.         print('开始下载:', file)
  14.         res = requests.get(url)
  15.         f.write(res.content)
  16.     time.sleep(2)
  17. print('下载完成!!!')
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-22 22:59:26 | 显示全部楼层
你的alist里面的元素是不是有2个啊?,只留一个就可以打印一次了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-8-24 15:00:57 | 显示全部楼层

谢谢你的回答。
确实有一点没明白,就是为什么要减去最后一个a标签?
还有就是a标签中为啥只留偶数序号的?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-24 15:07:45 | 显示全部楼层
江湖散人 发表于 2021-8-24 15:00
谢谢你的回答。
确实有一点没明白,就是为什么要减去最后一个a标签?
还有就是a标签中为啥只留偶数序号 ...

1,因为最后一个便签是一个广告,楼主可以自己打印一下看看
2,因为每一张图片都爬取到了2次,要删除1次
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-8-24 15:15:55 | 显示全部楼层

谢谢回答,但是我还有一点没明白,为什么你找的是src2,而我找的是src。但是结果都一样呢?
还有就是你为什么把src2中的“_s”去掉呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-8-24 15:16:31 | 显示全部楼层
赖宝宝 发表于 2021-8-22 22:59
你的alist里面的元素是不是有2个啊?,只留一个就可以打印一次了

谢谢。
确实里边有两个a标签,当时没发现。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-8-24 15:18:25 | 显示全部楼层
青出于蓝 发表于 2021-8-24 15:07
1,因为最后一个便签是一个广告,楼主可以自己打印一下看看
2,因为每一张图片都爬取到了2次,要删除1次 ...

但是我爬取的图片却只有一张,没有重复的。只是输出的结果是两次。为啥呀?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-8-24 15:20:02 | 显示全部楼层

你好,我还有一个问题:    file = each.div.a.img['src2'].replace('_s', '')
就是这句话,能直接运用标签写代码吗?div.a.img
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-24 15:28:26 | 显示全部楼层
江湖散人 发表于 2021-8-24 15:15
谢谢回答,但是我还有一点没明白,为什么你找的是src2,而我找的是src。但是结果都一样呢?
还有就是你 ...

1.查源码,的确是src,但我取回的targets,变成了src2,原因不清楚。
2.带_s的是小图,所以把它去掉了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-24 15:50:21 | 显示全部楼层
江湖散人 发表于 2021-8-24 15:18
但是我爬取的图片却只有一张,没有重复的。只是输出的结果是两次。为啥呀?

其实就是爬取了两次,不过因为文件名是一样的,所以第一个图片被替换掉了,看起来只保存了一次
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-8-25 14:09:12 | 显示全部楼层
冬雪雪冬 发表于 2021-8-24 15:28
1.查源码,的确是src,但我取回的targets,变成了src2,原因不清楚。
2.带_s的是小图,所以把它去掉了。

你好,file = each.div.a.img['src2'].replace('_s', '') 这种用法可以吗?直接直接使用标签?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-8-25 14:21:23 | 显示全部楼层
青出于蓝 发表于 2021-8-24 15:50
其实就是爬取了两次,不过因为文件名是一样的,所以第一个图片被替换掉了,看起来只保存了一次

你说的最后一张是广告?
你看我理解的对不对啊:就是每张图片都有两个a标签,第一个就是真实的下载地址,第二个是广告,现在就是去掉每张照片的第二个a标签,所以就出现打印两个了,但是第二个是空白的,所以就没有了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-25 14:27:47 | 显示全部楼层
江湖散人 发表于 2021-8-25 14:09
你好,file = each.div.a.img['src2'].replace('_s', '') 这种用法可以吗?直接直接使用标签?

each.div.a.img['src2']是字符串,replace把_s去掉
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-25 15:03:07 | 显示全部楼层
江湖散人 发表于 2021-8-25 14:21
你说的最后一张是广告?
你看我理解的对不对啊:就是每张图片都有两个a标签,第一个就是真实的下载地址 ...

你可以打印一下你源代码alist的内容,每一个图片有两个a标签,并且最后一个项不是图片,而是广告
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-28 12:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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