豆瓣电影top250

全部代码以及分析见GitHub:https://github.com/dta0502/douban-top250

本文是Python爬取豆瓣的top250电影的分析和实现,具体是将电影的标题、电影描述、电影的评分、电影的评论数以及电影的一句影评抓取下来,然后输出csv文件。

第一步:打开豆瓣电影top250这个页面。

第二步:分析网页源代码,找到我们需要爬取的信息的标签,例如电影title的标签等等是什么。

第三步:写代码了,将整个html请求下来,然后解析网页,获取我们需要的信息,利用lxml进行解析。

网页分析

首先打开豆瓣电影top250,我们可以看到电影是按照一个列表呈现出来的,页面是通过最底部的12345…来进行翻页查看的。

定位页面元素

我通过chrome的开发者工具来分析页面元素。下面是chrome的检查的页面:

点击上图中画圆圈的图标,然后自己鼠标在页面上选中一部分,就会直接定位到具体的地方了。

电影信息的位置

通过上面所说的方法,我们可以观察得到所有列表是放在一个class = ‘grid_view’的ol标签中的,这个标签下的每一个li标签就是每一部电影信息的Item。

ol标签的XPath路径

//*[@id="content"]/p/p[1]/ol

电影标题的XPath路径

//*[@id="content"]/p/p[1]/ol/li[1]/p/p[2]/p[1]/a/span[1]

电影的描述

//*[@id="content"]/p/p[1]/ol/li[1]/p/p[2]/p[2]/p[1]

电影评分的XPath路径

//*[@id="content"]/p/p[1]/ol/li[1]/p/p[2]/p[2]/p/span[2]

电影评论数的XPath路径

//*[@id="content"]/p/p[1]/ol/li[1]/p/p[2]/p[2]/p/span[4]

电影的一句经典影评

//*[@id="content"]/p/p[1]/ol/li[1]/p/p[2]/p[2]/p[2]/span

翻页

每一页网址的变化规律,一页可以显示25部电影,就是说这250部电影一共有10页。观察前几页的网址很容易发现规律:就是start后面跟的参数变化,等于(页数-1)*25,而且发现后面的filter去掉也不影响。

https://movie.douban.com/top250?start=0

https://movie.douban.com/top250?start=25

...

https://movie.douban.com/top250?start=225

现在完成了整个网页的分析,下面开始实现爬取

Python实现爬取(baseline model)

导入第三方库

requests模块取代内建的urllib2模块,因为其速度更快而且可读性更好。

lxml

lxml是一个优美的扩展库,用来快速解析XML以及HTML文档即使所处理的标签非常混乱。

import requests

from lxml import etree

import csv

requests获取页面

这里我们将使用 requests.get 来从页面中取得我们的数据, 通过使用 html 模块解析它,并将结果保存到 tree 中。

headers={

'User-Agent':'Mozilla/5.0 (windows NT 6.1; WOW64) APPleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36'}

data = requests.get(url,headers = headers).text

selector = etree.HTML(data)

etree现在包含了整个HTML文件到一个优雅的树结构中,我们可以使用两种方法访问:

XPath:XPath是一种在结构化文档(如HTML或XML)中定位信息的方式。

CSS选择器。

下面我采用XPath方法来定位信息。

电影信息的XPath路径获取

Chrome可以右键元素,选择‘Inspect element’,高亮这段代码,再次右击,并选择‘Copy XPath’。

下面是根据XPath路径获取想要的电影信息,把它们保存到变量中。

film=selector.xpath('//*[@id="content"]/p/p[1]/ol/li')

for p in film:

title = p.xpath('p/p[2]/p[1]/a/span[1]/text()')[0]

describe = p.xpath('p/p[2]/p[2]/p[1]/text()') #这里我爬取了年份、国家、类型这三个参数,忽略了导演等参数

rating = p.xpath('p/p[2]/p[2]/p/span[2]/text()')[0]

comments_nums = p.xpath('p/p[2]/p[2]/p/span[4]/text()')[0]

comments = p.xpath('p/p[2]/p[2]/p[2]/span/text()')[0]

下面看下获取到的电影信息:

>>> title

'怦然心动'

>>> describe[0]

'\n 导演: 罗伯·莱纳 Rob Reiner\xa0\xa0\xa0主演: 玛德琳·卡罗尔 Madeline Carroll / 卡...'

>>> describe[0].lstrip()

'导演: 罗伯·莱纳 Rob Reiner\xa0\xa0\xa0主演: 玛德琳·卡罗尔 Madeline Carroll / 卡...'

>>> describe[0].lstrip().split('\xa0\xa0\xa0')

['导演: 罗伯·莱纳 Rob Reiner', '主演: 玛德琳·卡罗尔 Madeline Carroll / 卡...']

