python批量下载网页图片,不用再复制粘贴了(7)

此为教程笔记

教程地址:https://study.163.com/course/courseMain.htm?courseId=1209401897

感谢老师:城市数据团大鹏

代码非常少,想要全部代码直接拉到最后。

批量从网页中下载图片
此次实战选取豆瓣电影 下载西部世界2的剧照
网址为: https://movie.douban.com/subject/26887174/photos?type=S&start=0&sortby=like&size=a&subtype=a
拟下载150张剧照

目录

1.分析图片,获取网址

2 爬取网页图片

2.1 找到网页的头文件

2.2 请求网页

2.3 提取src


1.分析图片,获取网址

每行显示3张,一页10行,总共显示30张,要下载150张图片,需要5页。

再分析第一页到第五页的网址关系,发现只是网址中的start=0 在变化,第二页是30,第三页是60……

通过这个规律就可以批量获得每一页的网址,然后爬虫

# -*- coding: UTF-8 -*-
'''
批量从网页中下载图片
选取豆瓣电影 下载西部世界2的剧照
网址为: https://movie.douban.com/subject/26887174/photos?type=S&start=0&sortby=like&size=a&subtype=a
拟下载150张剧照
'''

# 获取每一页的网址
# 从每页网址中去发现网址的规律,只是网址中的start=0 再变化
urls = []
# 第一种方法
# url = 'https://movie.douban.com/subject/26887174/photos?type=S&start=0&sortby=like&size=a&subtype=a'
# for i in range(0,121,30):
#     urls.append(url.replace('start=0','start='+str(i)))

# 第二种方法
for i in range(0,121,30):
    url = 'https://movie.douban.com/subject/26887174/photos?type=S&start={}&sortby=like&size=a&subtype=a'.format(i)
    # 此处用到格式字符串
    print(url)
    urls.append(url)

2 爬取网页图片

2.1 找到网页的头文件

由于我在请求网页之前不加头文件,会出现418的错误,因此需要先找到网页的头文件,如下图所示。

1. 使用网页检查功能找到Network,

2. 再刷新页面,不刷新页面就什么都看不到,刷新之后才有图上的3,4,5。

3. 随便点击图像,就会出现4(请求头)

4 复制5的内容

2.2 请求网页

import requests
from bs4 import BeautifulSoup  # 解析网页

# 获取网页头文件
header = {'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36'}
imgtags =[] # 存放图像标签

for u in urls:
    r = requests.get(u, headers=header)
    soup = BeautifulSoup(r.text, 'lxml')
    # 解析后可以方便索引标签

    # 索引图像标签
    imgs = soup.find('ul', class_='poster-col3 clearfix').find_all('img')
    # 观察html文件,图片都存储在ul标签里,并且在li里面,找到'img'标签就是所有的图片地址
    # 正确的索取应该有30个链接
    # for i in imgs:
    #     print(i)
    imgtags.extend(imgs)  # 添加列表用extend

 header里就是刚才找到的头文件,注意有大括号

关于解析网页 requests.get() soup.find()的内容本系列之前的章节有讲过,不会的请移步:https://blog.csdn.net/u014264373/article/details/104310841

下图为定位图像块标签的示意图,发现有用的图片都在ul标签里,只要定位到该ul就可以找到图片。

结果:获取到每个图像的img标签和src

<img src="https://img1.doubanio.com/view/photo/m/public/p2516610009.jpg"/>
<img src="https://img1.doubanio.com/view/photo/m/public/p2515119167.jpg"/>
<img src="https://img1.doubanio.com/view/photo/m/public/p2515119077.jpg"/>
<img src="https://img9.doubanio.com/view/photo/m/public/p2515119045.jpg"/>
<img src="https://img3.doubanio.com/view/photo/m/public/p2523536173.jpg"/>
<img src="https://img9.doubanio.com/view/photo/m/public/p2522947315.jpg"/>
<img src="https://img3.doubanio.com/view/photo/m/public/p2522327613.jpg"/>
<img src="https://img3.doubanio.com/view/photo/m/public/p2515119121.jpg"/>

2.3 提取src

# 提取链接
imgsrc = [x['src'] for x in imgtags]
# for i in imgsrc:
#     print(i)
https://img1.doubanio.com/view/photo/m/public/p2516610009.jpg
https://img1.doubanio.com/view/photo/m/public/p2515119167.jpg
https://img1.doubanio.com/view/photo/m/public/p2515119077.jpg
https://img9.doubanio.com/view/photo/m/public/p2515119045.jpg
https://img3.doubanio.com/view/photo/m/public/p2523536173.jpg
https://img9.doubanio.com/view/photo/m/public/p2522947315.jpg

2.4 访问上述图片地址,保存图片

# 访问图片网址
n = 0
for p in imgsrc:
    r = requests.get(p)
    with open('/Users/luo/workspace/pycharm/DataAnalysis/data/picture/p%s.jpg'%n, 'wb') as f:
        f.write(r.content)  # 获取二进制流并存储起来
    print('成功保存%s张图片'%n)
    n += 1

大功告成,一起试试吧

# -*- coding: UTF-8 -*-
'''
批量从网页中下载图片
选取豆瓣电影 下载西部世界2的剧照
网址为: https://movie.douban.com/subject/26887174/photos?type=S&start=0&sortby=like&size=a&subtype=a
拟下载150张剧照
'''

# 获取每一页的网址
# 从每页网址中去发现网址的规律,只是网址中的start=0 再变化
urls = []
# 第一种方法
# url = 'https://movie.douban.com/subject/26887174/photos?type=S&start=0&sortby=like&size=a&subtype=a'
# for i in range(0,121,30):
#     urls.append(url.replace('start=0','start='+str(i)))

# 第二种方法
for i in range(0,121,30):
    url = 'https://movie.douban.com/subject/26887174/photos?type=S&start={}&sortby=like&size=a&subtype=a'.format(i)
    # 此处用到格式字符串
    # print(url)
    urls.append(url)

import requests
from bs4 import BeautifulSoup  # 解析网页

# 获取网页头文件
header = {'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36'}
imgtags =[] # 存放图像标签

for u in urls:
    r = requests.get(u, headers=header)
    soup = BeautifulSoup(r.text, 'lxml')
    # 解析后可以方便索引标签

    # 索引图像标签
    imgs = soup.find('ul', class_='poster-col3 clearfix').find_all('img')
    # 观察html文件,图片都存储在ul标签里,并且在li里面,找到'img'标签就是所有的图片地址
    # 正确的索取应该有30个链接
    # for i in imgs:
    #     print(i)

    imgtags.extend(imgs)  # 添加列表用extend

# 提取链接
imgsrc = [x['src'] for x in imgtags]
# for i in imgsrc:
#     print(i)

# 访问图片网址
n = 0
for p in imgsrc:
    r = requests.get(p)
    with open('/Users/luo/workspace/pycharm/DataAnalysis/data/picture/p%s.jpg'%n, 'wb') as f:
        f.write(r.content)  # 获取二进制流并存储起来
    print('成功保存%s张图片'%n)
    n += 1
发布了76 篇原创文章 · 获赞 95 · 访问量 22万+

猜你喜欢

转载自blog.csdn.net/u014264373/article/details/105282233
今日推荐