Python爬取子页面的图片数据保存到本地
- 主要内容
- 内容分析
- 1.情况说明
- 2.分析主题类型图
- 3.主题的分页
- 具体代码
- 爬取结果
- 总结
主要内容
上次做了一个基于requests
和bs4
爬取图片保存到本地的实例,今天在上次的基础上再做一个简单的联系,通过当前页面爬取子页面的图片数据保存到本地,具体流程如下:
内容分析
1.情况说明
今天准备爬取的页面是天堂图片网的自然风光图片,这些数据通过解析页面获取,因为没有抓到包,噢咦!
在图片的目录中可以看到有很多主题的图片,每个主题又要不少的数量的图片,并且自然风光的图片种类也有很多页,那么怎么来拿到这些图片呢?我们继续往下分析。。。
2.分析主题类型图
打开浏览器的检查功能,查看主题图片的网页结构,可以分析每个类型都有一个a
标签,其中的href
链接就对应主题的图片集合的页面地址,这个图片集合地址里的图片才是我们的目标。
那我们的方法应该就是拿到主题对应的a标签的链接地址,然后获取链接对应的页面,在获取页面里的图片src
地址,通过解析地址去将图片保存到本地文件夹。
3.主题的分页
点击分页可以跳转到新的页面,观察地址栏多了个index_x.html,可以大概知道了其规律了吧,除了第一页,后面的页都是有页面后缀的页面。
我在地址栏随意输入了个100页,没想到是最后一页。。。。
那我们就写个循环来获取每个分页不就好咯。。
具体代码
import requests
from bs4 import BeautifulSoup
import random
import re
if __name__ == '__main__':
base_url = 'https://www.ivsky.com/tupian/ziranfengguang/'
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36"
}
# 爬取第1页到第2页(建议练习就不用爬太多,100页的图片量太大)
for i in range(1, 3):
if i != 1:
base_url = 'https://www.ivsky.com/tupian/ziranfengguang/index_' + str(i) + '.html' # 分页页面的地址
r = requests.get(url=base_url, timeout=random.randint(15, 30), headers=headers)
soup = BeautifulSoup(r.content, "html.parser", from_encoding='utf-8') # 解析主题页面
page_a = soup.select(".il_img a") # 获取主题对应页面的链接地址
for item in page_a:
url_ = "https://www.ivsky.com" + item['href'] # 每一种主题的图片的具体页面地址(前面将其拼接完整)
# 获取类型集合的页面
r_p = requests.get(url=url_, timeout=random.randint(10, 35), headers=headers)
soup_p = BeautifulSoup(r_p.content, "html.parser", from_encoding='utf-8') # 解析主题的图片的具体页面
imgs = soup_p.select(".il_img img") # 获取所有图片标签
for img in imgs:
src = "http:" + img['src'] # 图片地址
type_name = img['alt'] # 图片主题(alt属性)
file_name = re.findall(r".*/(.*).j", src)[0] # 通过正则提取图片的名称
img_file = requests.get(src).content # 解析图片
with open("images/" + type_name + file_name + ".jpg", "wb") as pf:
pf.write(img_file) # 保存图片、图片命名用主题+图片名称
print(type_name + file_name + ".jpg--保存成功!")
爬取结果
里面有重名的文件覆盖,所有最后结果比实际数据量少了一点点,各位也可以自己想想办法。另外,现在爬取的图片比较小,分辨率低,感兴趣的小伙伴可以试试爬取高清的图片(图片可以继续点击跳转到高清页面),可以做壁纸的那种呢。。
总结
以上实例主要是说明了分页的爬取数据和子页面数据的爬取,感兴趣的小伙伴可以试试。在爬取信息的时候要尊重版权,最好控制爬取的速度与数量,以防给目标网站的服务器造成压力,自己ip也会被封的。。