>>> describe[1]

'\n 2010\xa0/\xa0美国\xa0/\xa0剧情 喜剧 爱情\n '

>>> describe[1].lstrip() #lstrip = left strip =去除(字符串)左边的

'2010\xa0/\xa0美国\xa0/\xa0剧情 喜剧 爱情\n '

>>> describe[1].lstrip().rstrip() #rstrip = right strip =去除(字符串)右边的

'2010\xa0/\xa0美国\xa0/\xa0剧情 喜剧 爱情'

>>> describe[1].lstrip().rstrip().split('\xa0/\xa0')

['2010', '美国', '剧情 喜剧 爱情']

>>> rating

'8.9'

>>> comments_nums

'691709人评价'

>>> comments_nums[:-3]

'691709'

>>> comments

'真正的幸福是来自内心深处。'

完整实现

import requests

from lxml import etree

import csv

top250_url = 'https://movie.douban.com/top250?start={}&filter='

movie_name = '名称'

movie_year = '年份'

movie_country = '国家'

movie_type = '类型'

movie_director = '导演'

movie_assess = '评价人数'

movie_score = '评分'

movie_num = 0

with open('top250_movie.csv','w',newline = '',encoding = 'utf-8') as f:

writer = csv.writer(f)

writer.writerow([movie_num,movie_name,movie_year,movie_country,movie_type,movie_director,movie_assess,movie_score])

for lists in range(10):

movie_content = requests.get(top250_url.format(lists*25)).text

selector = etree.HTML(movie_content)

all_list = selector.xpath('//*[@id="content"]/p/p[1]/ol/li')

for item in all_list:

movie_name = item.xpath('p/p[2]/p[1]/a/span[1]/text()')[0]

movie_assess = item.xpath('p/p[2]/p[2]/p/span[4]/text()')[0][:-3]

movie_score = item.xpath('p/p[2]/p[2]/p/span[2]/text()')[0]

movie_num += 1

# 下面将电影的介绍信息进行整理

movie_intro = item.xpath('p/p[2]/p[2]/p[1]/text()')

movie_actor_infos = movie_intro[0].lstrip().split('\xa0\xa0\xa0')

movie_other_infos = movie_intro[1].lstrip().rstrip().split('\xa0/\xa0')

# 下面是导演信息

movie_director = movie_actor_infos[0][3:]

# 下面是电影上映的年份

movie_year = movie_other_infos[0]

# 下面是电影的国家

movie_country = movie_other_infos[1]

# 下面是电影的类型

movie_type = movie_other_infos[2]

writer.writerow([movie_num,movie_name,movie_year,movie_country,movie_type,movie_director,movie_assess,movie_score])

结果

import pandas as pd

import csv

df = pd.read_csv("top250_movie.csv",encoding = 'utf-8')

df

>>> df.info()

RangeIndex: 250 entries, 0 to 249

Data columns (total 8 columns):

0 250 non-null int64

名称 250 non-null object

年份 250 non-null object

国家 250 non-null object

类型 250 non-null object

导演 250 non-null object

评价人数 250 non-null int64

评分 250 non-null float64

dtypes: float64(1), int64(2), object(5)

memory usage: 15.7+ KB

遇到的问题

csv文件产生空行的问题

excel打开csv出现乱码怎么解决

参考

使用python抓取豆瓣top250电影数据进行分析

python爬虫一:抓取豆瓣电影Top250

全部代码以及分析见GitHub:https://github.com/dta0502/douban-top250

相关阅读

《社交网络》是一部改编自本·麦兹里奇的小说《意外的亿万富翁:Facebook的创立,一个关于性、金钱、天才和背叛的故事》,由大卫 · 芬

一直在忙项目,终于有时间重新来总结下css。

一组嵌套的盒子,子盒子和父盒子之间想设置上边距,不能用margin-top设置。因为子盒子

博客呃,其实我是个菜如一只鸡的家伙了,想了那么久说要去打Topcoder 的srm,从配置好到实际打,中间间隔估计超过1个月.当然第一次srm人

事实上stoppropagation和cancelBubble的作用是一样的,都是用来阻止浏览器默认的事件冒泡行为。不同之处在于stoppropagation属于W3

雯雅婷4 PoorSakura vol.4

作品内容 (RJ065602)【游戏名称】:(过于H我就不说了,大家自己找一下)【サークル名 】:  7thDream サ

