爬取电影信息

文章目录

  • 1、分析网页结构
  • 2、请求服务器
  • 3、解析网页,定位节点
  • 4、计算爬取信息时间
  • 5、代码汇总

1、分析网页结构

目标网站:http://movie.mtime.com/boxoffice/#CN/2019
选择抓取2018年内陆票房信息
爬取电影信息_第1张图片
点击下一页url链接不变,是通道加载,ajax结构,需要抓包来提取信息。

第一页:http://www.mtime.com/boxoffice/?year=2018&area=china&type=MovieRankingYear&category=all&page=0&display=list×tamp=1587368887785&version=07bb781100018dd58eafc3b35d42686804c6df8d&dataType=json
第二页:http://www.mtime.com/boxoffice/?year=2018&area=china&type=MovieRankingYear&category=all&page=1&display=list×tamp=1587368896027&version=07bb781100018dd58eafc3b35d42686804c6df8d&dataType=json
第三页:http://www.mtime.com/boxoffice/?year=2018&area=china&type=MovieRankingYear&category=all&page=2&display=list×tamp=1587368898757&version=07bb781100018dd58eafc3b35d42686804c6df8d&dataType=json
最后页:http://www.mtime.com/boxoffice/?year=2018&area=china&type=MovieRankingYear&category=all&page=9&display=list×tamp=1587369336977&version=07bb781100018dd58eafc3b35d42686804c6df8d&dataType=json

2、请求服务器

此时设置User-Agent请求,由于网站有反爬虫,所以请求服务器失败,因此需要再利用cookie值请求。
爬取电影信息_第2张图片

import requests,time,csv#导入包
from lxml import etree#树状筛选
#第一页url链接
url="http://www.mtime.com/boxoffice/?year=2018&area=china&type=MovieRankingYear&category=all&page=0&display=list×tamp=1587368887785&version=07bb781100018dd58eafc3b35d42686804c6df8d&dataType=json"
xheaders={
    
    'Cookie':'userId=0; defaultCity=%25E5%258C%2597%25E4%25BA%25AC%257C290; _userCode_=20204201539583959; _userIdentity_=20204201539584524; __utmc=221034756; _tt_=114FE2FE246906E7E72C255389769B90; DefaultCity-CookieKey=290; __utmc=196937584; __utmz=196937584.1587368454.1.1.utmcsr=movie.mtime.com|utmccn=(referral)|utmcmd=referral|utmcct=/; maxShowNewbie=2; __utma=196937584.1241856532.1587368454.1587383179.1587386571.3; __utma=221034756.1078113473.1587368399.1587368399.1587389201.2; __utmz=221034756.1587389201.2.2.utmcsr=localhost:8889|utmccn=(referral)|utmcmd=referral|utmcct=/notebooks/%E7%88%AC%E7%94%B5%E5%BD%B1%E4%BF%A1%E6%81%AF/%E7%88%AC%E7%94%B5%E5%BD%B1%E4%BF%A1%E6%81%AF.ipynb; Hm_lvt_6dd1e3b818c756974fb222f0eae5512e=1587368401,1587389201,1587389214; _ydclearance=da5f6a298f9e5bb95822db94-eae8-4307-90d1-c49a99893d02-1587397694; Hm_lpvt_6dd1e3b818c756974fb222f0eae5512e=1587390503; __utmt=1; __utmt_~1=1; __utmb=221034756.6.10.1587389201',
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.92 Safari/537.36'
}
response=requests.get(url=url,headers=xheaders)

返回结果为200,说明请求服务器成功
在这里插入图片描述

3、解析网页,定位节点

利用response.json()解析html

response.json()["html"]

根据HTML标签定位到自己需要爬取的内容,再分析定位节点规律,利用for循环爬取整页中的信息。

html_etree=etree.HTML(response.json()["html"])#看成一个树状筛子
#定位节点,提取信息,根据HTML来定位
dd=html_etree.xpath('//div[@class="boxofficelist"]/div/dd')
for item in dd:
    rank=item.xpath('./div/div[1]/i/text()')
    director=item.xpath('./div/div[2]//p[3]/a/text()')#模糊匹配./div/div[2]/p/p[3]/a/text()
    actor=item.xpath('./div/div[2]//p[4]/a/text()')#有两个演员但是只打印了一个的处理情况./div/div[2]//p[4]/a[1]/text()
    print(director,actor)
    act="、".join(actor)#将['张译', '黄景瑜']变成张译、黄景瑜格式,拼接字符串
    act=[act]
    print(act)
    score=item.xpath('./div/div[3]/p[2]/text()')
    score=(score[0].replace("人评分",""))#替换掉“人评分”
    score=[score]
    print(score)
    day=item.xpath('./div/div[2]/p[1]/strong[1]/text()')
    name=item.xpath('./div/div[2]/h3/a/text()')
    print(rank+name+actor+act+score)#输出数组形式

