🪲前言
在这篇博客中,我们将学习如何使用Python爬取豆瓣电影Top250的数据。我们将使用requests
库来发送HTTP请求,BeautifulSoup
库来解析HTML页面,并将数据存储 到CSV文件中。这个爬虫将自动获取豆瓣电影Top250页面的信息,包括电影名称、导演、主演、评分等详细信息
豆瓣电影Top250是一个包含豆瓣评分最高的250部电影的榜单,是电影爱好者查找电影的一大宝库。本博客将指导大家如何通过编写Python爬虫自动获取豆瓣电影Top250的数据
🪲环境准备 首先,我们需要安装一些Python库来完成本次任务。以下是我们将使用的库:
requests
:用来发送HTTP请求并获取网页内容。
BeautifulSoup
:用来解析HTML页面,提取我们需要的数据。
csv
:将爬取的数据保存到CSV文件中。
因为我们使用的是Python进行爬虫,所以我们使用的命令行是
pip install requests beautifulsoup4 csv
🪲爬虫原理与分析 豆瓣电影Top250的URL是 https://movie.douban.com/top250
。页面内容是分页显示的,每一页展示25部电影,最多5页。我们需要访问这些页面并提取电影数据
数据结构 分析
每一部电影的信息在HTML结构中都有相应的标签,我们需要从中提取出以下信息:
电影名称
电影评分
电影导演
电影主演
电影年份
电影类型
通过使用BeautifulSoup
解析HTML,我们可以轻松提取这些信息
🪲代码具体的实现 发送请求获取网页内容 我们首先使用requests
库发送请求来获取网页内容。豆瓣会返回HTML页面,我们将把这些内容传递给BeautifulSoup
进行解析
代码语言: python
代码 运行次数:14
运行
AI代码解释
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 import requestsfrom bs4 import BeautifulSoup headers = { 'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36' } base_url = "https://movie.douban.com/top250" movie_list = []def get_page (url ): response = requests.get(url, headers=headers) return response.text
解析网页内容 使用BeautifulSoup
解析HTML页面,找到每部电影的信息。每部电影的信息包含在div
标签中,类名为item
代码语言: python
代码 运行次数:2
运行
AI代码解释
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 def parse_page (html ): soup = BeautifulSoup(html, 'html.parser' ) movies = soup.find_all('div' , class_='item' ) for movie in movies: title = movie.find('span' , class_='title' ).text rating = movie.find('span' , class_='rating_num' ).text director, actors = movie.find('div' , class_='bd' ).find('p' ).text.strip().split("\n" )[:2 ] year = movie.find('div' , class_='bd' ).find('p' ).text.strip().split("\n" )[0 ] movie_type = movie.find('span' , class_='genre' ).text.strip() movie_info = { 'title' : title, 'rating' : rating, 'director' : director, 'actors' : actors, 'year' : year, 'type' : movie_type } movie_list.append(movie_info)
提取电影数据 我们现在可以循环访问每一页的URL并提取数据。豆瓣电影Top250有5页,URL结构为https://movie.douban.com/top250?start=X
,其中X
为每页的起始索引(0, 25, 50, …)
接下来我们的其他案例也会采取类似的分析方式,同学们可以
代码语言: Python
AI代码解释
1 2 3 4 5 6 7 8 9 10 11 12 def main (): for start in range (0 , 250 , 25 ): url = f"{base_url} ?start={start} " html = get_page(url) parse_page(html) for movie in movie_list: print (movie)if __name__ == "__main__" : main()
保存数据到CSV文件或者Excel文件 为了方便后续的数据分析 ,我们可以将数据保存到CSV文件中
代码语言: Python
AI代码解释
1 2 3 4 5 6 7 8 9 10 import csvdef save_to_csv (): keys = movie_list[0 ].keys() with open ('douban_top250.csv' , 'w' , newline='' , encoding='utf-8' ) as output_file: dict_writer = csv.DictWriter(output_file, fieldnames=keys) dict_writer.writeheader() dict_writer.writerows(movie_list) save_to_csv()
如果是Excel那么可以参考下面的案例代码
代码语言: python
代码 运行次数:0
运行
AI代码解释
1 2 3 4 5 import pandas as pd def save_to_excel (): df = pd.DataFrame(movie_list) df.to_excel('douban_top250.xlsx' , index=False , engine='openpyxl' )
🪲完整的代码 代码语言: python
代码 运行次数:57
运行
AI代码解释
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 import csvimport requestsfrom bs4 import BeautifulSoupimport pandas as pd headers = { 'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36' } base_url = "https://movie.douban.com/top250" movie_list = []def get_page (url ): response = requests.get(url, headers=headers) return response.textdef parse_page (html ): soup = BeautifulSoup(html, 'html.parser' ) movies = soup.find_all('div' , class_='item' ) for movie in movies: title = movie.find('span' , class_='title' ).text rating = movie.find('span' , class_='rating_num' ).text director_actors = movie.find('div' , class_='bd' ).find('p' ).text.strip().split("\n" )[:2 ] director = director_actors[0 ] actors = director_actors[1 ] if len (director_actors) > 1 else '' genre_tag = movie.find('span' , class_='genre' ) movie_type = genre_tag.text.strip() if genre_tag else '未知' year_tag = movie.find('div' , class_='bd' ).find('p' ).text.strip().split("\n" )[0 ] movie_info = { 'title' : title, 'rating' : rating, 'director' : director, 'actors' : actors, 'year' : year_tag, 'type' : movie_type } movie_list.append(movie_info)def main (): for start in range (0 , 250 , 25 ): url = f"{base_url} ?start={start} " html = get_page(url) parse_page(html) for movie in movie_list: print (movie)def save_to_csv (): keys = movie_list[0 ].keys() with open ('douban_top250.csv' , 'w' , newline='' , encoding='utf-8-sig' ) as output_file: dict_writer = csv.DictWriter(output_file, fieldnames=keys) dict_writer.writeheader() dict_writer.writerows(movie_list) if __name__ == "__main__" : main() save_to_csv() print ("爬取完成,数据已保存到 douban_top250.csv" )
🪲运行效果 运行上述代码后,你将会得到一个名为douban_top250.csv
的文件,文件内容如下所示:
下图是保存为csv文件的格式,这里注意encoding=’utf-8-sig’,encoding如果等于utf-8,那么直接双击csv文件会乱码的