EX1 | 用Python爬取猫眼电影 APP 关于《无双》电影评论

在本次推送中,以猫眼电影 APP 中的电影评论作为爬取目标,完成对网页数据的采集。在采集完成后,我们将每个评论数据采集分用户名、评论时间、用户性别、用户等级、用户所在城地、用户评分、以及评论内容等,并将它们以 .xls 的文件格式进行保存。

《无双》电影

1 准备工作

在爬虫开始之前,请确保已经安装好了 requests 库、xlwt 库以及 json 库。如果没有安装,请使用 cmd 打开命令行界面,输入以下代码:

pip install requests
pip install xlwt
pip install json 

2 抓取分析

我们发现,在猫眼PC端的网页中,只存在最热门的10条评论数据,这显示是不够支撑我们进行后续的数据分析的。

猫眼PC端网页地址 https://maoyan.com/films/342166

猫眼电影《无双》共计31.9万人评分

因此,我们选择登录手机网页版本,即

猫眼移动端网页地址 http://m.maoyan.com/movie/342166/comments?v=yes

猫眼移动端网页

按下 F12 或者鼠标点击右键检查按钮,点击进入Network一栏。如下图所示:

分析网页代码

随后我们再次按下 F5 刷新按钮,有时需要按下 CTRL + F5组合键。便能够将页面再次刷新。寻找网站评论入口,如下图所示:

寻找网站评论入口

可以看到里面包含了 Request URL(请求地址)、Request Method(请求方式)、Status Code(状态码)等信息。再往下翻比较重要的信息就是 HostRefererUser-Agent、以及X-Requested-With等信息。

这些信息获取之后,我们便可以开始今天的爬虫工作了。

3 爬取信息

首先,我们需要导入一些第三方库。具体如下:

import requests
import xlwt
import json

其中,requests 库是用来向服务器发送 GET 类型的请求,xlwt 库是用来操作 .xls 文件的,而我们的数据因为是 json 格式的数据,因此需要对它进行解析,这里便用到了 json 库。

3.1 设置请求头

一般情况下,为了避免触发反爬虫机制,需要完善一下请求头信息,这里我们把它作为一个独立的函数方便后续调用,具体如下:

def get_page(url):
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36',
        'Cookie':'_lxsdk_cuid=1661ae34b39c8-0c8c15380422c-2711639-144000-1661ae34b39c8; v=3; __utma=17099173.21012536.1539393286.1539393286.1539393286.1; __utmc=17099173; __utmz=17099173.1539393286.1.1.utmcsr=google|utmccn=(organic)|utmcmd=organic|utmctr=(not%20provided); __utmb=17099173.2.9.1539393288643; uuid_n_v=v1; iuuid=B7EC5090CE8511E89675C9EEEAD92C526D3F6AA2E9344F5091F4218FA118AAEF; webp=true; ci=55%2C%E5%8D%97%E4%BA%AC; __mta=207950381.1538049396050.1539393287057.1539393443480.10; _lx_utm=utm_source%3Dgoogle%26utm_medium%3Dorganic; _lxsdk=B7EC5090CE8511E89675C9EEEAD92C526D3F6AA2E9344F5091F4218FA118AAEF; _lxsdk_s=1666af306c5-403-5fd-037%7C%7C45',
        'Host':'m.maoyan.com',
        'Referer':'http://m.maoyan.com/movie/342166/comments?_v_=yes',
        'X-Requested-With':'superagent'
    }
    return requests.get(url,headers = headers)

接下来我们便开始网页评论的爬取工作。

3.2 评论爬取与保存

在分析爬取的网址时,具体如下:

http://m.maoyan.com/mmdb/comments/movie/342166.json?_v_=yes&offset=0&startTime=0
http://m.maoyan.com/mmdb/comments/movie/342166.json?_v_=yes&offset=15&startTime=2018-10-15%2016%3A56%3A10
http://m.maoyan.com/mmdb/comments/movie/342166.json?_v_=yes&offset=30&startTime=2018-10-15%2016%3A56%3A10