输出结果:

['林超贤'] ['张译', '黄景瑜']
['张译、黄景瑜']
['10410']
['01', '红海行动', '张译', '黄景瑜', '张译、黄景瑜', '10410']
['陈思诚'] ['王宝强', '刘昊然']
['王宝强、刘昊然']
['6048']
['02', '唐人街探案2', '王宝强', '刘昊然', '王宝强、刘昊然', '6048']
['文牧野'] ['徐峥', '周一围']
['徐峥、周一围']
['9539']
['03', '我不是药神', '徐峥', '周一围', '徐峥、周一围', '9539']
['闫非'] ['沈腾', '宋芸桦']
['沈腾、宋芸桦']
['6298']
['04', '西虹市首富', '沈腾', '宋芸桦', '沈腾、宋芸桦', '6298']
['安东尼·罗素'] ['小罗伯特·唐尼', '克里斯·埃文斯']
['小罗伯特·唐尼、克里斯·埃文斯']
['8648']
['05', '复仇者联盟3:无限战争', '小罗伯特·唐尼', '克里斯·埃文斯', '小罗伯特·唐尼、克里斯·埃文斯', '8648']
['许诚毅'] ['梁朝伟', '白百何']
['梁朝伟、白百何']
['3705']
['06', '捉妖记2', '梁朝伟', '白百何', '梁朝伟、白百何', '3705']
['鲁本·弗雷斯彻'] ['汤姆·哈迪', '米歇尔·威廉姆斯']
['汤姆·哈迪、米歇尔·威廉姆斯']
['4668']
['07', '毒液:致命守护者', '汤姆·哈迪', '米歇尔·威廉姆斯', '汤姆·哈迪、米歇尔·威廉姆斯', '4668']
['温子仁'] ['杰森·莫玛', '艾梅柏·希尔德']
['杰森·莫玛、艾梅柏·希尔德']
['6541']
['08', '海王', '杰森·莫玛', '艾梅柏·希尔德', '杰森·莫玛、艾梅柏·希尔德', '6541']
['胡安·安东尼奥·巴亚纳'] ['克里斯·帕拉特', '布莱丝·达拉斯·霍华德']
['克里斯·帕拉特、布莱丝·达拉斯·霍华德']
['4079']
['09', '侏罗纪世界2', '克里斯·帕拉特', '布莱丝·达拉斯·霍华德', '克里斯·帕拉特、布莱丝·达拉斯·霍华德', '4079']
['田羽生'] ['韩庚', '郑恺']
['韩庚、郑恺']
['3859']
['10', '前任3:再见前任', '韩庚', '郑恺', '韩庚、郑恺', '3859']

4、计算爬取信息时间

利用time.time()时间戳记录时间

startTime=time.time()#记录起始时间
endTime= time.time()#记录结束时间
useTime=(endTime-startTime)#再用结束时间减去开始时间
print("该次所获的信息用时%s秒"%useTime)#输出

5、代码汇总

import requests,time,csv
from lxml import etree#树状筛选
startTime=time.time()#记录起始时间

xheaders={
    
    'Cookie':'userId=0; defaultCity=%25E5%258C%2597%25E4%25BA%25AC%257C290; _userCode_=20204201539583959; _userIdentity_=20204201539584524; __utmc=221034756; _tt_=114FE2FE246906E7E72C255389769B90; DefaultCity-CookieKey=290; __utmc=196937584; __utmz=196937584.1587368454.1.1.utmcsr=movie.mtime.com|utmccn=(referral)|utmcmd=referral|utmcct=/; maxShowNewbie=2; __utma=196937584.1241856532.1587368454.1587383179.1587386571.3; __utma=221034756.1078113473.1587368399.1587368399.1587389201.2; __utmz=221034756.1587389201.2.2.utmcsr=localhost:8889|utmccn=(referral)|utmcmd=referral|utmcct=/notebooks/%E7%88%AC%E7%94%B5%E5%BD%B1%E4%BF%A1%E6%81%AF/%E7%88%AC%E7%94%B5%E5%BD%B1%E4%BF%A1%E6%81%AF.ipynb; Hm_lvt_6dd1e3b818c756974fb222f0eae5512e=1587368401,1587389201,1587389214; _ydclearance=da5f6a298f9e5bb95822db94-eae8-4307-90d1-c49a99893d02-1587397694; Hm_lpvt_6dd1e3b818c756974fb222f0eae5512e=1587390503; __utmt=1; __utmt_~1=1; __utmb=221034756.6.10.1587389201',
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.92 Safari/537.36'
}
 #创建文件夹并打开
