鱼C论坛

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

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

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

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

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

x
import requests
from bs4 import BeautifulSoup
import time

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

obj = BeautifulSoup(resp.text, 'html.parser')
alist = obj.find('div', attrs={'class': 'text_left text_leftbq'}).find_all('a')
for a in alist:
    href = 'https:' + a.get('href')
    child_resp = requests.get(href)
    child_resp.encoding = 'utf-8'
    child_obj = BeautifulSoup(child_resp.text, 'html.parser')
    imga = child_obj.find('div', attrs={'class': 'imga'}).find('a').find('img')
    img = 'https:' + imga.get('src')
    img_resp = requests.get(img)
    img_name = img.split('/')[-1]
    with open('ibook/' + img_name, 'wb') as f:
        f.write(img_resp.content)
    print('开始下载:', img_name)
    time.sleep(2)
print('下载完成!!!')

这个程序是用bs4爬取网站图片的,
但是执行结果出现了一点小意外:
开始下载: apic32712.jpg
开始下载: apic32712.jpg
开始下载: apic31743.jpg
开始下载: apic31743.jpg
开始下载: apic31609.jpg
开始下载: apic31609.jpg

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

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

obj = BeautifulSoup(resp.text, 'html.parser')
alist2 = obj.find('div', attrs={'class': 'text_left text_leftbq'}).find_all('a')
del alist2[-1]
alist=[]
for i in range(0,len(alist2),2):
    alist.append(alist2[i])
for a in alist:
    href = 'https:' + a.get('href')
    child_resp = requests.get(href)
    child_resp.encoding = 'utf-8'
    child_obj = BeautifulSoup(child_resp.text, 'html.parser')
    imga = child_obj.find('div', attrs={'class': 'imga'}).find('a').find('img')
    img = 'https:' + imga.get('src')
    img_resp = requests.get(img)
    img_name = img.split('/')[-1]
    with open('ibook/' + img_name, 'wb') as f:
        f.write(img_resp.content)
    print('开始下载:', img_name)
    time.sleep(2)
print('下载完成!!!')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

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

obj = BeautifulSoup(resp.text, 'html.parser')
alist2 = obj.find('div', attrs={'class': 'text_left text_leftbq'}).find_all('a')
del alist2[-1]
alist=[]
for i in range(0,len(alist2),2):
    alist.append(alist2[i])
for a in alist:
    href = 'https:' + a.get('href')
    child_resp = requests.get(href)
    child_resp.encoding = 'utf-8'
    child_obj = BeautifulSoup(child_resp.text, 'html.parser')
    imga = child_obj.find('div', attrs={'class': 'imga'}).find('a').find('img')
    img = 'https:' + imga.get('src')
    img_resp = requests.get(img)
    img_name = img.split('/')[-1]
    with open('ibook/' + img_name, 'wb') as f:
        f.write(img_resp.content)
    print('开始下载:', img_name)
    time.sleep(2)
print('下载完成!!!')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

使用道具 举报

发表于 2021-8-22 18:45:19 | 显示全部楼层
我写了一个供参考
import requests
from bs4 import BeautifulSoup
import time
res = requests.get("https://sc.chinaz.com/tupian/weimeiyijingtupian.html")
res.encoding = 'utf-8'
soup = BeautifulSoup(res.text, 'html.parser')
targets = soup.find_all('div', class_='box picblock col3')
for each in targets:
    file = each.div.a.img['src2'].replace('_s', '')
    url = 'https:' + file
    file = file.rsplit('/', 1)[-1]
    with open(file, 'wb') as f:
        print('开始下载:', file)
        res = requests.get(url)
        f.write(res.content)
    time.sleep(2)
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, 2025-1-13 13:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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