爬取豆瓣Top250电影数据一直是爬虫小白的入门练手项目,下面就来分享一下自己的爬取过程。

开始之前,先简单写一下需求和实现思路。

需求:

爬取豆瓣电影Top250的数据,数据包含排名、电影名称、导演、主演、上映年份、国家、电影分类、评分、评价人数、简介,将爬取结果存至Excel文件中。

实现思路:

打开浏览器访问https://movie.douban.com/top250,按下’F12’打开开发者工具,进入Network选项卡,刷新一下页面。可以看到一个名称为’top250’的请求,该请求的Response就是页面源码。点击下一页,请求变成了’top250?start=25&filter=’,再往后翻,发现每翻一页’start’参数增加25。那么,只要根据start参数循环构造请求的url,再根据需求进行源码的解析,最后将结果存入Excel文件即可完成爬取。

源码:
import requests
import re
from bs4 import BeautifulSoup
from lxml import etree
from common.wxls import Xls'''
实现思路
1.request请求单页的源码
2.解析页面源码获取排名、电影名称、导演、主演、上映年份、国家、电影分类、评分、评价人数、简介
3.循环请求10页(豆瓣Top250电影共10页,每页25条数据)
4.保存数据至Excel中
'''#Excel文件的列头
HEADER = ['排名','电影名称','导演','主演','上映年份','国家','电影分类','评分','评价人数','简介']
#结果数据的容器
DATA = []def get_page(page_num):'''获取页面源码:param page_num:页码 0-9:return: 页面源码'''start = page_num * 25url = f'https://movie.douban.com/top250?start={start}'headers = {'Host':'movie.douban.com','User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.84 Safari/537.36'}response = requests.get(url,headers=headers)if response.status_code == 200:return response.textdef parse_page_by_bs4(page):'''通过BeatifulSoup的方法选择器解析页面:param page: 页面源码:return:'''soup = BeautifulSoup(page,'lxml')items = soup.find(name='ol',attrs={'class':'grid_view'}).find_all(name='li')for item in items:rank = item.find(class_='item').find(class_='pic').find('em').stringmovie_name = item.find(class_='info').find(class_='hd').find(name='a').find(name='span').stringinfo = item.find(class_='info').find(class_='bd').find(name='p').get_text().strip()director_name = get_info(info,'director_name')role_name = get_info(info, 'role_name')year = get_info(info, 'year')country = get_info(info, 'country')movie_type = get_info(info, 'movie_type')rate_num = item.find(class_='info').find(class_='bd').find(class_='rating_num').stringrate_people_num = get_info(item.find(class_='info').find(class_='bd').find(class_='star').find_all(name='span')[3].string,'rate_people_num')quote = item.find(class_='info').find(class_='bd').find(class_='quote').find(name='span').string#将提取到的数据加入全局变量DATA中save_to_data([rank,movie_name,director_name,role_name,year,country,movie_type,rate_num,rate_people_num,quote])def parse_page_by_css_selector(page):'''通过BeautifuleSoup的CSS选择器解析页面:param page: 页面源码:return:'''soup = BeautifulSoup(page,'lxml')items = soup.select('ol[class="grid_view"] li')for item in items:rank = item.select('.item .pic em')[0].stringmovie_name = item.select('.item .hd a span')[0].stringinfo = item.select('.info .bd p')[0].get_text().strip()director_name = get_info(info,'director_name')role_name = get_info(info, 'role_name')year = get_info(info, 'year')country = get_info(info, 'country')movie_type = get_info(info, 'movie_type')rate_num = item.select('.info .bd .rating_num')[0].stringrate_people_num = get_info(item.select('.info .bd .star span')[3].string,'rate_people_num')quote = item.select('.info .bd .quote span')[0].stringsave_to_data([rank,movie_name,director_name,role_name,year,country,movie_type,rate_num,rate_people_num,quote])def parse_page_by_xpath(page):'''通过Xpath解析页面:param page::return:'''html = etree.HTML(page)items = html.xpath('//ol[@class="grid_view"]//li')for item in items:rank = item.xpath('.//div[@class="item"]//div[@class="pic"]//em/text()')[0]movie_name = item.xpath('.//div[@class="item"]//div[@class="hd"]//a//span[1]/text()')[0]info = ''.join(item.xpath('.//div[@class="info"]//div[@class="bd"]//p/text()'))director_name = get_info(info, 'director_name')role_name = get_info(info, 'role_name')year = get_info(info, 'year')country = get_info(info, 'country')movie_type = get_info(info, 'movie_type')rate_num = item.xpath('.//div[@class="info"]//div[@class="bd"]//span[@class="rating_num"]/text()')[0]rate_people_num = get_info(item.xpath('.//div[@class="info"]//div[@class="bd"]//div[@class="star"]/span[4]/text()')[0],'rate_people_num')quote = item.xpath('.//div[@class="info"]//div[@class="bd"]//p[@class="quote"]/span/text()')[0]save_to_data([rank, movie_name, director_name, role_name, year, country, movie_type, rate_num, rate_people_num, quote])def save_to_data(data):'''将结果保存至DATA全局变量中:param data: 一行数据:return:'''DATA.append(data)def save_to_excel():'''将结果保存至Excel文件:return:'''xls = Xls(HEADER,DATA,'Top250','Top250.xlsx')xls.out_for_sheet()def get_info(info,type):'''根据段落文本和传入类型获取信息:param info: 待解析的段落文本:param type: 类型(包含director_name/role_name/year/country/movie_type/rate_people_num):return: 根据传入类型返回解析后的数据'''pattern = ''if type == 'director_name':pattern = r'导演:(.*)\xa0\xa0\xa0'elif type == 'role_name':pattern = r'\xa0\xa0\xa0主演:(.*)'elif type == 'year':pattern = r'\s(\d{4})'elif type == 'country':pattern = r'\n.*/(.*)/'elif type == 'movie_type':pattern = r'\n.*/.*/(.*)'elif type == 'rate_people_num':pattern = r'(\d+).*'m = re.search(pattern, info)if m:return m.groups(1)[0].strip()else:return '未知'def main():total_page_num = 10for i in range(total_page_num):print(f'正在爬取第{i+1}页数据...')page = get_page(i)parse_page_by_xpath(page)save_to_excel()print('爬取完成')if __name__ == '__main__':main()

