实战:战狼2票房数据分析——(1)数据获取及解析

前言

战狼最近大火,为了紧跟热度,根据之前学的做一个关于战狼2票房售卖情况的数据分析。

要做数据分析,首先要有数据,数据从哪儿来呢?

网上有专门做票房时时统计的网站,他们会把最新的票发信息公布在网上,但是数据是以网页的方式呈现,而不是直接给你,所以我们需要做的就是先把网上的数据爬下来。

猫眼票房数据网址
https://piaofang.maoyan.com/?date=2017-08-01

网页截图如下:

这里写图片描述

可以看到url中有一个data参数,可以根据传入日期来获取指定日期的票房数据

数据获取

python中可以通过引用urllib包来进行网页信息的抓取,在通过对网页结果分析来筛选出想要的数据。

获取网页源文件

首先引用两个包,再定义一个变量,将要抓取的url地址进行赋值

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

import urllib

url = 'https://piaofang.maoyan.com/?date=2017-08-01'

构造一个方法用于获取网页的源代码

def getHtml(url):
    page = urllib.urlopen(url)
    html = page.read()
    return html

当我们执行以下代码时,我们会在控制台中看到该网页的所有源代码

html = getHtml(url)
print html

运行结果如下

runfile('C:/Users/Administrator/.spyder2/temp.py', wdir='C:/Users/Administrator/.spyder2')
<!DOCTYPE html>
<html>
  <head>
    <title>猫眼专业版-实时票房</title>
    <!--// dns prefetch -->
    <link rel="dns-prefetch" href="//analytics.meituan.com" />
    <link rel="dns-prefetch" href="//ms0.meituan.net" />
    <link rel="dns-prefetch" href="//mc.meituan.net" />
    <link rel="dns-prefetch" href="//s0.meituan.net" />
    <link rel="dns-prefetch" href="//p0.meituan.net" />
    <link rel="dns-prefetch" href="//p1.meituan.net" />
    <!--// meta section -->
    <meta charset="utf-8">
    <meta name="keywords" content="猫眼票房分析,猫眼电影,电影票房,实时票房,日票房,预售票房,影片票房趋势,受众画像,实时排片,预售排片,上座率,历史票房" />
    <meta name="description" content="猫眼票房分析,提供最准确的每日电影实时票房、排片、上座率查询,为电影从业者提供最及时、专业的数据分析服务" />
    <meta http-equiv="cleartype" content="yes" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta http-equiv="Cache-Control" CONTENT="no-cache" />
    <meta http-equiv="Pragma" CONTENT="no-cache" />
    <meta http-equiv="cache-control" CONTENT="no-store" />
    <meta name="format-detection" content="telephone=no" />
    <meta name="renderer" content="webkit">
    <link rel="icon" type="image/x-icon" href="//ms0.meituan.net/piaofang/img/favicon.ico" />
    .....
    <script src="//ms0.meituan.net/piaofang/react/stat-6135315b.js" async></script>

    <script src="//ms0.meituan.net/piaofang/react/felis-25543cb1.js" async></script>

  </body>
</html>

这其实就是我们通过浏览器能查看到的源文件。但是我们会发现这个网页的源文件并不是我们想要的链接的源文件,而是该网站进行了后台处理,直接访问该链接后会被定向至票房首页。所以这里通过爬取网页源文件来获取数据的方式就行不通了。

找到数据接口

由于现在的网页基本都是动态网页,其数据都是通过后台服务进行获取的,所以我们想办法找到他对应的数据接口直接获取数据就行了。

那么我们继续用数据点击的方式进入到https://piaofang.maoyan.com/?date=2017-08-01这个网址,然后打开开发者工具,选择Network标签页,对网页进行抓包。

这里写图片描述

这个时候,将监听窗口的滚动条拖至最底部,然后在网页上选择一个时间,来查看他脚本执行情况。

这里写图片描述

我们选择2017年8月2日,这个时候网页判定到日期发生改变,需要重新获取数据,就会去调用它的数据接口,我们在监听窗口里就会发现它。

这里写图片描述

我们会发现这么一条记录,传递了时间参数,且为我们指定的日期2017-08-02