fp=open("./2电影信息2018.csv",'a',newline='',encoding='utf-8-sig')
writer=csv.writer(fp)
#写入
writer.writerow(('排名','电影名称','导演','演员','评价人数'))
#定位节点,提取信息

for page in range(10):
    print ("正在爬取%s页......"%page)
    url="http://www.mtime.com/boxoffice/?year=2018&area=china&type=MovieRankingYear&category=all&page=%s&display=list×tamp=1587368887785&version=07bb781100018dd58eafc3b35d42686804c6df8d&dataType=json"%page
    
    response=requests.get(url=url,headers=xheaders)
    
    html_etree=etree.HTML(response.json()["html"])#看成一个树状筛子
    #提取信息
    dd=html_etree.xpath('//div[@class="boxofficelist"]/div/dd')
    for item in dd:
        try:
            rank=item.xpath('./div/div[1]/i/text()')
            director=item.xpath('./div/div[2]//p[3]/a/text()')#模糊匹配./div/div[2]/p/p[3]/a/text()
            actor=item.xpath('./div/div[2]//p[4]/a/text()')#有两个演员但是只打印了一个的处理情况./div/div[2]//p[4]/a[1]/text()

            act="、".join(actor)#将['张译', '黄景瑜']变成张译、黄景瑜格式,拼接字符串
            act=[act]

            score=item.xpath('./div/div[3]/p[2]/text()')
            score=(score[0].replace("人评分",""))#替换掉“人评分”
            score=[score]

            day=item.xpath('./div/div[2]/p[1]/strong[1]/text()')
            name=item.xpath('./div/div[2]/h3/a/text()')
            result=(rank+name+director+act+score)#输出数组形式
            print(result)           

            writer.writerow(result)#当result是数组时单个括号,当result是字符串时要用俩个括号
        except:            
            print ("这里报错了")
            break
        #关闭文件
fp.close()
endTime= time.time()#记录结束时间
useTime=(endTime-startTime)
print("该次所获的信息用时%s秒"%useTime)

运行结果

