我是猫妹,一名爱上Python编程的小学生。
你知道有个网站叫豆瓣吗?
网站还提供书影音推荐、线下同城活动、小组话题交流等多种服务功能,它更像一个集品味系统(读书、电影、音乐)、表达系统(我读、我看、我听)和交流系统(同城、小组、友邻)于一体的创新网络服务,一直致力于帮助都市人群发现生活中有用的事物。
猫妹豆瓣用得不多,不过咱们今天要抓取的电影海报来自豆瓣。
如下页面有250部2022年度电影榜单,都是读者朋友推荐的精品。
获取网页源码
实际上,这些元素是通过html语法来组织的,比如显示什么内容文字?文字的颜色格式是什么?显示什么图片?图片放在哪里等等。
我们可以通过查看网页的源码,得知网页的html源代码。
第一步先通过Python的Request模块获取网页的源代码:
importrequests
headers={
'User-Agent':
'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/109.0.0.0Safari/537.36'
reponse=requests.get(url=url,headers=headers)
result=reponse.text
print(result)
获取单页海报地址
我们的步骤是:
网页源码->解析电影海报地址->下载海报
我们可以通过正则表达式解析源码,获取电影的名称和地址。
importre
defget_source_code():
#print(result)
returnresult
defget_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相匹配的全部字串,返回形式为数组。
下载单页海报
有了电影海报的地址,保存就很简单了。
测试代码:
frompathlibimportPath
file_path=Path('D:/和猫妹学Python/海报')
ifnotfile_path.exists():
file_path.mkdir(parents=True)
foriinrange(len(title_list)):
response1=requests.get(url=image_list[i])
contents=response1.content
image_path=file_path/(title_list[i]+'.jpg')
withopen(image_path,'wb')asfp:
fp.write(contents)
26行:要保存电影海报的目录文件夹内
27~28:行:如果没有此文件夹,那么创建一个
30行:根据列表获取电影的数量,判断需要下载多少次。每次请求都是电影图片的地址。
33行:用电影名称给电影图片命名。
34~35行:将图片信息contents进行保存。
下载多页海报
我们上面已经抓取了第一页的电影海报图片,共25张。
如何抓取多页呢?
这就需要找找规律啦!
点击页面底部的不同页面,你会发现链接有规律。
啥规律?
是不是将单页下载海报的代码,将其循环10次就可以啦?
没错!
defget_source_code(page):
url=page
#print(title_list)
#print(image_list)
print('.',end='')
print("豆瓣海报下载中...",end='')
foriinrange(10):
result=get_source_code(url)
print("下载完成")
print("和猫妹学Python")
程序运行:
程序下载较慢,如果想下载得快点,可以用上多线程技术,实现快速下载。