时光网内地影视票房Top100爬取 - hhbeast

时间:2024-02-16 10:47:14

为了和艺恩网的数据作比较,让结果更精确,在昨天又写了一个时光网信息的爬取,这次的难度比艺恩网的大不少,话不多说,先放代码


# -*- coding:utf-8 -*-
from __future__ import print_function
import urllib2
import re

print(u"电影;首日票房;首周票房;时光评分;评分人数;总票房")
pre_url="http://movie.mtime.com/boxoffice/?area=china&type=MovieRankingHistory&category=all&page="
\'\'\'3&display=list&timestamp=1496903738364&version=07bb781100018dd58eafc3b35d42686804c6df8d&dataType=json\'\'\'
for index in range(10):
aft_url=str(index)+"&display=list&timestamp=1496903738364&version=07bb781100018dd58eafc3b35d42686804c6df8d&dataType=json"
url=pre_url+aft_url
response = urllib2.urlopen(url)
pageCode=response.read().decode(\'utf-8\')
pattern = re.compile(u"h3><a[^>]*>([^<]+)(?:.+?首日<strong>([^<]+)(?:.+?首周<strong>([^<]+))?)?.*?point[^>]*>(\d)<em>.(\d).*?<p>(.*?)人.*?totalnum[^>]*><strong>([^<]+).*?", re.S)
divide = re.compile("(<\/div><\/div>.*?none\S\S>[^p]*p>)", re.S)
items=re.findall(divide, pageCode)
for item in items:
iitems=re.findall(pattern, item)
for iitem in iitems:
print(iitem[0], end=\';\')
if(iitem[1]==\'\'):
print(\'\', end=\';\')
elif(float(iitem[1])>=100):
print(float(iitem[1])/10000.0, end=\';\')
else:
print(iitem[1], end=\';\')
if (iitem[2] == \'\'):
print(\'\', end=\';\')
elif (float(iitem[2]) >= 100):
print(float(iitem[2])/10000.0, end=\';\')
else:
print(iitem[2], end=\';\')
print(iitem[3], end=\'.\')
print(iitem[4], end=\';\')
print(iitem[5], end=\';\')
print(iitem[6]+u\'亿\', end=\';\')
print(\'\') 

时光网信息爬取的难点主要在于他的正则不好写

大部分电影首日票房与首周票房都有

部分电影有首日票房,没有首周票房

还有一部分电影首日票房首周票房都没有

比较好的解决办法就是在网页中将十部电影的代码分开,分别处理

如果不这么办就会出现本部电影捕获到下一部电影的票房的情况,紧接着下一部电影的信息会覆盖该部电影的信息,同时,下一部电影也将消失,等于少捕获了一部电影

所以就要在正则中采取"有则捕获,无则略过"的策略

主要做法是使用(?:(xxx))?yyy(zzz)的方法在寻找下一捕获目标选择性的对不知道是否存在的目标进行捕获

由于不会存在有首周无首日的情况,所以采取了(?:(首日)(?:(首周))?)?的策略

由于python2对中文编码的支持比较差,正则写出来始终有小bug,但在regex101中就能通过,后来在正则两边加入了u\'  \',才豁然开朗

posted on 2017-06-09 19:39  hhbeast  阅读(1733)  评论(0编辑  收藏  举报