【代码片段】使用python爬取豆瓣电影TOP250

Python语言 小铁匠 2019-04-03

使用python爬取豆瓣电影TOP250

# 爬取豆瓣电影TOP250
# -*- coding: utf-8 -*-
# @Author: lovenLiu
# @Date:   2019-04-03 09:03:09
# @Last Modified by:   lovenLiu
# @Last Modified time: 2019-04-03 10:59:39

import os
import re
import time
import json
import requests

from bs4 import BeautifulSoup

# 爬取分页数据
def douban_page(page_url):
	response = requests.get(page_url)
	if response.status_code == 200:
		soup = BeautifulSoup(response.text, "html.parser")

		grid_view = soup.find(class_="grid_view")
		grid_view_items = grid_view.find_all("li")

		page_list = []
		for item in grid_view_items:
			# 大部分电影标题栏有两个title标签和一个other标签
			# 但部分电影只有一个title标签,比如top2《霸王别姬》
			titles = item.find_all(class_="title")
			name = titles[0].get_text().strip() # 电影名称
			if len(titles) >= 2:
				alias = titles[1].get_text().strip(" / ") # 电影别名
			else:
				alias = ""

			# 提取电影年份、地区、类型等信息
			p_elem = item.find(class_="bd").find("p", class_="")
                        p_strs = re.findall(r'
(.*?)

', p_elem.prettify(), re.S)
p_str = p_strs[0].strip("\n") # 出去两边换行符 p_items = p_str.split(" / ") # 电影年份、地区、类型分割为列表 film_year = p_items[0].strip() # 年份 film_district = p_items[1] # 地区 film_genre = p_items[2].split() # 分类 # 获取描述(不是全部电影都有描述,比如top239《功夫》,top254《奇迹男孩》) quote_elem = item.find(class_="quote") if quote_elem: description = quote_elem.find(class_="inq").get_text() else: description = "" page_list.append({ "name": name, "alias": alias, "year": film_year, "genre": film_genre, "district": film_district, "sort": item.em.text, # 排序 "link": item.a["href"], # 详情地址 "score": item.find(class_="rating_num").get_text(), # 评分 "description": description # 描述(评价) }) return page_list return [] # 开始爬取,计算分页 def douban_begin(): page_number = 1 # 起始页 page_limit = 25 # 每页显示条数 film_list = [] while page_number <= 10: page_offset = (page_number - 1) * page_limit # 计算当前页起始条数 page_url = "https://movie.douban.com/top250?start=%s" % page_offset page_list = douban_page(page_url) # 把分页结果放入列表 for item in page_list: film_list.append(item) page_number += 1 time.sleep(2) # 休眠2秒防止频繁执行 return film_list if __name__ == "__main__": film_list = douban_begin() # 数据以文件形式保存到本地 fileObj = open("json/douban_film.json", "w") fileObj.write(json.dumps(film_list)) fileObj.close() exit()

注:爬取页面之前需要先分析页面,找到自己需要的数据信息。该代码只是把爬取结果放到了本地文件,可以根据自己的需求存到数据库等合适的位置。

------ 本文结束 感谢阅读 ------