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

使用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'<br/>(.*?)</p>', 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()

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值