爬取图片执行结果打印两次的问题
import requestsfrom 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
哪位大神帮忙看一下啊?谢谢啊 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)
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('下载完成!!!')
改完了,楼主先自己思考一下,有问题欢迎追问 我写了一个供参考
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('下载完成!!!') 你的alist里面的元素是不是有2个啊?,只留一个就可以打印一次了 青出于蓝 发表于 2021-8-22 18:09
谢谢你的回答。
确实有一点没明白,就是为什么要减去最后一个a标签?
还有就是a标签中为啥只留偶数序号的? 江湖散人 发表于 2021-8-24 15:00
谢谢你的回答。
确实有一点没明白,就是为什么要减去最后一个a标签?
还有就是a标签中为啥只留偶数序号 ...
1,因为最后一个便签是一个广告,楼主可以自己打印一下看看
2,因为每一张图片都爬取到了2次,要删除1次
冬雪雪冬 发表于 2021-8-22 18:45
我写了一个供参考
谢谢回答,但是我还有一点没明白,为什么你找的是src2,而我找的是src。但是结果都一样呢?
还有就是你为什么把src2中的“_s”去掉呢? 赖宝宝 发表于 2021-8-22 22:59
你的alist里面的元素是不是有2个啊?,只留一个就可以打印一次了
谢谢。
确实里边有两个a标签,当时没发现。 青出于蓝 发表于 2021-8-24 15:07
1,因为最后一个便签是一个广告,楼主可以自己打印一下看看
2,因为每一张图片都爬取到了2次,要删除1次 ...
但是我爬取的图片却只有一张,没有重复的。只是输出的结果是两次。为啥呀? 冬雪雪冬 发表于 2021-8-22 18:45
我写了一个供参考
你好,我还有一个问题: file = each.div.a.img['src2'].replace('_s', '')
就是这句话,能直接运用标签写代码吗?div.a.img 江湖散人 发表于 2021-8-24 15:15
谢谢回答,但是我还有一点没明白,为什么你找的是src2,而我找的是src。但是结果都一样呢?
还有就是你 ...
1.查源码,的确是src,但我取回的targets,变成了src2,原因不清楚。
2.带_s的是小图,所以把它去掉了。 江湖散人 发表于 2021-8-24 15:18
但是我爬取的图片却只有一张,没有重复的。只是输出的结果是两次。为啥呀?
其实就是爬取了两次,不过因为文件名是一样的,所以第一个图片被替换掉了,看起来只保存了一次 冬雪雪冬 发表于 2021-8-24 15:28
1.查源码,的确是src,但我取回的targets,变成了src2,原因不清楚。
2.带_s的是小图,所以把它去掉了。
你好,file = each.div.a.img['src2'].replace('_s', '') 这种用法可以吗?直接直接使用标签? 青出于蓝 发表于 2021-8-24 15:50
其实就是爬取了两次,不过因为文件名是一样的,所以第一个图片被替换掉了,看起来只保存了一次
你说的最后一张是广告?
你看我理解的对不对啊:就是每张图片都有两个a标签,第一个就是真实的下载地址,第二个是广告,现在就是去掉每张照片的第二个a标签,所以就出现打印两个了,但是第二个是空白的,所以就没有了。 江湖散人 发表于 2021-8-25 14:09
你好,file = each.div.a.img['src2'].replace('_s', '') 这种用法可以吗?直接直接使用标签?
each.div.a.img['src2']是字符串,replace把_s去掉 江湖散人 发表于 2021-8-25 14:21
你说的最后一张是广告?
你看我理解的对不对啊:就是每张图片都有两个a标签,第一个就是真实的下载地址 ...
你可以打印一下你源代码alist的内容,每一个图片有两个a标签,并且最后一个项不是图片,而是广告
页:
[1]