正在爬取0页......
['01', '红海行动', '林超贤', '张译、黄景瑜', '10410']
['02', '唐人街探案2', '陈思诚', '王宝强、刘昊然', '6048']
['03', '我不是药神', '文牧野', '徐峥、周一围', '9539']
['04', '西虹市首富', '闫非', '沈腾、宋芸桦', '6298']
['05', '复仇者联盟3:无限战争', '安东尼·罗素', '小罗伯特·唐尼、克里斯·埃文斯', '8648']
['06', '捉妖记2', '许诚毅', '梁朝伟、白百何', '3705']
['07', '毒液:致命守护者', '鲁本·弗雷斯彻', '汤姆·哈迪、米歇尔·威廉姆斯', '4668']
['08', '海王', '温子仁', '杰森·莫玛、艾梅柏·希尔德', '6541']
['09', '侏罗纪世界2', '胡安·安东尼奥·巴亚纳', '克里斯·帕拉特、布莱丝·达拉斯·霍华德', '4079']
['10', '前任3:再见前任', '田羽生', '韩庚、郑恺', '3859']
正在爬取1页......
['11', '头号玩家', '史蒂文·斯皮尔伯格', '泰尔·谢里丹、奥利维亚·库克', '7886']
['12', '后来的我们', '刘若英', '井柏然、周冬雨', '2565']
['13', '一出好戏', '黄渤', '黄渤、王宝强', '4333']
['14', '无双', '庄文强', '周润发、郭富城', '4397']
['15', '碟中谍6:全面瓦解', '克里斯托夫·迈考利', '汤姆·克鲁斯、丽贝卡·弗格森', '4850']
['16', '巨齿鲨', '乔·德特杜巴', '杰森·斯坦森、李冰冰', '2457']
['17', '狂暴巨兽', '布拉德·佩顿', '道恩·强森、娜奥米·哈里斯', '2608']
['18', '超时空同居', '苏伦', '雷佳音、佟丽娅', '2417']
['19', '蚁人2:黄蜂女现身', '佩顿·里德', '保罗·路德、伊万杰琳·莉莉', '3632']
['20', '无名之辈', '饶晓志', '陈建斌、任素汐', '3618']
正在爬取2页......
['21', '无问西东', '李芳芳', '章子怡、张震', '4379']
['22', '神秘巨星', '阿瓦提·钱德安', '阿米尔·汗、塞伊拉·沃西', '3210']
['23', '西游记女儿国', '郑保瑞', '郭富城、冯绍峰', '2231']
['24', '摩天营救', '罗森·马歇尔·瑟伯', '道恩·强森、内芙·坎贝尔', '2018']
['25', '黑豹', '瑞恩·库格勒', '查德维克·博斯曼、露皮塔·尼永奥', '5029']
['26', '环太平洋:雷霆再起', '斯蒂文·S·迪奈特', '约翰·波耶加、斯科特·伊斯特伍德', '4049']
['27', '影', '张艺谋', '邓超、孙俪', '3711']
['28', '狄仁杰之四大天王', '徐克', '赵又廷、冯绍峰', '2940']
['29', '熊出没·变形记', '丁亮', '', '478']
['30', '李茶的姑妈', '吴昱翰', '黄才伦、艾伦', '1967']
正在爬取3页......
['31', '邪不压正', '姜文', '彭于晏、廖凡', '4486']
['32', '爱情公寓', '韦正', '陈赫、娄艺潇', '3305']
['33', '动物世界', '韩延', '李易峰、迈克尔·道格拉斯', '3234']
['34', '古墓丽影:源起之战', '罗阿尔·乌索格', '艾丽西亚·维坎德、吴彦祖', '2797']
['35', '勇敢者游戏:决战丛林', '杰克·卡斯丹', '道恩·强森、凯文·哈特', '3898']
这里报错了
正在爬取4页......
['41', '悲伤逆流成河', '落落', '赵英博、任敏', '583']
['42', '超人总动员2', '布拉德·伯德', '格雷格·T·尼尔森、霍利·亨特', '2193']
['43', '蜘蛛侠:平行宇宙', '鲍勃·佩尔西凯蒂', '沙美克·摩尔、海莉·斯坦菲尔德', '2896']
['44', '黄金兄弟', '钱嘉乐', '郑伊健、陈小春', '764']
['45', '移动迷宫3:死亡解药', '韦斯·波尔', '迪伦·奥布莱恩、卡雅·斯考达里奥', '1676']
['46', '小萝莉的猴神大叔', '卡比尔·汗', '萨尔曼·汗、卡琳娜·卡普', '2370']
['47', '找到你', '吕乐', '姚晨、马伊琍', '923']
['48', '来电狂响', '于淼', '佟大为、马丽', '1427']
['49', '无敌破坏王2:大闹互联网', '里奇·摩尔', '约翰·C·赖利、萨拉·丝沃曼', '2234']
['50', '星球大战:最后的绝地武士', '莱恩·约翰逊', '黛茜·雷德利、约翰·波耶加', '3240']
正在爬取5页......
['51', '地球最后的夜晚', '毕赣', '黄觉、汤唯', '1794']
['52', '胖子行动队', '包贝尔', '文章、包贝尔', '744']
['53', '芳华', '冯小刚', '黄轩、苗苗', '7330']
['54', '南极之恋', '吴有音', '赵又廷、杨子姗', '988']
['55', '精灵旅社3:疯狂假期', '格恩迪·塔塔科夫斯基', '亚当·桑德勒、凯瑟琳·哈恩', '977']
['56', '寂静之地', '约翰·卡拉辛斯基', '艾米莉·布朗特、约翰·卡拉辛斯基', '2625']
['57', '铁血战士', '沙恩·布莱克', '波伊德·霍布鲁克、奥立薇娅·玛恩', '1306']
['58', '起跑线', '萨基特·乔杜里', '伊尔凡·可汗、萨巴·卡玛尔', '1164']
['59', '哆啦A梦:大雄的金银岛', '今井一晓', '水田山葵、大原惠美', '410']
['60', '猛虫过江', '小沈阳', '小沈阳、潘斌龙', '771']
正在爬取6页......
['61', '奇迹男孩', '斯蒂芬·卓博斯基', '朱莉娅·罗伯茨、欧文·威尔逊', '2274']
['62', '公牛历险记', '卡洛斯·沙尔丹哈', '约翰·塞纳、凯特·迈克金农', '726']
['63', '憨豆特工3', '大卫·科尔', '罗温·艾金森、欧嘉·柯瑞兰寇', '932']
['64', '祖宗十九代', '郭德纲', '岳云鹏、吴京', '1381']
['65', '比得兔', '威尔·古勒', '詹姆斯·柯登、多姆纳尔·格里森', '927']
['66', '龙猫', '宫崎骏', '秦岚、日高法子', '12278']
['67', '新大头儿子和小头爸爸3:俄罗斯奇遇记', '何澄', '刘纯燕、董浩', '136']
['68', '欧洲攻略', '马楚成', '梁朝伟、吴亦凡', '848']
['69', '嗝嗝老师', '西达尔特·马尔霍特拉', '拉妮·玛克赫吉、内拉吉·卡比', '595']
['70', '大师兄', '阚家伟', '甄子丹、陈乔恩', '534']
正在爬取7页......
['71', '新乌龙院之笑闹江湖', '朱延平', '王宁、孔连顺', '352']
['72', '名侦探柯南:零的执行人', '立川让', '高山南、山口胜平', '715']
['73', '二代妖精之今生有幸', '肖洋', '冯绍峰、刘亦菲', '1131']
['74', '天气预爆', '肖央', '肖央、杜鹃', '806']
['75', '云南虫谷', '非行', '蔡珩、顾璇', '981']
['76', '叶问外传:张天志', '袁和平', '张晋、戴夫·巴蒂斯塔', '752']
['77', '阿尔法:狼伴归途', '艾尔伯特·休斯', '科迪·斯密特-麦菲、娜塔莎·迈尔兹', '578']
['78', '风语咒', '刘阔', '路知行、阎萌萌', '967']
['79', '胡桃夹子和四个王国', '莱塞·霍尔斯道姆', '麦肯芝·弗依、摩根·弗里曼', '655']
['80', '妖铃铃', '吴君如', '吴君如、沈腾', '1452']
正在爬取8页......
['81', '21克拉', '何念', '郭京飞、迪丽热巴', '433']
['82', '游侠索罗:星球大战外传', '朗·霍华德', '阿尔登·埃伦瑞奇、艾米莉亚·克拉克', '1395']
['83', '水形物语', '吉尔莫·德尔·托罗', '莎莉·霍金斯、迈克尔·珊农', '2947']
['84', '神秘世界历险记4', '王云飞', '阎么么、赵一博', '61']
['85', '马戏之王', '迈克尔·格雷西', '休·杰克曼、米歇尔·威廉姆斯', '2234']
['86', '幸福马上来', '冯巩', '冯巩、涂松岩', '239']
['87', '小偷家族', '是枝裕和', '中川雅也、树木希林', '2244']
['88', '浴血广昌', '高峰', '卢秋宏、何达', '35']
['89', '飓风奇劫', '罗伯·科恩', '托比·凯贝尔、玛姬·格蕾斯', '300']
['90', '厕所英雄', '什里·那拉扬·辛', '阿克谢·库玛尔、布米·佩德卡尔', '618']
正在爬取9页......
['91', '金蝉脱壳2', '史蒂芬·C·米勒', '西尔维斯特·史泰龙、黄晓明', '1637']
['92', '昨日青空', '奚超', '苏尚卿、王一博', '302']
['93', '你好,之华', '岩井俊二', '周迅、秦昊', '962']
['94', '武林怪兽', '刘伟强', '古天乐、陈学冬', '325']
['95', '巴霍巴利王2:终结', 'S·S·拉贾穆里', '帕拉巴斯、拉纳·达格巴帝', '712']
['96', '阿凡提之奇缘历险', '刘炜', '胡谦、李扬', '80']
['97', '雪怪大冒险', '凯利·柯克帕特里克', '查宁·塔图姆、詹姆斯·柯登', '343']
['98', '冰雪女王3:火与冰', '阿列克谢·特斯蒂斯林', '迪·布拉雷·贝克尔、Lori Gardner', '86']
['99', '潜艇总动员:海底两万里', '申宇', '范楚绒、Haitian Hong', '49']
['100', '泄密者', '邱礼涛', '吴镇宇、张智霖', '464']
该次所获的信息用时4.559634447097778秒

爬取电影信息_第3张图片

你可能感兴趣的:(爬虫实战)