我们访问这个地址,再看它的详细信息,发现确实是我们想要的数据。返回的是一个json结果集。

这里写图片描述

我们修改它的时间参数,发现它也能正常运行,并返回相应的结果。

编写我们的代码,将数据获取:

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

import urllib
import json

url = 'https://piaofang.maoyan.com/dayoffice?date=2017-08-01'

def getData(url):
    page = urllib.urlopen(url)
    data = page.read()
    return data

if __name__ == "__main__":
    data = getData(url)
    print data

执行后,我们会看到数据已经被获取

runfile('C:/Users/Administrator/.spyder2/temp.py', wdir='C:/Users/Administrator/.spyder2')
{"ticketDesc":"<div class='logo'>\n    <span id=\"dayStr\" class=\"today\">\n        2017-08-01\n        周二\n    </span>\n    <span>大盘:</span>\n    <span id='ticket_count'><i class=\"cs\">&#xe8ce;&#xe8ce;&#xe003;&#xf852;&#xefde;.&#xe948;万</i></span>\n</div>\n<div id=\"dayTips\" class=\"update\">北京时间每天10点更新票房</div>\n","ticketList":"    <ul class=\"canTouch\" data-com=\"hrefTo,href:'/movie/344264?_v_=yes'\">\n    <li class='c1'>\n        <b>战狼2</b>\n        <br><em>上映6天</em><em style=\"margin-left: .1rem\"><i class=\"cs\">&#xefde;&#xe112;.&#xed2e;&#xebaf;亿</i></em>\n    </li>\n    <li class=\"c2 \">\n        <b><i class=\"cs\">&#xebaf;&#xe003;&#xebaf;&#xe027;&#xe003;.&#xe027;&#xe8ce;</i></b><br/>\n    </li>\n    <li class=\"c3 \"><i class=\"cs\">&#xe948;&#xed2e;.&#xe8ce;%</i></li>\n    <li class=\"c4 \">\n            <i class=\"cs\">&#xe112;&#xed2e;.&#xe027;%</i>\n    </li>\n    <li class=\"c5 \">\n        <span style=\"margin-right:-.1rem\">\n                <i class=\"cs\">&#xe027;&#xebaf;.&#xe027;%</i>\n        </span>\n        <span style=\"padding-right:.24rem\" class=\"_more\"></span>\n    </li>\n    <li class=\"solid\">\n        <b>战狼2</b>\n        <br><em>上映6天</em>\n    </li>\n    </ul>\n    <ul class=\"canTouch\" data-com=\"hrefTo,href:'/movie/345011?_v_=yes'\">\n    <li class='c1'>\n        <b>建军大业</b>\n        <br><em>上映6天</em><em style=\"margin-left: .1rem\"><i class=\"cs\">&#xebaf;.&#xed2e;&#xe8ce;亿</i></em>\n    </li>\n    <li class=\"c2 \">\n        <b><i class=\"cs\">&#xe8ce;&#xebaf;&#xe027;&#xe948;.&#xebaf;&#xe003;</i></b><br/>\n    </li>\n    <li class=\"c3 \"><i class=\"cs\">&#xe003;.&#xed2e;%</i></li>\n    <li class=\"c4 \">\n            <i

数据解析

数据得到了,但是会有很多我们不需要的数据,我们就要对他进行解析,挖出我们需要的数据。

我们将得到的Json数据复制到在线解析平台去查看下他的内容:

这里写图片描述

发现在ticketList里面的书就是我们想要的网页表格数据,但他的形式是html的,而不是数据形式,所以我们还要对html的内容进行解析。那么首先要将Html内容从Json里获取出来,于是新增方法:

def getHtml(jsonData):
    data = json.loads(jsonData)
    return data['ticketList'].encode('utf-8').replace('\n', '')

if __name__ == "__main__":
    data = getData(url)
    getHtml(data)

执行后,发现我们成功得到了Html内容,并将内容中多余的\n去掉。

In [401]: runfile('C:/Users/Administrator/.spyder2/temp.py', wdir='C:/Users/Administrator/.spyder2')
    <ul class="canTouch" data-com="hrefTo,href:'/movie/344264?_v_=yes'">    <li class='c1'>        <b>战狼2</b>        <br><em>上映6天</em><em style="margin-left: .1rem"><i class="cs">&#xe5d6;&#xf1bd;.&#xe2c0;&#xe3fb;亿</i></em>    </li>    <li class="c2 ">        <b><i class="cs">&#xe3fb;&#xf381;&#xe3fb;&#xe184;&#xf381;.&#xe184;&#xeb3d;</i></b><br/>    </li>    <li class="c3 "><i class="cs">&#xf6e7;&#xe2c0;.&#xeb3d;%</i></li>    <li class="c4 ">            <i class="cs">&#xf1bd;&#xe2c0;.&#xe184;%</i>    </li>    <li class="c5 ">        <span style="margin-right:-.1rem">                <i class="cs">&#xe184;&#xe3fb;.&#xe184;%</i>        </span>        <span style="padding-right:.24rem" class="_more"></span>    </li>    <li class="solid">        <b>战狼2</b>        <br><em>上映6天</em>    </li>    </ul>    <ul class="canTouch" data-com="hrefTo,href:'/movie/345011?_v_=yes'">    <li class='c1'>        <b>建军大业</b>        <br><em>上映6天</em><em style="margin-left: .1rem"><i class="cs">&#xe3fb;.&#xe2c0;&#xeb3d;亿</i></em>    </li>    <li class="c2 ">        <b><i class="cs">&#xeb3d;&#xe3fb;&#xe184;&#xf6e7;.&#xe3fb;&#xf381;</i></b><br/>    </li>    <li class="c3 "><i class="cs">&#xf381;.&#xe2c0;%</i></li>    <li class="c4 ">            <i class="cs">&#xe3fb;&#xe3fb;.&#xeb3d;%</i>    </li>    <li class="c5 ">        <span style="margin-right:-.1rem">                <i class="cs">&#xe5d6;&#xf381;.&#xeb3d;%</i>        </span>        <span style="padding-right:.24rem" class="_more"></span>    </li>    <li class="solid">        <b>建军大业</b>        <br><em>上映6天</em>    </li>    </ul>    <ul class="canTouch" data-com="hrefTo,href:'/movie/249900?_v_=yes'">    <li class='c1'>        <b>神偷奶爸3</b>        <br><em>上映26天</em><em style="margin-left: .1rem"><i class="cs">&#xf381;.&#xf381;&#xef2a;亿</i></em>    </li>    <li class="c2 ">        <b><i class="cs">&#xe184;&#xe2c0;&#xe184;.&#xe2c0;&#xef2a;</i></b><br/>    </li>    <li class="c3 "><i class="cs">&#xe5d6;.&#xe184;%</i></li>    <li class="c4 ">            <i class="cs">&#xe184;.&#xef2a;%</i>    </li>    <li class="c5 ">        <span style="margin-right:-.1rem">                <i class="cs">&#xe5d6;&#xeb3d;.&#xef2a;%</i>        </span>        <span style="padding-right:.24rem" class="_more"></span>    </li>    <li class="solid">        <b>神偷奶爸3</b>        <br><em>上映26天</em>    </li>    </ul>    <ul class="canTouch" data-com="hrefTo,href:'/movie/345972?_v_=yes'">    <li class='c1'>        <b>大耳朵图图之美食狂想曲</b>        <br><em>上映5天</em><em style="margin-left: .1rem"><i class="cs">&#xe3fb;&#xe2c0;&#xe3fb;&#xf1bd;.&#xeb3d;万</i></em>    </li>    <li class="c2 ">        <b><i class="cs">&#xe3fb;&#xe3fb;&#xf1bd;.&#xe2c0;&#xe5d6;</i></b><br/>    </li>    <li class="c3 "><i class="cs">&#xe56b;.&#xef2a;%</i></li>    <li class="c4 ">            <i class="cs">&#xeb3d;.&#xf381;%</i>    </li>    <li class="c5 ">        <span style="margin-right:-.1rem">                <i class="cs">&#xe5d6;&#xe56b;.&#xe56b;%</i>        </span>        <span
......

现在我们要做的就是解析这个Html获取我们需要的数据了。我们可以发现数据的规律是,电影存放在ul中,而每一个数据单独存放于li中的,于是需要用到正则表达式进行解析。

添加解析方法:

def parseHtml(html):
    reg = r"<ul.+?>.+?<li class='c1'>.+?<b>(.+?)</b>"
    pattern = re.compile(reg)
    movieList = re.findall(pattern, html)

    for movie in movieList:
        print movie

if __name__ == "__main__":
    data = getData(url)
    html = getHtml(data)
    print parseHtml(html)

首先尝试将电影名称解析出来,我们发现电影名称在class=’c1’的li中,执行代码后结果如下:

In [341]: runfile('C:/Users/Administrator/.spyder2/temp.py', wdir='C:/Users/Administrator/.spyder2')
战狼2
建军大业
神偷奶爸3
大耳朵图图之美食狂想曲
绣春刀II:修罗战场
闪光少女
悟空传
豆福传
父子雄兵
大护法
阿唐奇遇
夜半凶铃
血战湘江
京城81号II
绿野仙踪之奥兹国奇幻之旅
深夜食堂2
地球:神奇的一天
冈仁波齐
李三娘
喵星人
战狼
鲛珠传
阳光萌星社
我是马布里
重返·狼群
None

可以看到已经成功将电影名解析出来了,继续修改解析方法中的正则表达式,将其余信息都抓取出来:

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

import urllib
import json
import re

url = 'https://piaofang.maoyan.com/dayoffice?date=2017-08-01&cnt=10'

def getData(url):
    page = urllib.urlopen(url)
    data = page.read()
    return data

def getHtml(jsonData):
    data = json.loads(jsonData)
    return data['ticketList'].encode('utf-8').replace('\n', '')

def parseHtml(html):
    reg = r"<ul.+?>.+?<li class='c1'>.+?<b>(.+?)</b>.+?\<li class=\"c2.+?<b>"
    reg += "<i class=\"cs\">(.+?)</i></b>.+?\<li class=\"c3.+?<b><i class=\"cs\">"
    reg += "(.+?)</i></b>.+?\<li class=\"c4.+?<i class=\"cs\">(.+?)</i>.+?\<li "
    reg += "class=\"c5.+?<i class=\"cs\">(.+?)</i>"
    pattern = re.compile(reg)
    movieList = re.findall(pattern, html)

    return movieList


if __name__ == "__main__":
    data = getData(url)
    html = getHtml(data)
    movieList = parseHtml(html)

执行后,我们选择打印movieList,我们发现所有的数据已经被取出来了

In [6]: movieList
Out[6]: 
[('\xe6\x88\x98\xe7\x8b\xbc2',
  '&#xf779;&#xeda0;&#xf779;&#xe24a;&#xeda0;.&#xe24a;&#xe0ef;',
  '&#xe0ef;&#xf779;&#xe24a;&#xef23;.&#xf779;&#xeda0;',
  '&#xf779;&#xf779;.&#xe0ef;%',
  '&#xf489;&#xeda0;.&#xe0ef;%'),
 ('\xe7\xa5\x9e\xe5\x81\xb7\xe5\xa5\xb6\xe7\x88\xb83',
  '&#xe24a;&#xecbc;&#xe24a;.&#xecbc;&#xe19d;',
  '&#xf779;&#xf779;&#xe3e5;.&#xecbc;&#xf489;',
  '&#xe0ef;.&#xeda0;%',
  '&#xf489;&#xed2f;.&#xed2f;%'),
 ('\xe7\xbb\xa3\xe6\x98\xa5\xe5\x88\x80II\xef\xbc\x9a\xe4\xbf\xae\xe7\xbd\x97\xe6\x88\x98\xe5\x9c\xba',
  '&#xf489;&#xef23;&#xecbc;.&#xed2f;&#xe19d;',
  '&#xf489;&#xe0ef;&#xe19d;.&#xe3e5;&#xecbc;',
  '&#xf489;.&#xe24a;%',
  '&#xf489;&#xe3e5;.&#xecbc;%'),
 ('\xe6\x82\x9f\xe7\xa9\xba\xe4\xbc\xa0',
  '&#xf489;&#xe0ef;&#xed2f;.&#xef23;&#xe0ef;',
  '&#xecbc;&#xecbc;.&#xeda0;&#xed2f;',
  '&#xf779;.&#xef23;%',
  '&#xecbc;.&#xeda0;%'),
 ('\xe7\x88\xb6\xe5\xad\x90\xe9\x9b\x84\xe5\x85\xb5',
  '&#xe24a;&#xe24a;.&#xeda0;&#xecbc;',
  '&#xf779;&#xeda0;.&#xeda0;&#xed2f;',
  '&#xed2f;.&#xe24a;%',
  '&#xf489;&#xed2f;.&#xe3e5;%'),
 ('\xe9\x98\xbf\xe5\x94\x90\xe5\xa5\x87\xe9\x81\x87',
  '&#xf779;&#xe0ef;.&#xe19d;&#xe19d;',
  '&#xf489;&#xe19d;.&#xecbc;&#xecbc;',
  '&#xed2f;.&#xe19d;%',
  '&#xeda0;.&#xf489;%'),
 ('\xe8\xa1\x80\xe6\x88\x98\xe6\xb9\x98\xe6\xb1\x9f',
  '&#xf489;&#xe19d;.&#xf779;&#xecbc;',
  '&#xeda0;.&#xe19d;&#xe24a;',
  '&#xed2f;.&#xf779;%',
  '&#xeda0;.&#xe0ef;%'),
 ('\xe7\xbb\xbf\xe9\x87\x8e\xe4\xbb\x99\xe8\xb8\xaa\xe4\xb9\x8b\xe5\xa5\xa5\xe5\x85\xb9\xe5\x9b\xbd\xe5\xa5\x87\xe5\xb9\xbb\xe4\xb9\x8b\xe6\x97\x85',
  '&#xe19d;.&#xe24a;&#xed2f;',
  '&#xe19d;.&#xe0ef;&#xe24a;',
  '&#xed2f;.&#xf489;%',
  '&#xf489;&#xf779;.&#xf489;%'),
 ('\xe5\x9c\xb0\xe7\x90\x83\xef\xbc\x9a\xe7\xa5\x9e\xe5\xa5\x87\xe7\x9a\x84\xe4\xb8\x80\xe5\xa4\xa9',
  '&#xe24a;.&#xf779;&#xe3e5;',
  '&#xe24a;.&#xed2f;&#xe24a;',
  '&#xed2f;.&#xf489;%',
  '&#xf489;&#xf779;.&#xf779;%'),
 ('\xe6\x9d\x8e\xe4\xb8\x89\xe5\xa8\x98',
  '&#xf779;.&#xf779;&#xecbc;',
  '&#xf779;.&#xed2f;&#xecbc;',
  '&#xed2f;.&#xf489;%',
  '&#xf489;&#xed2f;.&#xf489;%'),
 ('\xe6\x88\x98\xe7\x8b\xbc',
  '&#xf489;.&#xe19d;&#xe3e5;',
  '&#xf489;.&#xe19d;&#xe0ef;',
  '&#xed2f;.&#xed2f;%',
  '&#xf489;&#xed2f;&#xed2f;%'),
 ('\xe9\x98\xb3\xe5\x85\x89\xe8\x90\x8c\xe6\x98\x9f\xe7\xa4\xbe',
  '&#xf489;.&#xecbc;&#xe24a;',
  '&#xf489;.&#xecbc;&#xed2f;',
  '&#xed2f;.&#xed2f;%',
  '&#xe19d;&#xecbc;.&#xe19d;%')]

但是出来的数字是经过了加密的,切密钥会隔一段时间就换。OMG,又要想办法了。

再次来到浏览器的开发工具查看该接口的response返回结果
这里写图片描述

我们发现这里显示的是数字,这是网页调用返回的结果,而直接通过url访问接口就会出现乱码。两者的区别在于网页调用会传递一些头部信息,说明你是普通用户。但是直接url访问就不会有头信息,系统会认为你是非法用户所以对数据进行了加密处理。

那么测试一下,想法是否正确,我们来将头部信息传递给服务器,伪装成用户去访问接口:

这里写图片描述

在开发者工具里可以看到通过浏览器访问所传递的头信息

代码头部增加一个引用

import requests

再增加一个测试方法

def getData1(url):
    headers={
        "authority": "piaofang.maoyan.com",
        "method": "GET",
        "path": "/dayoffice?date=2017-08-01&cnt=10",
        "scheme": "https",
        "accept": "*/*",
        "accept-encoding": "gzip, deflate, br",
        "accept-language": "zh-CN,zh;q=0.8",
        "referer": "https://piaofang.maoyan.com/?date=2017-08-01",
        "uid": "e4e5902fc42ad5e198b207d76af1d82e7056cb82",
        "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36",
        "x-requested-with": "XMLHttpRequest"
    }
    req = requests.get(url, headers=headers)
    print req.content

调用该测试方法

if __name__ == "__main__":
    #data = getData(url)
    #html = getHtml(data)
    #movieList = parseHtml(html)
    getData1(url)

返回结果如下

runfile('C:/Users/Administrator/.spyder2/temp.py', wdir='C:/Users/Administrator/.spyder2')
{"ticketDesc":"<div class='logo'>\n    <span id=\"dayStr\" class=\"today\">\n        2017-08-01\n        周二\n    </span>\n    <span>大盘:</span>\n    <span id='ticket_count'>33901.8万</span>\n</div>\n<div id=\"dayTips\" class=\"update\">北京时间每天10点更新票房</div>\n","ticketList":"    <ul class=\"canTouch\" data-com=\"hrefTo,href:'/movie/344264?_v_=yes'\">\n    <li class='c1'>\n        <b>战狼2</b>\n        <br><em>上映6天</em><em style=\"margin-left: .1rem\">15.62亿</em>\n    </li>\n    <li class=\"c2 \">\n        <b>29249.43</b><br/>\n    </li>\n    <li class=\"c3 \">86.3%</li>\n    <li class=\"c4 \">\n            56.4%\n    </li>\n    <li class=\"c5 \">\n        <span style=\"margin-right:-.1rem\">\n                42.4%\n        </span>\n        <span style=\"padding-right:.24rem\" class=\"_more\"></span>\n    </li>\n    <li class=\"solid\">\n        <b>战狼2</b>\n        <br><em>上映6天</em>\n    </li>\n    </ul>\n    <ul class=\"canTouch\" data-com=\"hrefTo,href:'/movie/345011?_v_=yes'\">\n    <li class='c1'>\n        <b>建军大业</b>\n        <br><em>上映6天</em><em style=\"margin-left: .1rem\">2.63亿</em>\n    </li>\n    <li class=\"c2 \">\n        <b>3248.29</b><br/>\n    </li>\n    <li class=\"c3 \">9.6%</li>\n    <li class=\"c4 \">\n            22.3%\n    </li>\n    <li class=\"c5 \">\n        <span style=\"margin-right:-.1rem\">\n                19.3%\n        </span>\n        <span style=\"padding-right:.24rem\" class=\"_more\"></span>\n    </li>\n    <li class=\"solid\">\n        <b>建军大业</b>\n        <br><em>上映6天</em>\n    </li>\n    </ul>\n    <ul class=\"canTouch\" data-com=\"hrefTo,href:'/movie/249900?_v_=yes'\">\n    <li class='c1'>\n        <b>神偷奶爸3</b>\n        <br><em>上映26天</em><em style=\"margin-left: .1rem\">9.97亿</em>\n    </li>\n    <li class=\"c2 \">\n        <b>464.67</b><br/>\n    </li>\n    <li class=\"c3 \">1.4%</li>\n    <li class=\"c4 \">\n            4.7%\n    </li>\n    <li class=\"c5 \">\n        <span style=\"margin-right:-.1rem\">\n                13.7%\n        </span>\n        <span style=\"padding-right:.24rem\" class=\"_more\"></span>\n    </li>\n    <li class=\"solid\">\n        <b>神偷奶爸3</b>\n        <br><em>上映26天</em>\n    </li>\n    </ul>\n    <ul class=\"canTouch\" data-com=\"hrefTo,href:'/movie/345972?_v_=yes'\">\n    <li class='c1'>\n        <b>大耳朵图图之美食狂想曲</b>\n        <br><em>上映5天</em><em style=\"margin-left: .1rem\">2625.3万</em>\n    </li>\n    <li class=\"c2 \">\n        <b>225.61</b><br/>\n    </li>\n    <li class=\"c3 \">0.7%</li>\n    <li class=\"c4 \">\n            3.9%\n    </li>\n    <li class=\"c5 \">\n        <span style=\"margin-right:-.1rem\">\n                10.0%\n        </span>\n        <span style=\"padding-right:.24rem\" class=\"_more\"></span>\n    </li>\n    <li class=\"solid\">\n        <b>大耳朵图图之美食狂想曲</b>\n        <br><em>上映5天</em>\n    </li>\n    </ul>\n    <ul class=\"canTouch\" data-com=\"hrefTo,href:'/movie/341189?_v_=yes'\">\n    <li class='c1'>\n        <b>绣春刀II:修罗战场</b>\n        <br><em>上映14

可以看到,乱码成功的显示成了数字。

那么可以修改代码了,将GetData替换为以上方法。代码调整如下:

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

import urllib
import json
import re
import requests

url = 'https://piaofang.maoyan.com/dayoffice?date=2017-08-01&cnt=10'

def getHtml(jsonData):
    data = json.loads(jsonData)
    return data['ticketList'].encode('utf-8').replace('\n', '').replace(' ','')

def parseHtml(html):
    reg = r"<ul.+?><liclass='c1'><b>(.+?)</b>.+?</li>"
    reg += r"<liclass=\"c2\"><b>(.+?)</b>.+?</li>"
    reg += r"<liclass=\"c3\">(.+?)</li>"
    reg += r"<liclass=\"c4\">(.+?)</li>"
    reg += r"<liclass=\"c5\"><spanstyle=\"margin-right:-.1rem\">(.+?)</span>"

    pattern = re.compile(reg)
    movieList = re.findall(pattern, html)

    return movieList


def getData(url):
    headers={
        "authority": "piaofang.maoyan.com",
        "method": "GET",
        "path": "/dayoffice?date=2017-08-01&cnt=10",
        "scheme": "https",
        "accept": "*/*",
        "accept-encoding": "gzip, deflate, br",
        "accept-language": "zh-CN,zh;q=0.8",
        "referer": "https://piaofang.maoyan.com/?date=2017-08-01",
        "uid": "e4e5902fc42ad5e198b207d76af1d82e7056cb82",
        "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36",
        "x-requested-with": "XMLHttpRequest"
    }
    req = requests.get(url, headers=headers)
    return req.content


if __name__ == "__main__":
    data = getData(url)
    html = getHtml(data)
    movieList = parseHtml(html)

输出结果为:

runfile('C:/Users/Administrator/.spyder2/temp.py', wdir='C:/Users/Administrator/.spyder2')

movieList
Out[7]: 
[('\xe6\x88\x98\xe7\x8b\xbc2', '29249.43', '86.3%', '56.4%', '42.4%'),
 ('\xe5\xbb\xba\xe5\x86\x9b\xe5\xa4\xa7\xe4\xb8\x9a',
  '3248.29',
  '9.6%',
  '22.3%',
  '19.3%'),
 ('\xe7\xa5\x9e\xe5\x81\xb7\xe5\xa5\xb6\xe7\x88\xb83',
  '464.67',
  '1.4%',
  '4.7%',
  '13.7%'),
 ('\xe5\xa4\xa7\xe8\x80\xb3\xe6\x9c\xb5\xe5\x9b\xbe\xe5\x9b\xbe\xe4\xb9\x8b\xe7\xbe\x8e\xe9\xa3\x9f\xe7\x8b\x82\xe6\x83\xb3\xe6\x9b\xb2',
  '225.61',
  '0.7%',
  '3.9%',
  '10.0%'),
 ('\xe7\xbb\xa3\xe6\x98\xa5\xe5\x88\x80II\xef\xbc\x9a\xe4\xbf\xae\xe7\xbd\x97\xe6\x88\x98\xe5\x9c\xba',
  '186.07',
  '0.5%',
  '3.0%',
  '11.4%'),
 ('\xe9\x97\xaa\xe5\x85\x89\xe5\xb0\x91\xe5\xa5\xb3',
  '137.56',
  '0.4%',
  '1.4%',
  '15.6%'),
 ('\xe6\x82\x9f\xe7\xa9\xba\xe4\xbc\xa0', '130.83', '0.4%', '2.2%', '10.2%'),
 ('\xe8\xb1\x86\xe7\xa6\x8f\xe4\xbc\xa0', '66.90', '0.2%', '2.8%', '6.9%'),
 ('\xe7\x88\xb6\xe5\xad\x90\xe9\x9b\x84\xe5\x85\xb5',
  '44.96',
  '0.1%',
  '0.9%',
  '11.4%'),
 ('\xe5\xa4\xa7\xe6\x8a\xa4\xe6\xb3\x95', '29.90', '0.1%', '0.4%', '10.5%'),
 ('\xe9\x98\xbf\xe5\x94\x90\xe5\xa5\x87\xe9\x81\x87',
  '23.77',
  '0.1%',
  '0.5%',
  '9.8%'),
 ('\xe5\xa4\x9c\xe5\x8d\x8a\xe5\x87\xb6\xe9\x93\x83',
  '17.66',
  '0.1%',
  '0.7%',
  '9.1%'),
 ('\xe8\xa1\x80\xe6\x88\x98\xe6\xb9\x98\xe6\xb1\x9f',
  '17.26',
  '0.1%',
  '0.0%',
  '64.3%'),
 ('\xe4\xba\xac\xe5\x9f\x8e81\xe5\x8f\xb7II', '9.74', '0.0%', '0.2%', '9.3%'),
 ('\xe7\xbb\xbf\xe9\x87\x8e\xe4\xbb\x99\xe8\xb8\xaa\xe4\xb9\x8b\xe5\xa5\xa5\xe5\x85\xb9\xe5\x9b\xbd\xe5\xa5\x87\xe5\xb9\xbb\xe4\xb9\x8b\xe6\x97\x85',
  '7.40',
  '0.0%',
  '0.2%',
  '6.9%'),
 ('\xe6\xb7\xb1\xe5\xa4\x9c\xe9\xa3\x9f\xe5\xa0\x822',
  '7.34',
  '0.0%',
  '0.1%',
  '12.1%'),
 ('\xe5\x9c\xb0\xe7\x90\x83\xef\xbc\x9a\xe7\xa5\x9e\xe5\xa5\x87\xe7\x9a\x84\xe4\xb8\x80\xe5\xa4\xa9',
  '4.25',
  '0.0%',
  '0.0%',
  '100%'),
 ('\xe5\x86\x88\xe4\xbb\x81\xe6\xb3\xa2\xe9\xbd\x90',
  '4.04',
  '0.0%',
  '0.1%',
  '12.2%'),
 ('\xe6\x9d\x8e\xe4\xb8\x89\xe5\xa8\x98', '2.26', '0.0%', '0.0%', '70.2%'),
 ('\xe5\x96\xb5\xe6\x98\x9f\xe4\xba\xba', '2.06', '0.0%', '0.1%', '10.1%'),
 ('\xe6\x88\x98\xe7\x8b\xbc', '1.75', '0.0%', '0.0%', '5.5%'),
 ('\xe9\xb2\x9b\xe7\x8f\xa0\xe4\xbc\xa0', '1.73', '0.0%', '0.0%', '100%'),
 ('\xe9\x98\xb3\xe5\x85\x89\xe8\x90\x8c\xe6\x98\x9f\xe7\xa4\xbe',
  '1.64',
  '0.0%',
  '0.0%',
  '69.4%'),
 ('\xe6\x88\x91\xe6\x98\xaf\xe9\xa9\xac\xe5\xb8\x83\xe9\x87\x8c',
  '1.60',
  '0.0%',
  '0.0%',
  '76.7%'),
 ('\xe9\x87\x8d\xe8\xbf\x94\xc2\xb7\xe7\x8b\xbc\xe7\xbe\xa4',
  '1.59',
  '0.0%',
  '0.0%',
  '9.5%')]

数据获取及解析搞定。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值