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 开发Activex组件方法
Nov 08 Python
python扫描proxy并获取可用代理ip的实例
Aug 07 Python
python实现log日志的示例代码
Apr 28 Python
python绘制地震散点图
Jun 18 Python
pandas对dataFrame中某一个列的数据进行处理的方法
Jul 08 Python
TensorFlow加载模型时出错的解决方式
Feb 06 Python
Python爬虫headers处理及网络超时问题解决方案
Jun 19 Python
Python操作Word批量生成合同的实现示例
Aug 28 Python
详解python使用金山词霸的翻译功能(调试工具断点的使用)
Jan 07 Python
python使用numpy中的size()函数实例用法详解
Jan 29 Python
python中操作文件的模块的方法总结
Feb 04 Python
一篇文章弄懂Python关键字、标识符和变量
Jul 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中的内存管理问题
2011/08/31 PHP
php使用cookie保存登录用户名的方法
2015/01/26 PHP
PHP编写学校网站上新生注册登陆程序的实例分享
2016/03/21 PHP
php利用fsockopen GET/POST提交表单及上传文件
2017/05/22 PHP
javascript 读取xml,写入xml 实现代码
2009/07/10 Javascript
JavaScript与DropDownList 区别分析
2010/01/01 Javascript
33个优秀的 jQuery 图片展示插件分享
2012/03/14 Javascript
JS简单的轮播的图片滚动实例
2013/06/17 Javascript
多种方法实现360浏览器下禁止自动填写用户名密码
2014/06/16 Javascript
Javascript学习指南
2014/12/01 Javascript
js实现的全国省市二级联动下拉选择菜单完整实例
2015/08/17 Javascript
微信小程序 数组中的push与concat的区别
2017/01/05 Javascript
详解百度百科目录导航树小插件
2017/01/08 Javascript
基于JavaScript实现购物车功能
2017/02/07 Javascript
JS实现的简单分页功能示例
2018/08/23 Javascript
在layui中layer弹出层点击事件无效的解决方法
2019/09/05 Javascript
uploadify插件实现多个图片上传并预览
2019/09/30 Javascript
微信域名检测接口调用演示步骤(含PHP、Python)
2019/12/08 Javascript
NUXT SSR初级入门笔记(小结)
2019/12/16 Javascript
[01:17]辉夜杯战队访谈宣传片—EHOME
2015/12/25 DOTA
python调用Moxa PCOMM Lite通过串口Ymodem协议实现发送文件
2014/08/15 Python
Python中的生成器和yield详细介绍
2015/01/09 Python
Python聚类算法之DBSACN实例分析
2015/11/20 Python
浅谈python numpy中nonzero()的用法
2018/04/02 Python
python抓取网页内容并进行语音播报的方法
2018/12/24 Python
PyInstaller将Python文件打包为exe后如何反编译(破解源码)以及防止反编译
2020/04/15 Python
python 比较字典value的最大值的几种方法
2020/04/17 Python
沙特阿拉伯网上购物:Sayidaty Mall
2018/05/06 全球购物
Yves Rocher捷克官方网站:植物化妆品的创造者
2019/07/31 全球购物
澳大利亚礼品篮网站:Macarthur Baskets
2019/10/14 全球购物
BannerBuzz加拿大:在线定制横幅印刷、广告和标志
2020/03/10 全球购物
《七颗钻石》教学反思
2014/02/28 职场文书
主题团日活动总结
2014/06/25 职场文书
教师对照四风自我剖析材料
2014/09/30 职场文书
交通事故被告答辩状
2015/05/22 职场文书
强烈推荐:小学生:暑假作息时间表(值得收藏)
2019/07/09 职场文书