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

前言

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

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

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

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

网页截图如下:

这里写图片描述

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

数据获取

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

获取网页源文件

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

#-*- coding: utf-8 -*-import urlliburl = '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 urllibimport jsonurl = 'https://piaofang.maoyan.com/dayoffice?date=2017-08-01'def getData(url): page = urllib.urlopen(url) data = page.read() return dataif __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 movieif __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 urllibimport jsonimport reurl = 'https://piaofang.maoyan.com/dayoffice?date=2017-08-01&cnt=10'def getData(url): page = urllib.urlopen(url) data = page.read() return datadef 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 movieListif __name__ == "__main__": data = getData(url) html = getHtml(data) movieList = parseHtml(html)

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

In [6]: movieListOut[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 urllibimport jsonimport reimport requestsurl = '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 movieListdef 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.contentif __name__ == "__main__": data = getData(url) html = getHtml(data) movieList = parseHtml(html)

输出结果为:

runfile('C:/Users/Administrator/.spyder2/temp.py', wdir='C:/Users/Administrator/.spyder2')movieListOut[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%')]

数据获取及解析搞定。

相关推荐

相关文章