影片数据爬取与分析_第1页
影片数据爬取与分析_第2页
影片数据爬取与分析_第3页
影片数据爬取与分析_第4页
影片数据爬取与分析_第5页
已阅读5页,还剩24页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

爬取豆瓣、猫眼、淘票票等网站上《我不是药神》的信息并用Pvthon进行分析。

《我不是药神》是由文牧野执导,徐峥、王传君、周一围、谭卓、章宇、杨新鸣

等主演的喜剧电影,于2018年7月6日在中国上映。

影片在上映前,大规模的点映积攒了相当高的人气和口碑,截止7月9日凌

晨:豆瓣评分:9.0分,猫眼:9.7分,淘票票:9.5分,时光网:8.8分。

为什么我说这三个网站呢,因为我们今天近5000+条短评数据就来自于此,用

专业的数据更有说服力。

《我不是药神》也评数据情况

0268

综合几家的数据:五星推荐如此之高,生活环境是真实的,情绪是真实的,困境

也是真实的,甚至女主角是一个真实的上了年纪的美女,有真实的皱纹!真实才

能带来沉浸体验。表面说的是药,深层说的是命。

药能治病,命却不由自主,直面中国底层生命的苦难和尊严,也没有逃避对社会

制度和商业法则的拷问,这是影片锲入中国现实的关键,也是引发大众共鸣的核

心。

盛世危言,却让人能看到希望,这部影片极有可能成为2018年最具有爆炸性的

话题。这也许就是未播先火,豆瓣16年后首部9.0高分电影的原因。

今天我们用5000+条数据来分析一下,哪些地区,什么样的人,喜欢这部电影。

程勇只是个卖印度神油的小贩,日子过的还凑合。老爹血管瘤急着做手术,住院

没钱,妻子要带儿子移民去国外发展,靠卖印度神油挣来的钱连水电费都交不起,

处处都需要钱。

神秘男子吕受益找到程勇,让他从印度帮忙代购一款药物。吕受益患有血液癌症,

需要长期服用抗癌药物进行治疗。

正版药“瑞士格列宁”非常昂贵,普通人家根本供应不起,但在印度有一款仿制药”

印度格列宁“价格却只有1/20,但在中国是属于禁药,走私被抓,是需要负法律

责任的。

在巨大利益的驱使下,思慧,神父,黄毛先后出场,卖药五人组团建成功,他成

为一名“药贩子”。

对于病友来说,他们拥有了活下去的机会,纷纷给程勇送锦旗,自此称其为“药

神”。

代购的药出现问题,假药贩子张长林的出现威胁程勇,怕被抓,卖药组正式散伙。

程勇开了工厂,吕受益死,张长林跑路,让程勇完成第一次蜕变,许多病人无药

可吃,程勇再次去印度并重新团建卖药。

警方严打假药贩子,张长林被抓。警方发现程勇窝点,黄毛为了掩护程勇而死,

让他完成第二次蜕变。

以赔本价继续代购印度药,送儿子移民,晚上卖药被警察抓。三年后出狱,外面

已是改天换地。

《我不是药神》的现实意义大于电影本身,许多人评论这部电影都有些扬眉吐气

的感觉,大家都在做一个中国电影终于敢说真话的梦。

截止7月9日凌晨,累积票房超过13个亿,占当天票房近84%。

实时票房

金・翼史2・

阿飞工与

99^

IBMM430

*之■

057011401710o2.2802.850

«»米》:喜粤胤结客1条号/冲叼瘫派

哪些地区贡献的票房更多一些?

如这张图片动态展示的情况,你会发现贡献最多的还是:北京、上海、广州,二

线城市同样成为票房的贡献者。

从画像来看,更趋于中年,油腻的中年,人人都怕老病死,人人都怕上下为难,

人人都有为谋生计不得不做的事情,人人亦都向往真与善……是这些时刻集中起

来让煽情的《药神》不那么脱离现实。

T

从数据上来看评论:

好看,现实,好片,感人,泪点,作品很棒

,领导,我求求你,别再查“假药”了行么。这药假不假,我们这些吃的人还不知

道么?”

“我吃了三年正版药,房子吃没了,家也吃垮了。现在好不容易有了便宜药,可

你们非说这是“假药不吃药,我们就只能等死。”