为了增加自己对解析库的熟练度,分别使用三种方法进行解析:

  • BeautifulSoup的方法选择器
  • BeautifulSoup的CSS选择器
  • Xpath

使用后发现BeautifulSoup的CSS选择器的代码较为简洁,但Xpath的速度更快。

将结果存储Excel的方法里,导入了wxls文件的’Xls’类。因为经常要用到写入Excel文件的方法,因此对’openpyxl’库进行了一层封装,只要传入Excel列头,结果数据(数据格式为[[],[]],列表嵌套列表,内部每个列表代表一行数据),Sheet名和文件名,初始化Xls对象并调用out_for_sheet方法,即可完成Excel文件的写入。封装后的wxls源码为:

from openpyxl import Workbook"""
Excel文件操作类
"""
class Xls(object):def __init__(self, header, data, sheetname, filename):"""初始化:param header: 列头字段名([]):param data: 数据([[],[]]):param sheetname: sheet名(''):param filename: 文件名(''):return:"""self.header = headerself.data = dataself.sheetname = sheetnameself.filename = filename#导出单sheet的Excel文件def out_for_sheet(self):output_workbook = Workbook()output_worksheet = output_workbook.create_sheet(self.sheetname, index=0)self.data.insert(0, self.header)[output_worksheet.append(row) for row in self.data]output_workbook.save(self.filename)

