Python爬虫获取豆瓣电影并写入excel


Posted in Python onJuly 31, 2020

豆瓣电影排行榜前250 分为10页,第一页的url为https://movie.douban.com/top250,但实际上应该是https://movie.douban.com/top250?start=0 后面的参数0表示从第几个开始,如0表示从第一(肖申克的救赎)到第二十五(触不可及),https://movie.douban.com/top250?start=25表示从第二十六(蝙蝠侠:黑暗骑士)到第五十名(死亡诗社)。等等,

所以可以用一个步长为25的range的for循环参数

for i in range(0, 250, 25): print(i)

分析完页面组成后,开始获取页面,直接request.get()发现没有返回任何东西,输出一下响应码

url = 'https://movie.douban.com/top250?start=0'res = request.get(url=url)print(res.status_code)

发现返回响应码418

以前没见过这个,拉网线上网查一下,发现给get里面加一个header参数就行了

这里可以用自己浏览器的user-agent,如

headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36'}

或者用fake_agent(安装直接用pip install fake_agent) 来为自己生成一个随机的agent添加到header字典中

from fake_useragent import UserAgentheaders = {'User-Agent': UserAgent().random}

之后就可以得到页面源码了。

然后使用lxml.etree,即xpath解析页面源码。用浏览器插件xpath finder快速定位到元素

Python爬虫获取豆瓣电影并写入excel

import requests
import lxml.etree as etree
url = 'https://movie.douban.com/top250?start=0'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36'}
res = requests.get(url=url, headers=headers)
print(res.text)

html = etree.HTML(res.text)
name = html.xpath("/html/body/div[3]/div[1]/div/div[1]/ol/li[1]/div/div[2]/div[1]/a/span[1]")
print(name)

但是直接这样子,解析到的是这样的结果

[<Element span at 0x20b2f0cc488>]

Python爬虫获取豆瓣电影并写入excel

关于这东西是什么,有文章写的很好:https://3water.com/article/132145.htm

这里我直接写解决部分,在使用xpath解析时,后面加上/text()

name = html.xpath("/html/body/div[3]/div[1]/div/div[1]/ol/li[1]/div/div[2]/div[1]/a/span[1]/text()")

解决后,再使用xpath finder插件,一步一步获取到电影所有数据

最后把这个写在函数里,外面再套上一开始说的循环,就OK了

# -*- coding: utf-8 -*-

import requests
import lxml.etree as etree


def get_source(page):
  url = 'https://movie.douban.com/top250?start={}'.format(page)
  headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36'}
  print(url)
  res = requests.get(url=url, headers=headers)
  print(res.status_code)
  html = etree.HTML(res.text)
  for i in range(1, 26):
    name = html.xpath("/html/body/div[3]/div[1]/div/div[1]/ol/li[{}]/div/div[2]/div[1]/a/span[1]/text()".format(i))
    info = html.xpath("/html/body/div[3]/div[1]/div/div[1]/ol/li[{}]/div/div[2]/div[2]/p[1]/text()".format(i))
    score = html.xpath(
      "/html/body/div[3]/div[1]/div/div[1]/ol/li[{}]/div/div[2]/div[2]/div/span[2]/text()".format(i))
    slogan = html.xpath(
      "/html/body/div[3]/div[1]/div/div[1]/ol/li[{}]/div/div[2]/div[2]/p[2]/span/text()".format(i))
    print(name[0])
    print(info[0].replace(' ', ''))
    print(info[1].replace(' ', ''))
    print(score[0])
    print(slogan[0])


n = 1
for i in range(0, 250, 25):
  print('第%d页' % n)
  n += 1
  get_source(i)
  print('==========================================')

在定位时,发现有4部电影介绍没有slogan,导致获取到的信息为空列表,也就导致了list.append()会出错。所以我加上了几个差错处理,解决方式可能有点傻,如果有更好的解决办法,洗耳恭听

代码在最后可以看到

Python爬虫获取豆瓣电影并写入excel

EXCEL保存部分

这里我用的xlwt

book = xlwt.Workbook()

sheet = book.add_sheet(u'sheetname', cell_overwrite_ok=True)

创建一个sheet表单。

数据保存到一个大列表中,列表嵌套列表

再通过循环把数据导入到excel表单中

r = 1
  for i in LIST: #有10页
    for j in i:  #有25条数据
      c = 2
      for x in j:    #有5组数据
        print(x)
        sheet.write(r, c, x)
        c += 1
      r += 1

最后在保存一下

book.save(r'douban.xls')

注意文件后缀要用xls,用xlsx会导致文件打不开

然后就大功告成了

打开文件,手动加入排名,等部分信息(这些也可以在程序里完成,我嫌麻烦,就没写,直接手动来的快)

Python爬虫获取豆瓣电影并写入excel

前面的✓是我自己整的,用于记录那些看过,那些没看过

这也是我写这个东西的最初的目的

完整代码在下面,仅用于参考

# -*- coding: utf-8 -*-

import requests
import lxml.etree as etree
import xlwt

