小朋友们好,大朋友们好!

我是猫妹,一名爱上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")

程序运行:

程序下载较慢,如果想下载得快点,可以用上多线程技术,实现快速下载。

如果遇到什么问题,咱们多多交流,共同解决。

猫妹在同名公众号等你,不见不散!

我是猫妹,咱们下次见!