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 相关文章推荐
通过C++学习Python
Jan 20 Python
python多进程和多线程究竟谁更快(详解)
May 29 Python
使用Python进行AES加密和解密的示例代码
Feb 02 Python
pygame游戏之旅 添加游戏界面按键图形
Nov 20 Python
python for和else语句趣谈
Jul 02 Python
django数据关系一对多、多对多模型、自关联的建立
Jul 24 Python
Python中的相关分析correlation analysis的实现
Aug 29 Python
基于django 的orm中非主键自增的实现方式
May 18 Python
python安装读取grib库总结(推荐)
Jun 24 Python
Python爬虫之Spider类用法简单介绍
Aug 04 Python
简单谈谈Python面向对象的相关知识
Jun 28 Python
Python字符串常规操作小结
Apr 03 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
综合图片计数器
2006/10/09 PHP
在PHP中执行系统外部命令
2006/10/09 PHP
jq的get传参数在utf-8中乱码问题的解决php版
2008/07/23 PHP
windows下升级PHP到5.3.3的过程及注意事项
2010/10/12 PHP
对象失去焦点时自己动提交数据的实现代码
2012/11/06 PHP
php如何解决无法上传大于8M的文件问题
2014/03/10 PHP
workerman结合laravel开发在线聊天应用的示例代码
2018/10/30 PHP
在IE模态窗口中自由查看HTML源码的方法
2007/03/08 Javascript
JavaScript OOP面向对象介绍
2010/12/02 Javascript
jquery实现ajax提交form表单的方法总结
2014/03/03 Javascript
js 左右悬浮对联广告特效代码
2014/12/12 Javascript
jQuery Ajax全解析
2017/02/13 Javascript
jquery实现自适应banner焦点图
2017/02/16 Javascript
jQuery使用正则验证15/18身份证的方法示例
2017/04/27 jQuery
解决Vue2.0自带浏览器里无法打开的原因(兼容处理)
2017/07/28 Javascript
Angular实现响应式表单
2017/08/04 Javascript
Angularjs使用过滤器完成排序功能
2017/09/20 Javascript
jQuery封装animate.css的实例
2018/01/04 jQuery
js自定义input文件上传样式
2018/10/26 Javascript
vue.js 打包时出现空白页和路径错误问题及解决方法
2019/06/26 Javascript
解决mui框架中switch开关通过js控制开或者关状态时小圆点不动的问题
2019/09/03 Javascript
JavaScript this使用方法图解
2020/02/04 Javascript
Vue SPA 首屏优化方案
2021/02/26 Vue.js
[01:18]PWL开团时刻DAY10——一拳超人
2020/11/11 DOTA
pygame学习笔记(2):画点的三种方法和动画实例
2015/04/15 Python
python使用selenium爬虫知乎的方法示例
2020/10/28 Python
Canvas制作旋转的太极的示例
2018/03/09 HTML / CSS
本科毕业生求职自荐信
2014/04/09 职场文书
活动总结书
2014/05/08 职场文书
户外宣传策划方案
2014/05/25 职场文书
授权委托书样本
2014/09/25 职场文书
兵马俑导游词
2015/02/02 职场文书
酒店仓管员岗位职责
2015/04/01 职场文书
Golang 语言控制并发 Goroutine的方法
2021/06/30 Golang
MySQL中存储时间的最佳实践指南
2021/07/01 MySQL
四十九个javascript小知识实用技巧
2021/11/20 Javascript