客户端持续运营是提高客户端体验和用户黏性的一项重要工作,用户在IOS appstore和Android菜市场上的评论是很有价值的信息,自动抓取很有意思。
使用Python开发一个自动抓取用户评论的工具,是一件饶有趣味的事。
鉴于很多移动开发团队都有这方面的需求,所以把我的经验和大家分享一下。
我的代码是在淘宝抓取ios评论的代码上改进的,在此特别感谢淘宝天蒙同学的支持。Android的菜市场很多,评论质量比较高的有:360手机助手,腾讯应用宝,豌豆荚以及小米市场等。
以360手机助手为例,客户端软件详情页面的信息包括评分,下载次数,更新时间,版本号以及用户评论等。
用Python的urllib2库可以获取页面内容,而使用Python第三方库BeautifulSoup以及正则表达式库re可以轻松地解析出你想要的字段。例如以下代码就是解析页面中的版本号,其他字段可以使用类似方法解析。[table=98%,transparent]
[tr][td]
1
[/td][td]
DETAIL_URL_360=’http://zhushou.360.cn/detail/index/soft_id/1939?recrefer=SE_D_支付宝’
[/td][/tr]
[/table]
[table=98%,transparent]
[tr][td]
2
[/td][td]
soup = BeautifulSoup(urllib2.urlopen(DETAIL_URL_360).read())
[/td][/tr]
[/table]
[table=98%,transparent]
[tr][td]
3
[/td][td]
version_str = soup(‘div’, {‘class’:‘nstxt’})[0].getText()
[/td][/tr]
[/table]
[table=98%,transparent]
[tr][td]
4
[/td][td]
version = re.findall(‘(\d+.\d+.\d+.\d+)’, version_str)[0]
[/td][/tr]
[/table]
评论的解析稍微复杂一点,因为大部分菜市场都是用ajax获取评论内容的,评论的内容在单独的url中返回,此时可以使用抓包工具如IEInspector来分析评论的连接。评论的内容一般都是json格式的,用python的json库解析就行了。[table=98%,transparent]
[tr][td]
1
[/td][td]
COMMENT_URL_360=’http://intf.baike.360.cn/index.php?c=message&a=getmessage&name=手机支付宝客户端&start=0&count=30&type=all&_=1353920552487’
[/td][/tr]
[/table]
[table=98%,transparent]
[tr][td]
2
[/td][td]
data = json.loads(urllib2.urlopen(comment_url).read())[‘data’]
[/td][/tr]
[/table]
[table=98%,transparent]
[tr][td]
3
[/td][td]
comments = data[‘messages’]
[/td][/tr]
[/table]
[table=98%,transparent]
[tr][td]
4
[/td][td]
for comment in comments:
[/td][/tr]
[/table]
[table=98%,transparent]
[tr][td]
5
[/td][td]
#proc(comment)
[/td][/tr]
[/table]
详情和评论都解析出来以后,我们需要把它保存下来,使用sqlite数据库最方便,数据库就是一个文件。而Python为sqlite的访问提供了很方便的sqlite3模块。[table=98%,transparent]
[tr][td]
1
[/td][td]
con = sqlite3.connect(DB_NAME)
[/td][/tr]
[/table]
[table=98%,transparent]
[tr][td]
2
[/td][td]
with con:
[/td][/tr]
[/table]
[table=98%,transparent]
[tr][td]
3
[/td][td]
cur = con.cursor()
[/td][/tr]
[/table]
[table=98%,transparent]
[tr][td]
4
[/td][td]
try:
[/td][/tr]
[/table]
[table=98%,transparent]
[tr][td]
5
[/td][td]
cur.execute(“INSERT INTO android_comment VALUES(?,?)”,(‘xxx’,’yyy’))
[/td][/tr]
[/table]
[table=98%,transparent]
[tr][td]
6
[/td][td]
except sqlite3.Error, e:
[/td][/tr]
[/table]
[table=98%,transparent]
[tr][td]
7
[/td][td]
print “Sqlite Error %s:” % e.args[0]
[/td][/tr]
[/table]
为了防止重复插入,使用作者+内容的md5值做唯一性校验:[table=98%,transparent]
[tr][td]
1
[/td][td]
hashlib.md5(username+content).hexdigest()
[/td][/tr]
[/table]
评论保存以后,使用Python的smtplib将评论邮件发送给相关同学。[table=98%,transparent]
[tr][td]
01
[/td][td]
def send_mail(to_list,subject,content):
[/td][/tr]
[/table]
[table=98%,transparent]
[tr][td]
02
[/td][td]
me=‘%s<%s@%s>’%(mail_user,mail_user,mail_postfix)
[/td][/tr]
[/table]
[table=98%,transparent]
[tr][td]
03
[/td][td]
msg = MIMEText(content, ‘html’, ‘utf-8’)
[/td][/tr]
[/table]
[table=98%,transparent]
[tr][td]
04
[/td][td]
msg[‘Subject’] = subject
[/td][/tr]
[/table]
[table=98%,transparent]
[tr][td]
05
[/td][td]
msg[‘From’] = me
[/td][/tr]
[/table]
[table=98%,transparent]
[tr][td]
06
[/td][td]
msg[‘To’] = “;”.join(to_list)
[/td][/tr]
[/table]
[table=98%,transparent]
[tr][td]
07
[/td][td]
s = smtplib.SMTP()
[/td][/tr]
[/table]
[table=98%,transparent]
[tr][td]
08
[/td][td]
s.connect(mail_host)
[/td][/tr]
[/table]
[table=98%,transparent]
[tr][td]
09
[/td][td]
#s.ehlo_or_helo_if_needed()
[/td][/tr]
[/table]
[table=98%,transparent]
[tr][td]
10
[/td][td]
s.login(mail_user,mail_pass)
[/td][/tr]
[/table]
[table=98%,transparent]
[tr][td]
11
[/td][td]
s.sendmail(me, to_list, msg.as_string())
[/td][/tr]
[/table]
[table=98%,transparent]
[tr][td]
12
[/td][td]
s.close()
[/td][/tr]
[/table]
Android其他菜市场评论抓取与这很类似。不再赘述。
IOS appstore的评论抓取稍复杂一点,需要抓取详情页,评论页和评级页。
拿支付宝客户端来为例:
详情页为:http://itunes.apple.com/cn/app/zhi-fu-bao/id333206289?mt=8
评论页:http://itunes.apple.com/WebObjects/MZStore.woa/wa/customerReviews?displayable-kind=11&id=333206289&appVersion=current&sort=4
评级页:https://itunes.apple.com/cn/rss/topfreeapplications/limit=20/genre=6015/xml
用你客户端的id替换对应的id,用你客户端所属的类别替换genre即可。获取评级url的地址为:http://itunes.apple.com/rss/generator。这些完成以后,我们希望每天定时发送,由于我是把代码部署在windows机器上,所以使用了一个好用的定制定时任务的工具ssfree。附件中是所有代码,目前抓取了IOS appstore,360手机助手,腾讯应用宝以及豌豆荚的评论。
欢迎大家优化代码和新增功能