一、网页分析:
我们爬取某网站图片时总是爬取不到所有的图片,只会爬取到一页的内容,这是为什么呢?
原因就是该网页提供的html页面使用了Ajax与javascript的交互实现,因此我们爬取时有困难。
在后几篇文章中会介绍,今天我们给出某网站爬取图片的网址:
https://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word=%E7%8C%AB&pn=0&gsm=50&ct=&ic=0&lm=-1&width=0&height=0
https://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word=%E7%8C%AB&pn=20&gsm=3c&ct=&ic=0&lm=-1&width=0&height=0
https://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word=%E7%8C%AB&pn=40&gsm=50&ct=&ic=0&lm=-1&width=0&height=0
上面的url分别是第1页、第2页、第3页的,我们还是用老方法先得到这些url,
然后再获取每页的图片。
二、获取每页的url
我们的目的不是获取某一类的图片,而是获取我们想要的任何种类,任何数量的图片,所以我们可以对url进行拼接。通过输入想要的内容达到目的。
获取我们想要的种类图片:picture = input("图片类型为:\n")
获取每页的url:pn = 20*(i-1)
把上面的两个键值对存储在字典kw里,在我们发送get请求时传入即可。
正则表达式获取我们下载图片的内容:
“objURL”:“(.*?)”
符合该表达式的内容有61个,通过分析,第一个是没用的。所以剩下的60个就是我们所需图片的内容,我们找到对应的链接,查看是否可以得到相应的图片内容,答案是肯定的。
但是我们又发现一个问题:第1、2、3;第4、5、6;……每三个objurl的链接获取到的内容一样(即步长为3),所以为了避免重复,我们只获取pn=0,pn=60,pn=120……这些链接的内容即可。
以上我们就获取到了所有我们想要每个图片的url。
import requests
import re
picture = input("图片类型为:\n")
headers = {
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36",
}
"""
获取所有图片的url
"""
detail_urls = []
for i in range(1,5,3): #获取1-4页的图片,步长为3
kw = {
"word":picture,
"pn":20*(i-1), #每页的url的规律
}
url = 'https://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8'
response = requests.get(url,headers=headers,params=kw)
content = response.content.decode('utf8')
detail_url = re.findall('"objURL":"(.*?)"',content,re.DOTALL)
detail_urls.append(detail_url)
三、下载图片:
for page in detail_urls:
for url in page:
try:
response = requests.get(url,headers=headers)
content = response.content
path = r'E:\Spyder\图片爬虫\图片' #图片保存位置
with open(r'{}\{}.jpg'.format(path,i),'wb') as f:
f.write(content)
except:
continue
四、图片格式的问题:
我们知道图片格式有很多种,我们获取的格式不一定只有jpg格式,但不影响大的情况的话,
我们一般都采用上面的方式。
***如果对获取到的图片保存原来的格式的话,
我们需要进行另一种处理方式,而不能使用上面的方式。***
方法:判断图片链接的后几位【后几位就为图片的格式】
i = 0
for detail_url in detail_urls:
try:
response = requests.get(detail_url,headers=headers)
content = response.content
if detail_url[-3:] == 'jpg':
with open(r'E:\Spyder\图片爬虫\图片\{}.jpg'.format(i),'wb') as f:
f.write(content)
elif detail_url[-4:] == 'jpeg':
with open(r'E:\Spyder\图片爬虫\图片\{}.jpeg'.format(i),'wb') as f:
f.write(content)
elif detail_url[-3:] == 'png':
with open(r'E:\Spyder\图片爬虫\图片\{}.png'.format(i),'wb') as f:
f.write(content)
elif detail_url[-3:] == 'bmp':
with open(r'E:\Spyder\图片爬虫\图片\{}.bmp'.format(i),'wb') as f:
f.write(content)
else:
continue
except:
continue
i+=1
本文介绍了如何使用Python爬取网页图片,包括分析网页结构,获取每页图片URL,避免重复下载,以及解决图片格式问题。通过正则表达式提取图片链接,并按特定步长下载不同页面的图片。

8154

被折叠的 条评论
为什么被折叠?