我们发现,网页请求URL前面部分都是一致的,只有在 offset 的地方才发生改变,而后面的 startTime 便是你此刻获取最新评论的最后时间(这里的内容不是很重要,我们可以从任意时间获取评论)。最简单的做法就是我们直接更改 offset 位置的数字,从0,15,30,……一直加下去。

但是这个时候问题又出现了,采取这一方式只能获取当天的前1000条评论,怎么办?后来我又发现可以对 startTime 的时间进行修改。比如当前的日期是2018-10-15,只要电影上映后,任意的时间日期我都可以获取到数据。此时可以再加入一个对日期的循环。

这里的爬取网页 URL 的任务我们便完成了,接下来便是对数据的保存工作。我们选择 .xls 文件进行保存,因为第三方 xlwt 库只能对文件保存一次,后续的修改将会覆盖之间的内容。因此我们将文件的保存一并写入评论获取的函数中,方便操作。具体代码如下:

def get_comment():
    comment = [None] * 7
    file = 'Project_Gutenberg_comment.xls'
    # 创建一个Excel
    book = xlwt.Workbook()
    # 在其中创建一个名为'无双'的sheet
    sheet1 = book.add_sheet('无双', cell_overwrite_ok=True)  
    #设置需要保存的信息栏
    row0 = ['nickName', 'startTime', 'gender', 'userLevel', 'cityName', 'score', 'content']
    #将首行信息写入
    for l in range(len(row0)):
        sheet1.write(0, l, row0[l])
    
    #对时间进行循环,因为电影上映的时间是9月30号,我们选择从爬取的评论是从10月1号到10月15号(也就是今天)
    for day in range(1,16):
        print('正在爬取10月{}日的评论'.format(day))
        #每天只能爬取前1000条数据,每页15条,因此67次循环之后,便不再有数据可以爬取了
        for i in range(67):
            print('正在下载第{}页评论'.format(i + 1))
            r = get_page('http://m.maoyan.com/mmdb/comments/movie/1217402.json?_v_=yes&offset=' + str(
                i*15) + '&startTime=2018-10-{}%2023%3A59%3A59'.format(day))
            #判断网页状态码,正常则对数据进行爬取,否则直接退出循环
            if r.status_code == 200:                
                try:
                    soup = json.loads(r.text)['cmts']
                    j= 0
                    #保存数据
                    for cmt in soup:
                        j += 1
                        try:
                            comment[0] = cmt['nickName']
                            comment[1] = cmt['startTime']
                            if cmt.get('gender'):
                                comment[2] = cmt['gender']
                            else:
                                comment[2] = None
                            comment[3] = cmt['userLevel']
                            comment[4] = cmt['cityName']
                            comment[5] = cmt['score']
                            comment[6] = cmt['content']

                        except:
                            break
                        #写入数据
                        for k in range(len(comment)):
                            sheet1.write((day-1)*1005+(i*15+j), k, comment[k])
                except:
                    break
            else:
                break
    #保存文件
    book.save(file)  

3.3 启动程序

输入以下代码便能完成整个程序的运行:

if __name__ == '__main__':
    get_comment()
    print('爬取结束')

4 总结与展望

当最后程序完成后,会在根目录下显示 Project_Gutenberg_comment.xls 文件,这时便完成了数据采取工作。值得一提的是,无论是机器学习,还是数据分析,它们的基础便是数据,因此数据的获取至关重要。

这里我们只是简单的获取了猫眼电影移动端每天前1000条评论,并未完整的爬取某一天的全部评论,这一任务可以留作后续我们继续完成。

微信公众号:Python一号通
关注可了解更多的爬虫教程及机器学习内容。
问题或建议,请评论留言

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,219评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,363评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,933评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,020评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,400评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,640评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,896评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,597评论 0 199
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,327评论 1 244
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,581评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,072评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,399评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,054评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,083评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,849评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,672评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,585评论 2 270

推荐阅读更多精彩内容