版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
爬取豆瓣、猫眼、淘票票等网站上《我不是药神》的信息并用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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年AI赋能的供应链回收物流网络设计
- 2026年中药鉴定学植物药材质量控制试卷及答案
- 纳米技术在空气净化中的作用
- 全身麻醉与围手术期管理
- 2026年美发造型设计职业技能考试题库试卷
- 《地球的圈层结构》地理授课课件
- 《电流的热效应》物理授课课件
- 介入护理团队协作模式
- 中医护理师角色与素养
- 中幼医院消防安全培训方案
- 农副产品营销培训课件
- 装饰工程施工质量方案
- 零碳产业园区实施路径规划
- 机电排灌培训
- 格宾笼技术教学课件
- 农业烘干设备租赁合同(2025年风险承担)
- 胆总管结石课件
- 档案方面的课题申报书范文
- 收纳劳动课件
- 2025浙江绍兴市原水集团有限公司下属企业招聘1人考试笔试备考试题及答案解析
- GB/T 46605-2025硫化橡胶或热塑性橡胶动态耐切割性能的测定
评论
0/150
提交评论