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 27 Python
python SMTP实现发送带附件电子邮件
May 22 Python
python生成以及打开json、csv和txt文件的实例
Nov 16 Python
python 将字符串完成特定的向右移动方法
Jun 11 Python
pandas dataframe的合并实现(append, merge, concat)
Jun 24 Python
pytorch实现focal loss的两种方式小结
Jan 02 Python
Python如何使用paramiko模块连接linux
Mar 18 Python
python 实现rolling和apply函数的向下取值操作
Jun 08 Python
Python爬取微信小程序Charles实现过程图解
Sep 29 Python
Python包资源下载路径报404解决方案
Nov 05 Python
Pandas中两个dataframe的交集和差集的示例代码
Dec 13 Python
Python万能模板案例之matplotlib绘制甘特图
Apr 13 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将图片保存入mysql数据库失败的解决方法
2014/12/27 PHP
详谈配置phpstorm完美支持Codeigniter(CI)代码自动完成(代码提示)
2017/04/07 PHP
php和C#的yield迭代器实现方法对比分析
2019/07/17 PHP
Yii框架视图、视图布局、视图数据块操作示例
2019/10/14 PHP
Javascript实现的分页函数
2006/12/22 Javascript
js 判断一个元素是否在页面中存在
2012/12/27 Javascript
javascript闭包的高级使用方法实例
2013/07/04 Javascript
jQuery实现可收缩展开的级联菜单实例代码
2013/11/27 Javascript
Get中文乱码IE浏览器Get中文乱码解决方案
2013/12/26 Javascript
js跳转页面方法实现汇总
2014/02/11 Javascript
js 获取页面高度和宽度兼容 ie firefox chrome等
2014/05/14 Javascript
ext前台接收action传过来的json数据示例
2014/06/17 Javascript
Jquery zTree 树控件异步加载操作
2016/02/25 Javascript
JS判断浏览器是否安装flash插件的简单方法
2016/09/13 Javascript
JQuery中Ajax的操作完整例子
2017/03/07 Javascript
JS实现带导航城市列表以及输入搜索功能
2018/01/04 Javascript
JQuery实现简单的复选框树形结构图示例【附源码下载】
2019/07/16 jQuery
vue-cli3 取消eslint校验代码的解决办法
2020/01/16 Javascript
原生js实现日历效果
2020/03/02 Javascript
Vue 组件注册全解析
2020/12/17 Vue.js
[53:03]Optic vs TNC 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
几种实用的pythonic语法实例代码
2018/02/24 Python
django 实现编写控制登录和访问权限控制的中间件方法
2019/01/15 Python
关于python导入模块import与常见的模块详解
2019/08/28 Python
python 如何快速复制序列
2020/09/07 Python
一个非常简单好用的Python图形界面库(PysimpleGUI)
2020/12/28 Python
HTML5 Canvas 实现圆形进度条并显示数字百分比效果示例
2017/08/18 HTML / CSS
宝拉珍选英国官网:Paula’s Choice英国
2019/05/29 全球购物
Dyson戴森波兰官网:Dyson.pl
2019/08/05 全球购物
亚马逊海外购:亚马逊美国、英国、日本、德国直邮
2021/03/18 全球购物
综合办公室个人的自我评价
2013/12/22 职场文书
大学生个人事迹材料
2014/01/21 职场文书
平面设计师岗位职责
2014/09/18 职场文书
客服专员岗位职责范本
2015/04/07 职场文书
2016年小学感恩节活动总结
2016/04/01 职场文书
解决mysql模糊查询索引失效问题的几种方法
2021/06/18 MySQL