此为教程笔记
教程地址: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.分析图片,获取网址
每行显示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