爬取豆瓣Top250电影相关推荐

  1. [python爬虫] BeautifulSoup和Selenium对比爬取豆瓣Top250电影信息

    这篇文章主要对比BeautifulSoup和Selenium爬取豆瓣Top250电影信息,两种方法从本质上都是一样的,都是通过分析网页的DOM树结构进行元素定位,再定向爬取具体的电影信息,通过代码的对 ...

  2. 爬取豆瓣top250电影并分析

    爬取豆瓣top250电影,提取评论关键词,然后将同一国家的关键词做成一个词云,轮廓是每个国家的地图轮廓 爬取数据 需要爬取电影名称.导演.年份.地区和前10个评论除了地区,其他的都没什么问题,我们来研 ...

  3. scrapy爬取豆瓣top250电影数据

    scrapy爬取豆瓣top250电影数据 scrapy框架 Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中. sc ...

  4. 【实战1】用BeatuifulSoup解析器爬取豆瓣Top250电影的名称

    [实战1]用BeatuifulSoup解析器爬取豆瓣Top250电影的名称 一. 爬虫的普遍步骤 二. 项目目标分析 三.完整爬取代码 参考链接: https://www.bilibili.com/v ...

  5. 【实战2】爬取豆瓣Top250电影的海报

    [实战2]爬取豆瓣Top250电影的海报 一. 项目目标分析 二. 完整代码 参考链接: https://www.bilibili.com/video/BV1ZJ411N7Fq?p=4 一. 项目目标 ...

  6. Python爬取豆瓣Top250电影中2000年后上映的影片信息

    Python爬取豆瓣Top250电影中2000年后上映的影片信息 前言 双十一前加在京东购物车的一个东西,价格330,Plus会员用券后差不多310.双十一当天打开看了下399,还得去抢满300减10 ...

  7. python采用requests+bs4爬取豆瓣top250电影信息

    爬取豆瓣top250电影说明 (链接:https://movie.douban.com/top250,可爬取一页或者多页(输出电影的正标题(肖申克的救赎),副标题( The Shawshank Red ...

  8. 爬取豆瓣TOP250电影的评分、评价人数、短评等信息,并在其保存在sql数据库中。

    爬取目标 爬取豆瓣TOP250电影的评分.评价人数.短评等信息,并在其保存在sql数据库中. 最终实现效果如图: 确定爬取的URL 爬取的网页地址为:https://movie.douban.com/ ...

  9. Python爬虫菜鸟入门,爬取豆瓣top250电影 (自己学习,如有侵权,请联系我删除)

    Python爬虫菜鸟入门,爬取豆瓣top250电影 (自己学习,如有侵权,请联系我删除) import requests from bs4 import BeautifulSoup import ti ...

  10. Python爬取豆瓣Top250电影可见资料并保存为excel形式

    Python爬取豆瓣Top250电影可见资料并保存为excel形式 利用requests第三方库实现网页的元素爬取,再使用openpyxl库进行信息的录入. 具体思路 1.分析网页的headers. ...

最新文章

  1. set.difference() 的用法(python3)_Python 集合 difference_update() 使用方法及示例
  2. 用rand_7()实现rand_10()
  3. MATLAB中floor、round、ceil、fix区别
  4. wpf tabitem 点击事件_Mindfusion教程:WPF中的Fishbone(Ishikawa)图
  5. python lambda表达式及用法_Python:lambda表达式和yield关键字理解与使用讲解
  6. matlab imresize
  7. java短信验证码实现_社交APP开发短信验证是通过什么技术实现
  8. 【目录】数据结构与算法
  9. 极光im java服务端用户注册
  10. 清子指弹FC吉他五重奏nes《最终幻想1 》地图音乐步行 (FC游戏音乐)
  11. 朋友圈爱心拼图php源码_朋友圈爱心形配图怎么弄 微信朋友圈九宫格心形拼图教程方法...
  12. 【Java小项目】打飞机
  13. 简易的记账软件设计与实现
  14. 图像梯度特征的常用算子:Sobel、Prewitt、Roberts
  15. 龙之谷服务器更新文件,全区全服 维护结束 更新至Ver.417
  16. 苹果AR/VR设备或定价2000美元 或命名Apple Vision
  17. 配置域名 二级,三级的泛解析
  18. jmeter基础操作,图文
  19. 利用hilink 插座远程开电脑
  20. 星际特攻队java_星际特攻队下载-星际特攻队游戏最新版v2.0.1-PChome下载中心

热门文章

  1. 华为机试:整数最小和
  2. 铁肩担责任 淬炼造奇迹——专访鸿策集团董事长陈圆道
  3. 运动蓝牙耳机哪个品牌好、公认最好的运动蓝牙耳机推荐
  4. 汇编语言程序设计大赛赛后总结
  5. 【论文阅读|深读】DANE:Deep Attributed Network Embedding
  6. 百名高管立下“军令状”,这场会议释放强烈信号
  7. python手动实现图像水平、垂直翻转
  8. python取出hive_python 读取hive数据
  9. 线性回归 非线性回归_线性回归的解释
  10. 运行安卓程序报错android.view.InflateException: Binary XML file line #11: Error inflating class ImageView