《我不是药神》戳中的是每个人的痛点,谁能保证这一辈子自己和家人不生病

呢?

一旦遇上大病,动辄上万的高昂医药费让普通人家根本无力承担。一人生病,全

家拖垮,真不是危言耸听。

回归技术:分享一下我们如何获取的数据

首先是豆瓣,豆瓣自从去年10月份已经全面禁止爬取数据,仅仅放出500条

数据,豆瓣封IP,白天一分钟可以访问40次,晚上一分钟可以访问60次,

超过限制次数就会封IP。

importurllib

importrequests

fromurllibimportrequest

irrporttime

header={*User-Agent':'Mozflla/5.0(WindowsNT10.0;Win32;x32;rv54.0)

Gecko/20100101Firefox/54.0;

Connection':'keep-alive*}

cookies='v=3;

iuuid=lA6E888B4A4B29B16FBA1299108DBE9CDCB327A9713C232B36E4DB4F

F222CF03;webp=true;ci=l%2C%E5%8C%97%E4%BA%AC;

_guid=26581345.3954606544145667000.1530879049181.8303;

_lxsdk_cuid=1646f808301c8-0a4e196421593-5d4e2llf-100200-1646f808302c8;

_lxsdk=lA6E888B4A4B29B16FBA1299108DBE9CDCB327A9713C232B36E4DB4

FF222CF03;monitor_count=l;_ksdk_s=16472ee89ec-de2-191-edO%7C%7C5;

_mta=189118996.1530879050545.1530936763555.1530937843742.181

defhtml_prase(uii):

r=requests.get(url).content

returnr

cookie={}

forlineincookies.splitC;1):

name,value=cookies.stiipO.splitC-1,1)

cookie[name]=value

defhtniLprase(url):

r二requests.get(uii).content

returnr

foriinrange(l,100):

print。正在打印第%s页,%i)

try:

url=

,/mmdb/comments/movie/1200486.json?_v_=yes&offset=%s&,%

(

i*15)

print(url)

proxy=html.praseC'http://l9:5010/get/)..decodeCutf-8f)#代理是自建代

理池,有需要使用代理的可以联系我,知乎ID:布道

html=reqtiests.get(ur1=ur1,cookies=cookie,headers=header,

proxies二{“http":,rhttp://{}format(proxy)}).content

data=json.loads(htmLdecode('ut仔8'))『cmts']

foritemindata:

comment=it6m/content']

date=item[,time,].split(**)[0]

rate=item]score']

city=itemrcityName1]

img=itemf'avatarurl']

print(date,rate,comment,city,)

withopen('maoyan_08.txt','a',encoding=,utf-8,)asf

fwrite(date+V+str(rate)+7+comment+?+comment+7+city+'')

ifimg:

f=openC^AUsersMyDesktopyaoshenimgV+img.split(7)[-l],'wb')

fwrite((ui,llib.request.urlopen(img)),read())

except:

continue

time.sleep(5+float(random.randint(1,100))/20)

另外一种方式:Anyproxy+JS+Python+Monkeyrunner,可以爬取Web静态网站、

App应用、JS渲染数据的动态网站的数据都可以进行爬取。

中间人

安装使用,请查阅:

官方Github:

httpsL7/alibaba/anyproxy

JS代码:

varlogMap={}

varfc=requireCfs*);

variconv=requii,e(,iconv-lite1);

varlogger=fe.createWriteStream(,./ui*ILog.log1,{

flags:宜〃'a'meansappending(olddatawillbepreserved)

})

functionlogPageFile(url){

if(!logMap[url]){

k)gMap[url]=true;

logger.write(uil+**);

)

)