def get_source(page):
  List = []
  url = 'https://movie.douban.com/top250?start={}'.format(page)
  headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36'}
  print(url)
  res = requests.get(url=url, headers=headers)
  print(res.status_code)
  html = etree.HTML(res.text)
  for i in range(1, 26):
    list = []
    name = html.xpath("/html/body/div[3]/div[1]/div/div[1]/ol/li[{}]/div/div[2]/div[1]/a/span[1]/text()".format(i))
    info = html.xpath("/html/body/div[3]/div[1]/div/div[1]/ol/li[{}]/div/div[2]/div[2]/p[1]/text()".format(i))
    score = html.xpath(
      "/html/body/div[3]/div[1]/div/div[1]/ol/li[{}]/div/div[2]/div[2]/div/span[2]/text()".format(i))
    slogan = html.xpath(
      "/html/body/div[3]/div[1]/div/div[1]/ol/li[{}]/div/div[2]/div[2]/p[2]/span/text()".format(i))
    try:
      list.append(name[0])
    except:
      list.append('----')
    try:
      list.append(info[0].replace(' ', '').replace('\n', ''))
    except:
      list.append('----')
    try:
      list.append(info[1].replace(' ', '').replace('\n', ''))
    except:
      list.append('----')
    try:
      list.append(score[0])
    except:
      list.append('----')
    try:
      list.append(slogan[0])
    except:
      list.append('----')

    List.append(list)

  return List


n = 1
LIST = []
for i in range(0, 250, 25):
  print('第{}页'.format(n))
  n += 1
  List = get_source(i)
  LIST.append(List)


def excel_write(LIST):
  book = xlwt.Workbook()
  sheet = book.add_sheet(u'sheetname', cell_overwrite_ok=True)
  r = 1
  for i in LIST: #有10页
    for j in i:  #有25条数据
      c = 2
      for x in j:    #有5组数据
        print(x)
        sheet.write(r, c, x)
        c += 1
      r += 1

  book.save(r'douban1.xls')  #保存代码
excel_write(LIST)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python批量下载图片的三种方法
Apr 22 Python
Python爬虫实现网页信息抓取功能示例【URL与正则模块】
May 18 Python
Python获取当前公网ip并自动断开宽带连接实例代码
Jan 12 Python
基于Python中求和函数sum的用法详解
Jun 28 Python
Python中logging.NullHandler 的使用教程
Nov 29 Python
pycharm运行和调试不显示结果的解决方法
Nov 30 Python
python3使用pandas获取股票数据的方法
Dec 22 Python
python GUI库图形界面开发之PyQt5信号与槽事件处理机制详细介绍与实例解析
Mar 08 Python
手把手教你安装Windows版本的Tensorflow
Mar 26 Python
python numpy库np.percentile用法说明
Jun 08 Python
pytorch finetuning 自己的图片进行训练操作
Jun 05 Python
详解Python+OpenCV进行基础的图像操作
Feb 15 Python
深入浅析Python代码规范性检测
Jul 31 #Python
python使用Word2Vec进行情感分析解析
Jul 31 #Python
Python爬虫基于lxml解决数据编码乱码问题
Jul 31 #Python
Python如何定义有可选参数的元类
Jul 31 #Python
Python爬虫爬取糗事百科段子实例分享
Jul 31 #Python
Python如何对齐字符串
Jul 30 #Python
Python3爬虫关于代理池的维护详解
Jul 30 #Python
You might like
PHP 数组遍历顺序理解
2009/09/09 PHP
ThinkPHP3.1新特性之对页面压缩输出的支持
2014/06/19 PHP
Javascript----文件操作
2007/01/18 Javascript
10个基于jQuery或JavaScript的WYSIWYG 编辑器整理
2010/05/06 Javascript
基于jquery的内容循环滚动小模块(仿新浪微博未登录首页滚动微博显示)
2011/03/28 Javascript
js模仿html5 placeholder适应于不支持的浏览器
2013/01/13 Javascript
jquery验证手机号码、邮箱格式是否正确示例代码
2013/07/28 Javascript
处理文本部分内容的TextRange对象应用实例
2014/07/29 Javascript
jQuery获取标签文本内容和html内容的方法
2015/03/27 Javascript
jQuery层动画定位滑动效果的方法
2015/04/30 Javascript
纯javascript代码实现计算器功能(三种方法)
2015/09/07 Javascript
js仿淘宝和百度文库的评分功能
2016/05/15 Javascript
JS实现可编辑的后台管理菜单功能【附demo源码下载】
2016/09/13 Javascript
js实现上传文件添加和删除文件选择框
2016/10/24 Javascript
AngulerJS学习之按需动态加载文件
2017/02/13 Javascript
tangram.js库实现js类的方式实例分析
2018/01/06 Javascript
JS实现继承的几种常用方式示例
2019/06/22 Javascript
vue 实现微信浮标效果
2019/09/01 Javascript
element中Steps步骤条和Tabs标签页关联的解决
2020/12/08 Javascript
python实现数通设备端口监控示例
2014/04/02 Python
闭包在python中的应用之translate和maketrans用法详解
2014/08/27 Python
Python编程实现的简单Web服务器示例
2017/06/22 Python
Python中使用haystack实现django全文检索搜索引擎功能
2017/08/26 Python
解决Django生产环境无法加载静态文件问题的解决
2019/04/23 Python
Python命名空间及作用域原理实例解析
2020/08/12 Python
阿里云:Aliyun.com
2017/02/15 全球购物
意大利折扣和优惠券网站:Groupalia
2019/10/09 全球购物
介绍一下linux文件系统分配策略
2012/11/17 面试题
工程师岗位职责
2013/11/08 职场文书
事业单位接收函
2014/01/10 职场文书
乡镇总工会学雷锋活动总结
2014/03/01 职场文书
师德先进个人材料
2014/12/20 职场文书
员工拾金不昧表扬稿
2015/05/05 职场文书
家长反馈意见及建议
2015/06/03 职场文书
详解JAVA的控制语句
2021/11/11 Java/Android
Redis+Lua脚本实现计数器接口防刷功能(升级版)
2022/02/12 Redis