python 豆瓣电影top250_「豆瓣电影top250」豆瓣电影TOP250抓取 - seo实验室相关推荐

  1. tkinter 设置不可编辑_「input不可编辑」input 不可编辑的方法 - seo实验室

    input不可编辑 1.disabled 属性规定应该禁用 input 元素,被禁用的 input 元素,不可编辑,不可复制,不可选择,不能接收焦点,后台也不会接收到传值.设置后文字的颜色会变成灰色. ...

  2. linux重启用reboot后起不来_「linux重启命令」Linux之重启reboot命令 - seo实验室

    linux重启命令 reboot 用来重启linux系统和windows系统中的restart一样.但是机器重启必须要root用户才有权限. 命令语法: /sbin/reboot [-n] [-w] ...

  3. java 文本编辑器_「java文本编辑器」用Java实现文本编辑器 - seo实验室

    java文本编辑器 源码里有注释:import java.awt.*; import java.awt.event.*; import java.io.*; import javax.swing.*; ...

  4. ubuntu 安装mysql 5.5_「ubuntu安装mysql」Ubuntu16.04安装mysql5.5 - seo实验室

    ubuntu安装mysql 本文实在网上找的资料的基础上修改的

  5. python爬取豆瓣电影top250并保存为xlsx_python抓取豆瓣电影Top250数据并写入Excel

    douban python抓取豆瓣电影Top250数据并写入Excel 1.将目标网站上的页面抓取下来 2.将抓取下来的数据根据一定的规则进行提取 create table `tb_movie`( i ...

  6. python 爬虫生成csv文件和图_csv文件操作和爬虫抓取豆瓣影评并生成词云图

    import requests from bs4 import BeautifulSoup import csv # 自定义一个抓取每页影评的方法 def getCommentByPage(url): ...

  7. python列表框_「每日一练」Python列表框部件的运用

    原标题:「每日一练」Python列表框部件的运用 用Python就一定要用到界面操作,有一个好的用户界面,才会有好的用户体验,下边就开始创建我们的主窗口,并设置相应的列表框部件吧! 案例 创建主窗口, ...

  8. python docker自动化_「docker实战篇」python的docker爬虫技术-移动自动化控制工具appium工具(17)...

    原创文章,欢迎转载.转载请注明:转载自 IT人故事会,谢谢! 原文链接地址: 「docker实战篇」python的docker爬虫技术-移动自动化控制工具appium工具(17) Appium是一个开 ...

  9. python docker自动化_「docker实战篇」python的docker爬虫技术-移动自动化控制工具安卓ADB的使用(15)...

    原创文章,欢迎转载.转载请注明:转载自 IT人故事会,谢谢! 原文链接地址: 「docker实战篇」python的docker爬虫技术-移动自动化控制工具安卓ADB的使用(15) adb(Androi ...

  10. python程序员面试自我介绍_「日语面试自我介绍」程序员日语自我介绍 - seo实验室...

    日语面试自我介绍 初めまして.わたしは胡です.コンピューター関係の専門(せんもん)で卒業し.三年間対日(たいにち)javaの開発と試験の経験(けいけん)を持って.また.先端(せんたん)技術(ぎじゅつ) ...

最新文章

  1. Restore Volume 操作 - 每天5分钟玩转 OpenStack(60)
  2. python绘制饼图explode_python通过matplotlib生成复合饼图
  3. .net 集合分成几个等数量集合_巧用数学游戏,帮助幼儿轻松掌握12种数量关系!...
  4. Springboot 传递 List「Long」 IdList
  5. [Linux]消息队列
  6. java数据库的量级_程序员学Python还是Java?分析了8张图后得出这个结论
  7. Java JDBC工具类
  8. UVA10978 Let's Play Magic!【模拟】
  9. 【ASP.NET学习笔记一】ASP.NET页面传参总结
  10. [引]构造文法时表达式中算符优先级的问题
  11. MapGISnbsp;K9nbsp;SP3amp;nb…
  12. python图像处理之一 - Pillow的基本用法
  13. 【精度】概率论之概念解析:边缘化(Marginalisation)
  14. 全国职业院校技能大赛——物联网赛项比赛感想
  15. json.dumps()、json.laods()、demjson相关
  16. Robot Framework自定义测试库
  17. Linux下php重启的问题
  18. bash脚本中出现[[:not found错误的解决方法
  19. vrops vRealize Operations Manager 8云管平台部署与配置
  20. 2014网络知名艺人网络红人排行榜网络红人帅哥都有谁

热门文章

  1. 创建数据库中,常用的MySQL命令(含解析与全部代码)
  2. 单片机跑马灯程序c语言,用单片机编写几种跑马灯程序
  3. ubuntu安装tim
  4. hping3进行SYN Flood攻击
  5. “野火FreeRTOS教程”第7章补充知识点-异常流程
  6. 关于2020年美赛F奖的经验贴
  7. matlab安装前有兼容性问题,matlab安装及问题解决
  8. 工资软件测试白盒测试报告,白盒测试测试报告模板.doc
  9. python程序设计基础电子书_python程序设计基础 pdf下载
  10. Matlab显示图像并显示框选的有效区域