ftmctionpostData(post_data,path,cb){

〃//Buildthepoststiingfromanobject

//varpost_data=JSON.stringify({

//'data1:data

//});

〃Anobjectofoptionstoindicatewheretopostto

varpost_options={

host:1,,

port:'9999;

path:V'+path,

method:TOST,

headers:{

'Content-Type':,application/json,,

'Content-Length1:Buffer.byteLength(post_data)

);

varhttp=requireChttp1);

〃Setuptherequest

varpost_req=http.request(post_options,function(res){

res.setEncodingCutf8');

res.on('data',cb);

});

logger.writeC/requestpostdata1')

//postthedata

post_req.write(post_data);

logger.write(*requestpostdata2')

post_req.end();

}

module.exports={

summary:*aruletomodifyresponse1,

*befbreSendResponse(requestDetail,responseDetail){

if(/movie/1200486/i.test(requestDetail,url)){

logger.writeC/matehed:1+requestDetaiLuil+'

if(responseDetail.response.toStringO!=={

fogger.write(responseDetaiLresponse.body.toStringO);

varpost_data=JSON.stringify({

'uiT:requestDetailurl,

‘body':responseDetail.response.body.toString()

});

logger.write("postcommenttoserver—ext,r);

postData(post_data,'douban_comment',fiinction(chunk){

});

)

)

},

);

使用AnyProxy加载JS代码:

anyproxy-i-rulewxrule.js

Service代码部分:

#!/usr/bin/envpython3

importasyncio

importre

irrporttextwrap

importthreading

irrporttime

importos

importpymysql

frommysqlmgrimportMysqlMgr

frommongomgi'inportMongoManager

fromsubprocessimportcall

importrequests

fromIxmlimportetree

fromIxmlimporthtrnl

fromaiohttp.webimportApplication,Response,StreamResponse,run_app

irrportjson

STATE_RUNNING=1

STATE_IN_TRANSACTION=2

running_state=0

mn_swipe=True

last_history_time=time.clock()

#Athreadtosavedatatodatabaseinbackground

definsert_to_database(biz,insglist):

try:

formsginmsglist:

print(biz)

print(msg[,comrn_msg_info,]rid,])

mongo_mgr.enqueue_data(msg[*comni_msg_info1][fkl'],biz,msg)

exceptExceptionase:

print(e)

defsave_data(biz,msglist_str):

save_thread=threading.Thread(target=insert_to_database,args=(biz,msglist_str,))

save_thread.setDaemon(True)

save_thread.start()

defswipe_for_next_page():

whilerun_swipe:

time.sleep(5)

iftime.ck)ck()-last_history_time>120:

ifrumiing_state==STATE_RUNNING:

reenter()

continue

can([nadb",nsheH'\"input0,nswipen,n400n,n1000n,"400';n200n)

defreenter():

globalrunning_state

runnin^_state=STATE_IN_TRANSACTION

#模拟侧滑实现返回上一页

caU(["adb","shell","input","swipe","0","400","400","400"])

time.sleep(2)

#点击”进入历史消息”,每个手机的位置不一样,需要单独设置X和Y

caU(["adb","shell","input","tap","200","1200'])

time.sleep(2)

header{fUser-Agent1:'Mozilla/5.0(WindowsNT10.0;Win64;x64;rv54.0)

Gecko/20100101Firefox/54.0VConnection':'keep-alive'}

defhtmLprase(url):

r=requests.get(ui-l,header).content

returnhtml.fromstring(r)

asyncdefreport_url(request):

resp=StreamResponse()

data=awaitrequest.json()

url=data「url]

#print(nurlreported:"+url)

biz=re.findallf—biz=(.*?)&',url)

iflen(biz)==0:

awaitresp.prepare(request)

returnresp

biz=biz[0]

print,'+biz+'')

mysql_mgi*.enqueue_biz(biz,”)

bizs.add(biz)

biz=biz.encode(,utf8,)

resp.content_type='text/plain'

awaitresp.prepare(request)

resp.write(biz)

awaitresp.write_eofl;)

returnresp

asyncdefiiitro(request):

txt=textwrap.dedent(,H,n

Type{url}/hello/John{uii}/simpleor{url}/change_body

inbrowseruiibar

).forma^url^l:80801)

binary=txt.encode(,utf8')

resp=StreamResponse()

resp.content_length=len(binary)

resp.content_type='text/plain'

awaitresp.prepare(request)

resp.write(binary)

returnresp

asyncdefsirrple(request):

returnResponse(text="Simpleanswer'*)

asyncdefchange_body(request):

resp=Response()

resp.body=b'Bodychanged"

resp.content_type=*text/plain1

returnresp

#codiiig=utf-8

asyncdefapp_douban_comment(request):

resp=StreaniResponse()

data=awaitrequest.json()

globalrunnin^state

globallast_history_time

msg_data=json.k)ads(data『body'])「data'][cts']

foriteminmsg_data:

comment=iteml'ce^.stripO.replaceC

rate=itemf'cr*]

print(comment,rate)

withopen('date_rate_coiriment_sg.txt1,*3*,encoding=,utf-8,)asfi

£write(12018-07-06,+?+str(rate)+?+comment+'')

Iast_history_time=time.clockQ

resp.content_type='text/plain'

awaitresp.prepare(request)

awaitresp.write_eof()

returnresp

Iast_history_time=time.clockQ

resp.content_type=*text/plain1

awaitresp.prepare(request)

awaitresp.write_eofl;)

returnresp

asyncdefiiiit(loop):

app=Application()

app.router.add_get(7,intro)

app.router.add_post(7urr,report_ui*l)

app.router.add_post('/douban_comment',app_douban_comment)

returnapp

defstart_swipe_thread():

try:

t二thi*eading.Thread(

target=swipe_for_next_page,name='swipe')

#setdaemonsomainthreadcanexitwhenreceivesctrl-c

t.setDaemon(True)

t.stail()

exceptException:

print("Error:unabletostartthread")

loop=asyncio.get_event_loop()

app=loop.run_untiLeomplete(init(loop))

mn_app(app,host='',poil=9999)

这是示例代码,实际使用过程,需要进行微调。获取猫眼数据,最难是难在找猫

眼App的数据接口。

我费了很大力气才找到:

/mmdb/comments/movie/1200486.json?_v_=yes&offset=15'

接口怎么使用,直接看代码,获取淘票票的数据需要你自己去尝试找一下。

irrportjson

importrandom

irrportuiDib

importrequests

fromurllibimportrequest

irrporttime

header={fUser-Agent1:'Mozflla/5.0(WindowsNT10.0;Win32;x32;rv54.0)

Gecko/20100101Firefox/54.0;

'Connection':'keep-alive*}

cookies-v=3;

iuuid=lA6E888B4A4B29B16FBA1299108DBE9CDCB327A9713C232B36E4DB4F

F222CF03;webp=true;ci=1%2C%E5%8C%97%E4%BA%AC;

_guid=26581345.3954606544145667000.1530879049181.8303;

_lxsdk_cuid=1646f808301c8-0a4el9B421593-5d4e211M00200-1646f808302c8;

Jxsdk=lA6E888B4A4B29B16FBA1299108DBE9CDCB327A9713c232B36E4DB4

FF222CF03;monitor_count=l;_lxsdk_s=16472ee89ec-de2-191-edO%7C%7C5;

_mta=189118996.1530879050545.1530936763555.1530937843742.18'

cookie={}

forlineincookies.split,;'):

name,value=cookies.stip().split(1)

cookiefname]=value

defhtml_prase(url):

r=requests.get(url).content

returnr

foriinrange(l,100):

print。正在打印第%s页,%i)

try:

url=

,httpy//mmdb/comments/movie/1200486.json?_v_=yes&offset=%s&,

%(i*15)+fstartTime=2018-07-01%2012%3A30%3A42'

print(url)

html=requests.get(url=ur1,cookies=cookie,headers=header).content

data=json.loads(html.decode(,utf-8,))[,cmts']

foritemindata:

comment=item(,content,]

date=itemf^imen.spli^**)[0]

rate=rtemt*score']

city=itemrcityName*]

img=iteml'avatarurl']

print(date,rate,comment,city,)

withopen('maoyan_08.txt',encodings*utf-8r)asfi

fwrite(date+:+str(rate)+?+comment+:+comment+city+'')

ifimg:

f=openfCAUsersMyDesktopyaoshenirngV+img.split(7)f-l],'wb1)

£write((urllib.request.urlopen(img)).read())

except:

break

time.sleep(5+float(random.randint(1,100))/20)

动态地图展示代码:

frompyechartsiinportStyle

frompyechartsimportGeo

city=[]

withopen('maoyan.txt\mode='r\encoding=,uti-81)asfi

rows=freadlines()

forrowinrows:

iflen(row.split(V))==5:

city.append(row.split(\!)[4].replace(,

defall_list(an,):

result={}

foriinset(arr):

result[i]=arr.count(i)

returnresult

data=[]

foriteminall_list(city):

data.append((item,all_list(city)fiteml))

style=Style(

tjtle_color=H#fff;

title_pos="centeru,

widths1200,

height=600,

background_color=,#404a59,

)

geo=Geo("《我不是药神》评论人群地理位置“J数据来源:知乎ID:布道”,

**style.init_style)

attr,value=geo.cast(data)

geo.add(,,H,attr,value,visual_range=[0,100],

visual_text_color="#fff",is_legend_show=FaIse,

symbol_size=20,is_visualmap=True,

tooltip_formatter1{b}\

labeLemphasis_textsize=15,

labeLemphasis_pos=,right*)

geo.render()

每天爬取数据量代码:

frompyechartsimpoilEfiectScatter

frompyechartsimportStyle

style=Style(

dtle_cok)r="#191970”,

trtle_pos=',leftH,

width=900,

height=450,

background_color=,#F8F8FF,

)

es=EffectScatter("《我不是药神》短评数据情况数据来源:知乎ID:布道:

**style.init_style)

es.add(1,n,[1],[270],symbol_size=20,eflfect_scale=4,

effect_period=5,symbol"pin')

es.add("",[2],[606],symbol_size=20,eflfect_scale=4,

effect_period=5,symbol"pin*1)

es.add(nn,[3],[542],symbol_size=20,eflect_scale=4,

eflect_perk)d=5,symbol"pin*')

es.add(n",[4],[550],symbol_size=20,eflect_scale=4,

eflect_period=5,symbol"pin11)

es.add(,m,[5],[656],ssymbol_size=20,eflfect_scale=4,

eflect_period=5,symbol"pin11)

es.add(,,H,[6],[850],ssymbol_size=20,eflfect_scale=4,

efifect_period=5,symbol"pin11)

es.add("",[7],[993],symbol_size=20,effect_scale=4,

effect_perk)d=5,symbol"pin11)

es.add("n,[8],[903],symbol_size=20,effect_scale=4,

effect_period=5,symbol"pin11)

es.render()

五星推荐河流图代码:

frompyechartsunportStyle

frompyechartsimportThemeRiver

data=[

[,2018/07/08,,802,'五星1r2018/07/08:28,'四星][2018/07/08;9,'三星

[,2018/07/08',8,—S'],

[,2018/07/08',4,」星

[,2018/07/07,,802,'EM'],['2018/07/07,,166,'EM'],['2018/07/07',17,'HM

工「2018/07/07:。,'二星[「2018/07/07;8,'一星1

[,2018/07/06,,667,,五星「2018/07/06,,156,'四星]『2018/07/06J3,'三星口,

[,2018/07/06',10,'二星],['2018/07/06',4,星

[,2018/07/05,,567,'EM'],['2018/07/05',76,'EM'],['2018/07/05',13,'三星)

[,2018/07/05',0,—S'],['2018/07/05',0,'一星]

[-2018/07/04',467J五星1,「2018/07/04;67J四星],「2018/07/04:16,'三星]

[,2018/07/04',0,二星「2018/07/04',0,'一星]

[,2018/07/03',478,,五星[,「2018/07/03;56,,四星],「2018/07/03、8,'三星口,

[-2018/07/03',0,二星[,['2018/07/03、0,'一星]

[,2018/07/02,,531,['2018/07/02',67,'0M'],['2018/07/02',8,'三星

[,2018/07/02',0J二星,[2018/07/02;0,'一星]

['2018/07/01,,213,'五星工[2018/07/01,45,'四星][2018/07/01:5,'三星

[,2018/07/01',1,'二星

[,2018/07/01',1,'一星

]

style=Style(

title_color="#191970",

title_pos="left",

width=1200,

height=600,

background_color='#F8F8FF'

)

tr=ThemeRiver("《我不是药神》星级推荐”,"数据来源:知乎ID:布道”,

**style.init_style)

tr.add(「五星‘,’四星丁三星」二星丁一星data,is_label_show=True)

tr.render()

词云图:

irrportpickle

fromosimportpath

importjieba

irrportmatpk)tlib.pyplotaspit

fromwordcloudimportWordCloud,STOPWORDS,ImageColorGenerator

defmake_worldcloud(file_path):

text_f

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论