小朋友们好,大朋友们好!
我是猫妹,一名爱上Python编程的小学生。
关注我,一起趣味学编程!
你知道有个网站叫豆瓣吗?
它是一个社区网站,它以书影音起家,提供关于书籍、电影、音乐等作品的信息,无论描述还是评论都由用户提供,是Web2.0网站中具有特色的一个网站。
网站还提供书影音推荐、线下同城活动、小组话题交流等多种服务功能,它更像一个集品味系统(读书、电影、音乐)、表达系统(我读、我看、我听)和交流系统(同城、小组、友邻)于一体的创新网络服务,一直致力于帮助都市人群发现生活中有用的事物。
猫妹豆瓣用得不多,不过咱们今天要抓取的电影海报来自豆瓣。
如下页面有250部2022年度电影榜单,都是读者朋友推荐的精品。
获取网页源码
通过之前几篇文章的学习,我们知道,在网页上我们看到的是文字、图片、视频等元素。
实际上,这些元素是通过html语法来组织的,比如显示什么内容文字?文字的颜色格式是什么?显示什么图片?图片放在哪里等等。
我们可以通过查看网页的源码,得知网页的html源代码。
电影详细信息就在html代码里,比如《肖申克的救赎》相关信息如下:
第一步先通过Python的Request模块获取网页的源代码:
import requests
url = 'https://movie.douban.com/top250'
headers = {
'User-Agent':
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36'
reponse = requests.get(url=url,headers=headers)
result=reponse.text
print(result)
获取单页海报地址
有了网页源代码,接下来就是分析电影相关信息,海报下载链接在哪里。
我们的步骤是:
网页源码->解析电影海报地址->下载海报
我们打开开发者模式,用选择元素工具后,将鼠标放在电影海报的图片上,可以得到其html相关代码。
原来,图片相关信息为:
我们可以通过正则表达式解析源码,获取电影的名称和地址。
import requests
import re
def get_source_code():
url = 'https://movie.douban.com/top250'
headers = {
'User-Agent':
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36'
reponse = requests.get(url=url,headers=headers)
result=reponse.text
#print(result)
return result
def get_image_info(result):
movie_title='
movie_image='
title_list=re.findall(movie_title,result)
image_list=re.findall(movie_image,result)
print(title_list)
print(image_list)
if __name__=='__main__':
result=get_source_code()
get_image_info(result)
运行结果:
这里我们用到了Python自带的正则表达式re,它是用来匹配查找筛选内容的。
re.findall():函数返回包含所有匹配项的列表。返回string中所有与pattern相匹配的全部字串,返回形式为数组。
下载单页海报
有了电影海报的地址,保存就很简单了。
测试代码:
import requests
import re
from pathlib import Path
def get_source_code():
url = 'https://movie.douban.com/top250'
headers = {
'User-Agent':
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36'
reponse = requests.get(url=url,headers=headers)
result=reponse.text
#print(result)
return result
def get_image_info(result):
movie_title='
movie_image='
title_list=re.findall(movie_title,result)
image_list=re.findall(movie_image,result)
print(title_list)
print(image_list)
file_path = Path('D:/和猫妹学Python/海报')
if not file_path.exists():
file_path.mkdir(parents=True)
for i in range(len(title_list)):
response1 = requests.get(url=image_list[i])
contents = response1.content
image_path = file_path / (title_list[i]+'.jpg')
with open(image_path,'wb') as fp:
fp.write(contents)
if __name__=='__main__':
result=get_source_code()
get_image_info(result)
26行:要保存电影海报的目录文件夹内
27~28:行:如果没有此文件夹,那么创建一个
30行:根据列表获取电影的数量,判断需要下载多少次。每次请求都是电影图片的地址。
33行:用电影名称给电影图片命名。
34~35行:将图片信息contents进行保存。
下载多页海报
我们上面已经抓取了第一页的电影海报图片,共25张。
如何抓取多页呢?
这就需要找找规律啦!
点击页面底部的不同页面,你会发现链接有规律。
啥规律?
https://movie.douban.com/top250?start=(页面-1)*25&filter=
是不是将单页下载海报的代码,将其循环10次就可以啦?
没错!
测试代码:
import requests
import re
from pathlib import Path
def get_source_code(page):
#url = 'https://movie.douban.com/top250'
url=page
headers = {
'User-Agent':
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36'
reponse = requests.get(url=url,headers=headers)
result=reponse.text
#print(result)
return result
def get_image_info(result):
movie_title='
movie_image='
title_list=re.findall(movie_title,result)
image_list=re.findall(movie_image,result)
#print(title_list)
#print(image_list)
file_path = Path('D:/和猫妹学Python/海报')
if not file_path.exists():
file_path.mkdir(parents=True)
for i in range(len(title_list)):
response1 = requests.get(url=image_list[i])
contents = response1.content
image_path = file_path / (title_list[i]+'.jpg')
with open(image_path,'wb') as fp:
fp.write(contents)
print('.',end='')
if __name__=='__main__':
print("豆瓣海报下载中...",end='')
for i in range(10):
url='https://movie.douban.com/top250?start={}&filter='.format(i*25)
result=get_source_code(url)
get_image_info(result)
print("下载完成")
print("和猫妹学Python")
程序运行:
程序下载较慢,如果想下载得快点,可以用上多线程技术,实现快速下载。
如果遇到什么问题,咱们多多交流,共同解决。
猫妹在同名公众号等你,不见不散!
我是猫妹,咱们下次见!
热门跟贴