vlambda博客
学习文章列表

爬虫实战| 动态网页Ajax+前端框架Bootstrap

今天我们来爬取动态网页-爬取猫眼电影实时票房数据
首先打开 猫眼专业版-实时票房
可以看到黄色的 电影票房一栏是实时更新的。


而当我们查看该网页源代码时,却并没有电影相关的票房等信息
那么可以判断该页面可能使用了 Ajax(即“Asynchronous Javascript And XML”(异步 JavaScript 和 XML))技术,即动态网页(是指跟静态网页相对的一种网页编程技术。

爬虫实战| 动态网页Ajax+前端框架Bootstrap


静态网页,随着html代码的生成,页面的内容和显示效果就基本上不会发生变化了——除非你修改页面代码。
而动态网页则不然,页面代码虽然没有变
但是显示的内容却是可以随着时间、环境或者数据库操作的结果而发生改变)。
我们可以利用浏览器的开发者工具进行分析:

爬虫实战| 动态网页Ajax+前端框架Bootstrap


我们可以发现每隔一段时间都会有一个新的请求,其请求类型都为 xhr,
而 Ajax 的请求类型就是 xhr,
这请求可能就是实时更新的票房信息, 而我们需要的数据可能就在这些文件里,
于是我们选择一个进行分析:

爬虫实战| 动态网页Ajax+前端框架Bootstrap


复制链接打开可以发现这是一个json格式的数据。

爬虫实战| 动态网页Ajax+前端框架Bootstrap


我们想要获取的信息

影片、
上映时间、
综合票房、
票房占比、
排片场次、
排片占比、
场均人次、
上座率、

都包含在list里面。
所以第一步,先获取所有电影信息
url = 'https://piaofang.maoyan.com/dashboard-ajax/movie?orderType=0&uuid=179f8c72776c8-0c35671867296b-5c4f2f15-1fa400-179f8c72776c8'
    headers = {
        'Cookie''_lxsdk_cuid=179f8c72776c8-0c35671867296b-5c4f2f15-1fa400-179f8c72776c8; _lxsdk=F7933F80CA5711EBAC892B26EEC0B00924ED29BDF2F2491A9D76F87D6C9C3FA6; Hm_lvt_703e94591e87be68cc8da0da7cbd0be2=1623376472; Hm_lpvt_703e94591e87be68cc8da0da7cbd0be2=1623376504; __mta=256646836.1623376645061.1623377243341.1623377244495.9; _lxsdk_s=179f8c72777-402-19b-bf1%7C%7C36',
        'Referer''https://piaofang.maoyan.com/dashboard/movie',
        'User-Agent': str(UserAgent().random)
    }
    try:
        resp = requests.get(url, headers=headers)
        if resp.status_code == 200:
            print(resp.json())
        else:
            print('something wrong!')

'''
{'movieList': {'list': [{'avgSeatView': '2.3%', 'avgShowView': '3', 'boxRate': '19.8%', 'boxSplitUnit': {'num': '&#xf488;&#xf378;&#xf7ce;.&#xe41d;&#xee5c;', 'unit': '万'}, 'movieInfo': {'movieId': 1278598, 'movieName': '你好世界', 'releaseInfo': '上映首日'}, 'showCount': 76148, 'showCountRate': '20.4%', 'splitBoxRate': '19.6%', 'splitBoxSplitUnit': {'num': '&#xe059;&#xe967;&#xf378;.&#xe41d;&#xf7ce;', 'unit': '万'}, 'sumBoxDesc': '730.0万', 'sumSplitBoxDesc': '651.4万'}, {'avgSeatView': '2.7%', 'avgShowView': '4', 'boxRate': '13.1%', 'boxSplitUnit': {'num': '&#xe967;&#xf488;&#xf488;.&#xe41d;&#xf378;', 'unit': '万'}, 'movieInfo': {'movieId': 1198179, 'movieName': '阳光姐妹淘', 'releaseInfo': '上映首日'}, 'showCount': 39223, 'showCountRate': '10.5%', 'splitBoxRate': '13.2%', 'splitBoxSplitUnit': {'num': '&#xe967;&#xea59;&#xf378;.&#xf7ce;&#xf378;', 'unit': '万'}, 'sumBoxDesc': '1252.8万', 'sumSplitBoxDesc': '1140.8万'}, {'avgSeatView': '3.3%', 'avgShowView': '4', 'boxRate': '11.2%', 'boxSplitUnit': {'num': '&#xe967;&#xe15d;&#xf488;.&#xe15d;&#xe41d;', 'unit': '万'}, 'movieInfo': {'movieId': 1262861, 'movieName': '候鸟', 'releaseInfo': '上映首日'}, 'showCount': 27781, 'showCountRate': '7.4%', 'splitBoxRate': '11.4%', 'splitBoxSplitUnit': {'num': '&#xea59;&#xf488;&#xe967;.&#xf488;&#xe41d;', 'unit': '万'}, 'sumBoxDesc': '472.9万', 'sumSplitBoxDesc': '440.6万'}, {'avgSeatView': '2.4%', 'avgShowView': '3', 'boxRate': '8.5%', 'boxSplitUnit': {'num': '&#xea59;&#xe15d;&#xf7ce;.&#xe15d;&#xe15d;', 'unit': '万'}, 'movieInfo': {'movieId': 1360592, 'movieName': '当男人恋爱时', 'releaseInfo': '上映首日'}, 'showCount': 31183, 'showCountRate': '8.3%', 'splitBoxRate': '8.4%', 'splitBoxSplitUnit': {'num': '&#xefcb;&#xf488;&#xee5c;.&#xf7ce;&#xe059;', 'unit': '万'}, 'sumBoxDesc': '364.0万', 'sumSplitBoxDesc': '325.3万'}, {'avgSeatView': '2.0%', 'avgShowView': '3', 'boxRate': '7.1%', 'boxSplitUnit': {'num': '&#xefcb;&#xee5c;&#xe41d;.&#xe15d;&#xee5c;', 'unit': '万'}, 'movieInfo': {'movieId': 1225503, 'movieName': '比得兔2:逃跑计划', 'releaseInfo': '上映首日'}, 'showCount': 29735, 'showCountRate': '8.0%', 'splitBoxRate': '7.0%', 'splitBoxSplitUnit': {'num': '&#xefcb;&#xea59;&#xf378;.&#xefcb;&#xea59;', 'unit': '万'}, 'sumBoxDesc': '259.4万', 'sumSplitBoxDesc': '232.6万'}, {'avgSeatView': '2.5%', 'avgShowView': '4', 'boxRate': '6.1%', 'boxSplitUnit': {'num': '&#xefcb;&#xefcb;&#xea59;.&#xf378;&#xea59;', 'unit': '万'}, 'movieInfo': {'movieId': 644174, 'movieName': '黑白魔女库伊拉', 'releaseInfo': '上映6天'}, 'showCount': 17434, 'showCountRate': '4.6%', 'splitBoxRate': '6.0%', 'splitBoxSplitUnit': {'num': '&#xf378;&#xf7ce;&#xf488;.&#xe15d;&#xe967;', 'unit': '万'}, 'sumBoxDesc': '4154.2万', 'sumSplitBoxDesc': '3673.3万'}, {'avgSeatView': '1.2%', 'avgShowView': '3', 'boxRate': '5.8%', 'boxSplitUnit': {'num': '&#xefcb;&#xf378;&#xea59;.&#xee5c;&#xf378;', 'unit': '万'}, 'movieInfo': {'movieId': 343034, 'movieName': '速度与激情9', 'releaseInfo': '上映22天'}, 'showCount': 29324, 'showCountRate': '7.8%', 'splitBoxRate': '5.8%', 'splitBoxSplitUnit': {'num': '&#xf378;&#xf7ce;&#xe15d;.&#xe15d;&#xf7ce;', 'unit': '万'}, 'sumBoxDesc': '13.41亿', 'sumSplitBoxDesc': '11.93亿'}, {'avgSeatView': '47.3%', 'avgShowView': '59', 'boxRate': '5.8%', 'boxSplitUnit': {'num': '&#xefcb;&#xf378;&#xe15d;.&#xee5c;&#xe059;', 'unit': '万'}, 'movieInfo': {'movieId': 1319075, 'movieName': '守岛人', 'releaseInfo': '点映'}, 'showCount': 820, 'showCountRate': '0.2%', 'splitBoxRate': '5.8%', 'splitBoxSplitUnit': {'num': '&#xf378;&#xf7ce;&#xf378;.&#xe41d;&#xf488;', 'unit': '万'}, 'sumBoxDesc': '215.1万', 'sumSplitBoxDesc': '196.4万'}, {'avgSeatView': '1.0%', 'avgShowView': '2', 'boxRate': '5.3%', 'boxSplitUnit': {'num': '&#xf378;&#xf7ce;&#xee5c;.&#xe41d;&#xea59;', 'unit': '万'}, 'movieInfo': {'movieId': 718, 'movieName': '天堂电影院', 'releaseInfo': '上映首日'}, 'showCount': 48470, 'showCountRate': '13.0%', 'splitBoxRate': '5.3%', 'splitBoxSplitUnit': {'num': '&#xf378;&#xf488;&#xee5c;.&#xe059;&#xee5c;', 'unit': '万'}, 'sumBoxDesc': '202.8万', 'sumSplitBoxDesc': '182.0万'}, {'avgSeatView': '1.5%', 'avgShowView': '3', 'boxRate': '3.4%', 'boxSplitUnit': {'num': '&#xf378;&#xefcb;&#xe967;.&#xea59;&#xe059;', 'unit': '万'}, 'movieInfo': {'movieId': 1242151, 'movieName': '寂静之地2', 'releaseInfo': '上映15天'}, 'showCount': 18071, 'showCountRate': '4.8%', 'splitBoxRate': '3.3%', 'splitBoxSplitUnit': {'num': '&#xf378;&#xe15d;&#xf7ce;.&#xefcb;&#xe967;', 'unit': '万'}, 'sumBoxDesc': '2.08亿', 'sumSplitBoxDesc': '1.83亿'}, {'avgSeatView': '3.9%', 'avgShowView': '5', 'boxRate': '3.2%', 'boxSplitUnit': {'num': '&#xf378;&#xf378;&#xe41d;.&#xf488;&#xe15d;', 'unit': '万'}, 'movieInfo': {'movieId': 1298367, 'movieName': '悬崖之上', 'releaseInfo': '上映43天'}, 'showCount': 7517, 'showCountRate': '2.0%', 'splitBoxRate': '3.3%', 'splitBoxSplitUnit': {'num': '&#xf378;&#xe15d;&#xe41d;.&#xf488;&#xf488;', 'unit': '万'}, 'sumBoxDesc': '11.56亿', 'sumSplitBoxDesc': '10.52亿'}, {'avgSeatView': '1.6%', 'avgShowView': '2', 'boxRate': '2.3%', 'boxSplitUnit': {'num': '&#xe41d;&#xe059;.&#xee5c;&#xea59;', 'unit': '万'}, 'movieInfo': {'movieId': 1302134, 'movieName': '哆啦A梦:伴我同行2', 'releaseInfo': '上映15天'}, 'showCount': 14333, 'showCountRate': '3.8%', 'splitBoxRate': '2.3%', 'splitBoxSplitUnit': {'num': '&#xf488;&#xf488;.&#xefcb;&#xefcb;', 'unit': '万'}, 'sumBoxDesc': '2.48亿', 'sumSplitBoxDesc': '2.22亿'}, {'avgSeatView': '2.0%', 'avgShowView': '3', 'boxRate': '1.8%', 'boxSplitUnit': {'num': '&#xe059;&#xee5c;.&#xf7ce;&#xe059;', 'unit': '万'}, 'movieInfo': {'movieId': 247871, 'movieName': '我要我们在一起', 'releaseInfo': '上映23天'}, 'showCount': 8532, 'showCountRate': '2.2%', 'splitBoxRate': '1.8%', 'splitBoxSplitUnit': {'num': '&#xee5c;&#xf7ce;.&#xe059;&#xe967;', 'unit': '万'}, 'sumBoxDesc': '3.19亿', 'sumSplitBoxDesc': '2.87亿'}, {'avgSeatView': '6.3%', 'avgShowView': '7', 'boxRate': '0.9%', 'boxSplitUnit': {'num': '&#xea59;&#xee5c;.&#xee5c;&#xe41d;', 'unit': '万'}, 'movieInfo': {'movieId': 1207687, 'movieName': '普罗米亚', 'releaseInfo': '上映7天'}, 'showCount': 1621, 'showCountRate': '0.4%', 'splitBoxRate': '0.9%', 'splitBoxSplitUnit': {'num': '&#xea59;&#xf378;.&#xefcb;&#xf378;', 'unit': '万'}, 'sumBoxDesc': '953.3万', 'sumSplitBoxDesc': '839.7万'}, {'avgSeatView': '36.3%', 'avgShowView': '32', 'boxRate': '0.6%', 'boxSplitUnit': {'num': '&#xefcb;&#xe967;.&#xea59;&#xe967;', 'unit': '万'}, 'movieInfo': {'movieId': 1279934, 'movieName': '火山地狱', 'releaseInfo': '上映首日'}, 'showCount': 142, 'showCountRate': '<0.1%', 'splitBoxRate': '0.6%', 'splitBoxSplitUnit': {'num': '&#xefcb;&#xefcb;.&#xe967;&#xf7ce;', 'unit': '万'}, 'sumBoxDesc': '24.3万', 'sumSplitBoxDesc': '22.4万'}, {'avgSeatView': '8.1%', 'avgShowView': '9', 'boxRate': '0.4%', 'boxSplitUnit': {'num': '&#xf378;&#xe967;.&#xf7ce;&#xe967;', 'unit': '万'}, 'movieInfo': {'movieId': 1425171, 'movieName': '九零后', 'releaseInfo': '上映14天'}, 'showCount': 524, 'showCountRate': '0.1%', 'splitBoxRate': '0.4%', 'splitBoxSplitUnit': {'num': '&#xf378;&#xe967;.&#xf378;&#xe059;', 'unit': '万'}, 'sumBoxDesc': '484.9万', 'sumSplitBoxDesc': '455.2万'}, {'avgSeatView': '3.3%', 'avgShowView': '4', 'boxRate': '0.3%', 'boxSplitUnit': {'num': '&#xf378;&#xefcb;.&#xefcb;&#xf7ce;', 'unit': '万'}, 'movieInfo': {'movieId': 1259870, 'movieName': '夏夜骑士', 'releaseInfo': '上映首日'}, 'showCount': 1051, 'showCountRate': '0.2%', 'splitBoxRate': '0.3%', 'splitBoxSplitUnit': {'num': '&#xf378;&#xf378;.&#xf378;&#xee5c;', 'unit': '万'}, 'sumBoxDesc': '15.3万', 'sumSplitBoxDesc': '14.1万'}, {'avgSeatView': '0.8%', 'avgShowView': '1', 'boxRate': '0.3%', 'boxSplitUnit': {'num': '&#xf378;&#xf378;.&#xe967;&#xf488;', 'unit': '万'}, 'movieInfo': {'movieId': 1204322, 'movieName': '玄夜狐影', 'releaseInfo': '上映首日'}, 'showCount': 4322, 'showCountRate': '1.1%', 'splitBoxRate': '0.3%', 'splitBoxSplitUnit': {'num': '&#xf378;&#xe15d;.&#xea59;&#xe15d;', 'unit': '万'}, 'sumBoxDesc': '14.5万', 'sumSplitBoxDesc': '13.0万'}, {'avgSeatView': '34.9%', 'avgShowView': '50', 'boxRate': '0.3%', 'boxSplitUnit': {'num': '&#xf378;&#xe15d;.&#xf7ce;&#xf378;', 'unit': '万'}, 'movieInfo': {'movieId': 1284360, 'movieName': '一百零八', 'releaseInfo': '上映28天'}, 'showCount': 42, 'showCountRate': '<0.1%', 'splitBoxRate': '0.3%', 'splitBoxSplitUnit': {'num': '&#xf378;&#xe15d;.&#xf7ce;&#xe15d;', 'unit': '万'}, 'sumBoxDesc': '3047.2万', 'sumSplitBoxDesc': '2979.6万'}, {'avgSeatView': '1.6%', 'avgShowView': '2', 'boxRate': '0.2%', 'boxSplitUnit': {'num': '&#xf7ce;.&#xf488;&#xf378;', 'unit': '万'}, 'movieInfo': {'movieId': 1300146, 'movieName': '白蛇传·情', 'releaseInfo': '上映23天'}, 'showCount': 1635, 'showCountRate': '0.4%', 'splitBoxRate': '0.2%', 'splitBoxSplitUnit': {'num': '&#xe41d;.&#xe41d;&#xf488;', 'unit': '万'}, 'sumBoxDesc': '1425.2万', 'sumSplitBoxDesc': '1294.1万'}, {'avgSeatView': '0.3%', 'avgShowView': '1', 'boxRate': '0.2%', 'boxSplitUnit': {'num': '&#xf7ce;.&#xe15d;&#xf378;', 'unit': '万'}, 'movieInfo': {'movieId': 1376728, 'movieName': '奋斗吧中华儿女', 'releaseInfo': '上映5天'}, 'showCount': 4950, 'showCountRate': '1.3%', 'splitBoxRate': '0.2%', 'splitBoxSplitUnit': {'num': '&#xe41d;.&#xf7ce;&#xf488;', 'unit': '万'}, 'sumBoxDesc': '437.6万', 'sumSplitBoxDesc': '435.2万'}, {'avgSeatView': '2.8%', 'avgShowView': '3', 'boxRate': '0.1%', 'boxSplitUnit': {'num': '&#xe059;.&#xe41d;&#xe059;', 'unit': '万'}, 'movieInfo': {'movieId': 1346626, 'movieName': '扫黑·决战', 'releaseInfo': '上映42天'}, 'showCount': 845, 'showCountRate': '0.2%', 'splitBoxRate': '0.1%', 'splitBoxSplitUnit': {'num': '&#xe059;.&#xf378;&#xe059;', 'unit': '万'}, 'sumBoxDesc': '4.05亿', 'sumSplitBoxDesc': '3.59亿'}, {'avgSeatView': '18.1%', 'avgShowView': '22', 'boxRate': '0.1%', 'boxSplitUnit': {'num': '&#xe059;.&#xf488;&#xee5c;', 'unit': '万'}, 'movieInfo': {'movieId': 1251152, 'movieName': '柳青', 'releaseInfo': '上映22天'}, 'showCount': 102, 'showCountRate': '<0.1%', 'splitBoxRate': '0.2%', 'splitBoxSplitUnit': {'num': '&#xe059;.&#xe059;&#xee5c;', 'unit': '万'}, 'sumBoxDesc': '164.8万', 'sumSplitBoxDesc': '162.2万'}, {'avgSeatView': '3.5%', 'avgShowView': '3', 'boxRate': '0.1%', 'boxSplitUnit': {'num': '&#xe967;.&#xe41d;&#xea59;', 'unit': '万'}, 'movieInfo': {'movieId': 1319, 'movieName': '情书', 'releaseInfo': ''}, 'showCount': 490, 'showCountRate': '0.1%', 'splitBoxRate': '0.1%', 'splitBoxSplitUnit': {'num': '&#xe967;.&#xefcb;&#xe41d;', 'unit': '万'}, 'sumBoxDesc': '6397.4万', 'sumSplitBoxDesc': '5650.6万'}, {'avgSeatView': '16.5%', 'avgShowView': '19', 'boxRate': '0.1%', 'boxSplitUnit': {'num': '&#xe967;.&#xee5c;&#xe15d;', 'unit': '万'}, 'movieInfo': {'movieId': 1399225, 'movieName': '永远是少年', 'releaseInfo': '上映28天'}, 'showCount': 58, 'showCountRate': '<0.1%', 'splitBoxRate': '0.1%', 'splitBoxSplitUnit': {'num': '&#xe967;.&#xee5c;&#xe15d;', 'unit': '万'}, 'sumBoxDesc': '342.9万', 'sumSplitBoxDesc': '342.1万'}, {'avgSeatView': '60.6%', 'avgShowView': '176', 'boxRate': '<0.1%', 'boxSplitUnit': {'num': '&#xea59;.&#xea59;&#xe15d;', 'unit': '万'}, 'movieInfo': {'movieId': 1418015, 'movieName': '青云之梦', 'releaseInfo': '上映35天'}, 'showCount': 5, 'showCountRate': '<0.1%', 'splitBoxRate': '<0.1%', 'splitBoxSplitUnit': {'num': '&#xea59;.&#xe15d;&#xea59;', 'unit': '万'}, 'sumBoxDesc': '11.3万', 'sumSplitBoxDesc': '11.0万'}, {'avgSeatView': '1.5%', 'avgShowView': '2', 'boxRate': '<0.1%', 'boxSplitUnit': {'num': '&#xea59;.&#xe15d;&#xe059;', 'unit': '万'}, 'movieInfo': {'movieId': 1226046, 'movieName': '人之怒', 'releaseInfo': '上映33天'}, 'showCount': 615, 'showCountRate': '0.1%', 'splitBoxRate': '<0.1%', 'splitBoxSplitUnit': {'num': '&#xefcb;.&#xe059;&#xee5c;', 'unit': '万'}, 'sumBoxDesc': '1.62亿', 'sumSplitBoxDesc': '1.43亿'}, {'avgSeatView': '19.6%', 'avgShowView': '26', 'boxRate': '<0.1%', 'boxSplitUnit': {'num': '&#xefcb;.&#xf7ce;&#xf7ce;', 'unit': '万'}, 'movieInfo': {'movieId': 361, 'movieName': '上甘岭', 'releaseInfo': ''}, 'showCount': 36, 'showCountRate': '<0.1%', 'splitBoxRate': '<0.1%', 'splitBoxSplitUnit': {'num': '&#xefcb;.&#xf488;&#xefcb;', 'unit': '万'}, 'sumBoxDesc': '28.7万', 'sumSplitBoxDesc': '27.6万'}, {'avgSeatView': '36.3%', 'avgShowView': '94', 'boxRate': '<0.1%', 'boxSplitUnit': {'num': '&#xefcb;.&#xe967;&#xee5c;', 'unit': '万'}, 'movieInfo': {'movieId': 1327499, 'movieName': '大事', 'releaseInfo': '上映92天'}, 'showCount': 7, 'showCountRate': '<0.1%', 'splitBoxRate': '<0.1%', 'splitBoxSplitUnit': {'num': '&#xefcb;.&#xefcb;&#xee5c;', 'unit': '万'}, 'sumBoxDesc': '761.8万', 'sumSplitBoxDesc': '759.5万'}, {'avgSeatView': '0.6%', 'avgShowView': '1', 'boxRate': '<0.1%', 'boxSplitUnit': {'num': '&#xefcb;.&#xe967;&#xea59;', 'unit': '万'}, 'movieInfo': {'movieId': 1355789, 'movieName': '岁月在这儿', 'releaseInfo': '上映15天'}, 'showCount': 883, 'showCountRate': '0.2%', 'splitBoxRate': '<0.1%', 'splitBoxSplitUnit': {'num': '&#xefcb;.&#xea59;&#xe967;', 'unit': '万'}, 'sumBoxDesc': '99.9万', 'sumSplitBoxDesc': '95.7万'}, {'avgSeatView': '3.5%', 'avgShowView': '6', 'boxRate': '<0.1%', 'boxSplitUnit': {'num': '&#xefcb;.&#xefcb;&#xefcb;', 'unit': '万'}, 'movieInfo': {'movieId': 428, 'movieName': '指环王:王者无敌', 'releaseInfo': ''}, 'showCount': 85, 'showCountRate': '<0.1%', 'splitBoxRate': '<0.1%', 'splitBoxSplitUnit': {'num': '&#xf378;.&#xf7ce;&#xe41d;', 'unit': '万'}, 'sumBoxDesc': '1.19亿', 'sumSplitBoxDesc': '1.16亿'}, {'avgSeatView': '0.4%', 'avgShowView': '1', 'boxRate': '<0.1%', 'boxSplitUnit': {'num': '&#xf378;.&#xf7ce;&#xefcb;', 'unit': '万'}, 'movieInfo': {'movieId': 1297907, 'movieName': '有一点动心', 'releaseInfo': '上映9天'}, 'showCount': 1204, 'showCountRate': '0.3%', 'splitBoxRate': '<0.1%', 'splitBoxSplitUnit': {'num': '&#xf378;.&#xf488;&#xee5c;', 'unit': '万'}, 'sumBoxDesc': '1432.3万', 'sumSplitBoxDesc': '1307.4万'}, {'avgSeatView': '4.6%', 'avgShowView': '6', 'boxRate': '<0.1%', 'boxSplitUnit': {'num': '&#xf378;.&#xe059;&#xe967;', 'unit': '万'}, 'movieInfo': {'movieId': 1182552, 'movieName': '红海行动', 'releaseInfo': ''}, 'showCount': 174, 'showCountRate': '<0.1%', 'splitBoxRate': '<0.1%', 'splitBoxSplitUnit': {'num': '&#xf378;.&#xe967;&#xe967;', 'unit': '万'}, 'sumBoxDesc': '36.51亿', 'sumSplitBoxDesc': '34.22亿'}, {'avgSeatView': '13.0%', 'avgShowView': '17', 'boxRate': '<0.1%', 'boxSplitUnit': {'num': '&#xf378;.&#xee5c;&#xee5c;', 'unit': '万'}, 'movieInfo': {'movieId': 1263778, 'movieName': '毛泽东在才溪', 'releaseInfo': '上映35天'}, 'showCount': 24, 'showCountRate': '<0.1%', 'splitBoxRate': '<0.1%', 'splitBoxSplitUnit': {'num': '&#xf378;.&#xe967;&#xea59;', 'unit': '万'}, 'sumBoxDesc': '41.6万', 'sumSplitBoxDesc': '41.5万'}, {'avgSeatView': '3.0%', 'avgShowView': '3', 'boxRate': '<0.1%', 'boxSplitUnit': {'num': '&#xf378;.&#xee5c;&#xf378;', 'unit': '万'}, 'movieInfo': {'movieId': 1397893, 'movieName': '童年周恩来', 'releaseInfo': '上映11天'}, 'showCount': 209, 'showCountRate': '<0.1%', 'splitBoxRate': '<0.1%', 'splitBoxSplitUnit': {'num': '&#xf378;.&#xe967;&#xe15d;', 'unit': '万'}, 'sumBoxDesc': '131.2万', 'sumSplitBoxDesc': '122.0万'}, {'avgSeatView': '7.8%', 'avgShowView': '11', 'boxRate': '<0.1%', 'boxSplitUnit': {'num': '&#xf378;.&#xe967;&#xf7ce;', 'unit': '万'}, 'movieInfo': {'movieId': 1277515, 'movieName': '青春之骏', 'releaseInfo': '上映53天'}, 'showCount': 37, 'showCountRate': '<0.1%', 'splitBoxRate': '<0.1%', 'splitBoxSplitUnit': {'num': '&#xf378;.&#xea59;&#xf488;', 'unit': '万'}, 'sumBoxDesc': '184.2万', 'sumSplitBoxDesc': '183.2万'}, {'avgSeatView': '1.1%', 'avgShowView': '2', 'boxRate': '<0.1%', 'boxSplitUnit': {'num': '&#xf378;.&#xefcb;&#xf378;', 'unit': '万'}, 'movieInfo': {'movieId': 1156913, 'movieName': '匹诺曹', 'releaseInfo': '上映11天'}, 'showCount': 386, 'showCountRate': '0.1%', 'splitBoxRate': '<0.1%', 'splitBoxSplitUnit': {'num': '&#xf378;.&#xe15d;&#xf7ce;', 'unit': '万'}, 'sumBoxDesc': '1651.1万', 'sumSplitBoxDesc': '1476.1万'}, {'avgSeatView': '2.7%', 'avgShowView': '3', 'boxRate': '<0.1%', 'boxSplitUnit': {'num': '&#xf378;.&#xf378;&#xf7ce;', 'unit': '万'}, 'movieInfo': {'movieId': 1428010, 'movieName': '疯狂海盗团', 'releaseInfo': '上映14天'}, 'showCount': 155, 'showCountRate': '<0.1%', 'splitBoxRate': '<0.1%', 'splitBoxSplitUnit': {'num': '&#xf378;.&#xe15d;&#xf488;', 'unit': '万'}, 'sumBoxDesc': '352.4万', 'sumSplitBoxDesc': '316.3万'}, {'avgSeatView': '20.1%', 'avgShowView': '29', 'boxRate': '<0.1%', 'boxSplitUnit': {'num': '&#xf378;.&#xf378;&#xe41d;', 'unit': '万'}, 'movieInfo': {'movieId': 1356007, 'movieName': '99万次拥抱', 'releaseInfo': '上映15天'}, 'showCount': 15, 'showCountRate': '<0.1%', 'splitBoxRate': '<0.1%', 'splitBoxSplitUnit': {'num': '&#xf378;.&#xe15d;&#xe059;', 'unit': '万'}, 'sumBoxDesc': '81.6万', 'sumSplitBoxDesc': '81.4万'}, {'avgSeatView': '12.7%', 'avgShowView': '16', 'boxRate': '<0.1%', 'boxSplitUnit': {'num': '&#xf378;.&#xf378;&#xe059;', 'unit': '万'}, 'movieInfo': {'movieId': 1197625, 'movieName': '血战湘江', 'releaseInfo': ''}, 'showCount': 31, 'showCountRate': '<0.1%', 'splitBoxRate': '<0.1%', 'splitBoxSplitUnit': {'num': '&#xe15d;.&#xf7ce;&#xf488;', 'unit': '万'}, 'sumBoxDesc': '7494.3万', 'sumSplitBoxDesc': '7473.5万'}], 'nationBoxInfo': {'nationBoxSplitUnit': {'num': '&#xea59;&#xe059;&#xefcb;&#xe41d;.&#xf488;', 'unit': '万'}, 'nationSplitBoxSplitUnit': {'num': '&#xea59;&#xefcb;&#xe059;&#xee5c;.&#xe059;', 'unit': '万'}, 'showCountDesc': '37.1万', 'title': '实时大盘', 'viewCountDesc': '101.9万'}, 'updateInfo': {'updateGapSecond': 3, 'updateTimestamp': 1623390979297}}, 'movieInfo': {'boxTrends': [{'box': 7036814, 'boxDesc': '703.6万', 'date': 20210611, 'releaseDay': True}], 'movieInfo': {'category': '爱情,奇幻,动画', 'imgUrl': 'http://p0.meituan.net/w.h/movie/cc08f286aea37c3355fb4bb2441aef3f3457731.jpg', 'movieId': 1278598, 'name': '你好世界', 'releaseInfo': '上映首日'}}, 'calendar': {'selectDate': '2021-06-11', 'selectMaxDate': '2021-08-10', 'selectMinDate': '2020-06-11', 'today': '2021-06-11'}, 'fontStyle': '@font-face{font-family: "mtsi-font";src:url("//s3plus.meituan.net/v1/mss_73a511b8f91f43d0bdae92584ea6330b/font/27c9b1fe.eot");src:url("//s3plus.meituan.net/v1/mss_73a511b8f91f43d0bdae92584ea6330b/font/27c9b1fe.eot?#iefix") format("embedded-opentype"),url("//s3plus.meituan.net/v1/mss_73a511b8f91f43d0bdae92584ea6330b/font/27c9b1fe.woff");}'}
'''


可以看到已经成功的获取到了全部的影片信息。

获取对应的 JSON 数据后,下面对该 JSON 数据进行提取:
movies = json['movieList']['list']
    for item in movies:
        piaofang = {}
        piaofang['影片'] = item['movieInfo']['movieName']
        piaofang['上映时间'] = item['movieInfo']['releaseInfo']
        piaofang['综合票房'] = item['sumBoxDesc']
        piaofang['票房占比'] = item['boxRate']
        piaofang['排片场次'] = item['showCount']
        piaofang['排片占比'] = item['showCountRate']
        piaofang['场均人次'] = item['avgShowView']
        piaofang['上座率'] = item['avgSeatView']
        print(piaofang)
'''
{'影片': '你好世界', '上映时间': '上映首日', '综合票房': '740.9万', '票房占比': '19.7%', '排片场次': 76164, '排片占比': '20.4%', '场均人次': '3', '上座率': '2.3%'}
{'影片': '阳光姐妹淘', '上映时间': '上映首日', '综合票房': '1266.2万', '票房占比': '13.3%', '排片场次': 39245, '排片占比': '10.5%', '场均人次': '4', '上座率': '2.8%'}
{'影片': '候鸟', '上映时间': '上映首日', '综合票房': '473.7万', '票房占比': '11.0%', '排片场次': 27779, '排片占比': '7.4%', '场均人次': '4', '上座率': '3.3%'}
{'影片': '当男人恋爱时', '上映时间': '上映首日', '综合票房': '366.9万', '票房占比': '8.4%', '排片场次': 31200, '排片占比': '8.3%', '场均人次': '3', '上座率': '2.4%'}
{'影片': '比得兔2:逃跑计划', '上映时间': '上映首日', '综合票房': '261.4万', '票房占比': '7.0%', '排片场次': 29730, '排片占比': '8.0%', '场均人次': '3', '上座率': '2.1%'}
{'影片': '黑白魔女库伊拉', '上映时间': '上映6天', '综合票房': '4161.3万', '票房占比': '6.2%', '排片场次': 17448, '排片占比': '4.6%', '场均人次': '4', '上座率': '2.6%'}
{'影片': '速度与激情9', '上映时间': '上映22天', '综合票房': '13.41亿', '票房占比': '6.0%', '排片场次': 29319, '排片占比': '7.8%', '场均人次': '3', '上座率': '1.2%'}
{'影片': '守岛人', '上映时间': '点映', '综合票房': '215.1万', '票房占比': '5.7%', '排片场次': 822, '排片占比': '0.2%', '场均人次': '59', '上座率': '47.3%'}
{'影片': '天堂电影院', '上映时间': '上映首日', '综合票房': '205.9万', '票房占比': '5.3%', '排片场次': 48460, '排片占比': '13.0%', '场均人次': '2', '上座率': '1.0%'}
{'影片': '寂静之地2', '上映时间': '上映15天', '综合票房': '2.08亿', '票房占比': '3.4%', '排片场次': 18082, '排片占比': '4.8%', '场均人次': '3', '上座率': '1.5%'}
{'影片': '悬崖之上', '上映时间': '上映43天', '综合票房': '11.56亿', '票房占比': '3.2%', '排片场次': 7524, '排片占比': '2.0%', '场均人次': '5', '上座率': '3.9%'}
{'影片': '哆啦A梦:伴我同行2', '上映时间': '上映15天', '综合票房': '2.48亿', '票房占比': '2.4%', '排片场次': 14341, '排片占比': '3.8%', '场均人次': '2', '上座率': '1.6%'}
{'影片': '我要我们在一起', '上映时间': '上映23天', '综合票房': '3.19亿', '票房占比': '1.8%', '排片场次': 8542, '排片占比': '2.2%', '场均人次': '3', '上座率': '2.1%'}
{'影片': '普罗米亚', '上映时间': '上映7天', '综合票房': '953.8万', '票房占比': '0.9%', '排片场次': 1623, '排片占比': '0.4%', '场均人次': '7', '上座率': '6.3%'}
{'影片': '火山地狱', '上映时间': '上映首日', '综合票房': '24.3万', '票房占比': '0.6%', '排片场次': 142, '排片占比': '<0.1%', '场均人次': '32', '上座率': '36.3%'}
{'影片': '九零后', '上映时间': '上映14天', '综合票房': '485.1万', '票房占比': '0.4%', '排片场次': 525, '排片占比': '0.1%', '场均人次': '9', '上座率': '8.2%'}
{'影片': '夏夜骑士', '上映时间': '上映首日', '综合票房': '15.3万', '票房占比': '0.3%', '排片场次': 1051, '排片占比': '0.2%', '场均人次': '4', '上座率': '3.3%'}
{'影片': '玄夜狐影', '上映时间': '上映首日', '综合票房': '14.6万', '票房占比': '0.3%', '排片场次': 4322, '排片占比': '1.1%', '场均人次': '1', '上座率': '0.8%'}
{'影片': '一百零八', '上映时间': '上映28天', '综合票房': '3047.2万', '票房占比': '0.2%', '排片场次': 42, '排片占比': '<0.1%', '场均人次': '50', '上座率': '34.9%'}
{'影片': '白蛇传·情', '上映时间': '上映23天', '综合票房': '1425.4万', '票房占比': '0.2%', '排片场次': 1637, '排片占比': '0.4%', '场均人次': '2', '上座率': '1.6%'}
{'影片': '奋斗吧中华儿女', '上映时间': '上映5天', '综合票房': '437.6万', '票房占比': '0.2%', '排片场次': 4950, '排片占比': '1.3%', '场均人次': '1', '上座率': '0.3%'}
{'影片': '扫黑·决战', '上映时间': '上映42天', '综合票房': '4.05亿', '票房占比': '0.1%', '排片场次': 847, '排片占比': '0.2%', '场均人次': '3', '上座率': '2.8%'}
{'影片': '柳青', '上映时间': '上映22天', '综合票房': '164.8万', '票房占比': '0.1%', '排片场次': 102, '排片占比': '<0.1%', '场均人次': '22', '上座率': '18.1%'}
{'影片': '情书', '上映时间': '', '综合票房': '6397.4万', '票房占比': '0.1%', '排片场次': 491, '排片占比': '0.1%', '场均人次': '3', '上座率': '3.5%'}
{'影片': '永远是少年', '上映时间': '上映28天', '综合票房': '342.9万', '票房占比': '0.1%', '排片场次': 59, '排片占比': '<0.1%', '场均人次': '19', '上座率': '16.5%'}
{'影片': '青云之梦', '上映时间': '上映35天', '综合票房': '11.3万', '票房占比': '<0.1%', '排片场次': 5, '排片占比': '<0.1%', '场均人次': '176', '上座率': '60.6%'}
{'影片': '上甘岭', '上映时间': '', '综合票房': '28.8万', '票房占比': '<0.1%', '排片场次': 36, '排片占比': '<0.1%', '场均人次': '27', '上座率': '20.6%'}
{'影片': '人之怒', '上映时间': '上映33天', '综合票房': '1.62亿', '票房占比': '<0.1%', '排片场次': 615, '排片占比': '0.1%', '场均人次': '2', '上座率': '1.6%'}
{'影片': '大事', '上映时间': '上映92天', '综合票房': '761.8万', '票房占比': '<0.1%', '排片场次': 7, '排片占比': '<0.1%', '场均人次': '94', '上座率': '36.3%'}
{'影片': '岁月在这儿', '上映时间': '上映15天', '综合票房': '99.9万', '票房占比': '<0.1%', '排片场次': 882, '排片占比': '0.2%', '场均人次': '1', '上座率': '0.6%'}
{'影片': '指环王:王者无敌', '上映时间': '', '综合票房': '1.19亿', '票房占比': '<0.1%', '排片场次': 85, '排片占比': '<0.1%', '场均人次': '6', '上座率': '3.5%'}
{'影片': '毛泽东在才溪', '上映时间': '上映35天', '综合票房': '42.1万', '票房占比': '<0.1%', '排片场次': 24, '排片占比': '<0.1%', '场均人次': '22', '上座率': '17.4%'}
{'影片': '有一点动心', '上映时间': '上映9天', '综合票房': '1432.4万', '票房占比': '<0.1%', '排片场次': 1203, '排片占比': '0.3%', '场均人次': '1', '上座率': '0.4%'}
{'影片': '红海行动', '上映时间': '', '综合票房': '36.51亿', '票房占比': '<0.1%', '排片场次': 173, '排片占比': '<0.1%', '场均人次': '6', '上座率': '4.6%'}
{'影片': '童年周恩来', '上映时间': '上映11天', '综合票房': '131.2万', '票房占比': '<0.1%', '排片场次': 209, '排片占比': '<0.1%', '场均人次': '3', '上座率': '3.0%'}
{'影片': '青春之骏', '上映时间': '上映53天', '综合票房': '184.2万', '票房占比': '<0.1%', '排片场次': 37, '排片占比': '<0.1%', '场均人次': '11', '上座率': '7.8%'}
{'影片': '匹诺曹', '上映时间': '上映11天', '综合票房': '1651.2万', '票房占比': '<0.1%', '排片场次': 386, '排片占比': '0.1%', '场均人次': '2', '上座率': '1.1%'}
{'影片': '疯狂海盗团', '上映时间': '上映14天', '综合票房': '352.4万', '票房占比': '<0.1%', '排片场次': 155, '排片占比': '<0.1%', '场均人次': '3', '上座率': '2.7%'}
{'影片': '99万次拥抱', '上映时间': '上映15天', '综合票房': '81.6万', '票房占比': '<0.1%', '排片场次': 15, '排片占比': '<0.1%', '场均人次': '29', '上座率': '20.1%'}
{'影片': '血战湘江', '上映时间': '', '综合票房': '7494.3万', '票房占比': '<0.1%', '排片场次': 31, '排片占比': '<0.1%', '场均人次': '16', '上座率': '12.7%'}
{'影片': '英雄儿女', '上映时间': '', '综合票房': '21.7万', '票房占比': '<0.1%', '排片场次': 7, '排片占比': '<0.1%', '场均人次': '51', '上座率': '36.5%'}
'''


接下来我们就将提取好的票房信息存储为格式化的 HTML 文件:
  '''
    存储格式化的电影票房数据HTML文件
    :param results: 电影票房数据的生成器
    :return: None
    '''

    rows = ''
    for piaofang in results:
        # 利用Python中的format字符串填充html表格中的内容
        row = '<tr><td>{}</td><td>{}</td><td>{}</td><td>{}</td><td>{}</td><td>{}</td><td>{}</td><td>{}</td></tr>'.format(piaofang['影片'],
                                                                                                                         piaofang['上映时间'],
                                                                                                                         piaofang['综合票房'],
                                                                                                                         piaofang['票房占比'],
                                                                                                                         piaofang['排片场次'],
                                                                                                                         piaofang['排片占比'],
                                                                                                                         piaofang['场均人次'],
                                                                                                                         piaofang['上座率'])
        # 利用字符串拼接循环存储每个格式化的电影票房信息
        rows = rows + '\n' + row
    # 利用字符串拼接处格式化的HTML页面
    piaofang_html = '''
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>电影票房</title>

    </head>
    <body>
        <style>
        .table1_8 table {
            width:100%;
            margin:15px 0
        }
        .table1_8 th {
            background-color:#00BFFF;
            color:#FFFFFF
        }
        .table1_8,.table1_8 th,.table1_8 td
        {
            font-size:0.95em;
            text-align:center;
            padding:4px;
            border:1px solid #dddddd;
            border-collapse:collapse
        }
        .table1_8 tr:nth-child(odd){
            background-color:#aae9fe;
        }
        .table1_8 tr:nth-child(even){
            background-color:#fdfdfd;
        }
        </style>
        <table class='table1_8'>
        <tr>
        <th>影片</th>
        <th>上映时间</th>
        <th>综合票房</th>
        <th>票房占比</th>
        <th>排片场次</th>
        <th>排片占比</th>
        <th>场均人次</th>
        <th>上座率</th>
        </tr>
        '''
 + rows + '''
        </table>
    </body>
    </html>
    '''

    # 存储已经格式化的html页面
    with open('piaofang.html''w', encoding='utf-8'as f:
        f.write(piaofang_html)



浏览器打开生成的 piaofang.html 页面
这页面丑的跟我一样爬虫实战| 动态网页Ajax+前端框架Bootstrap,不忍直视啊!

爬虫实战| 动态网页Ajax+前端框架Bootstrap


我记得前端框架 Bootstrap 里面有好多的排版和样式,咱们一起去瞅瞅
传送门:
https://www.runoob.com/bootstrap/bootstrap-navbar.html

我们随便选一个

爬虫实战| 动态网页Ajax+前端框架Bootstrap


导入我们爬虫获取到的数据,最后的页面就是这个样子的。

爬虫实战| 动态网页Ajax+前端框架Bootstrap


或者是这个样子的

爬虫实战| 动态网页Ajax+前端框架Bootstrap

就酱紫。。。
你也可以根据自己的需要给它加上颜色啦、改变字体啦、
添加背景图片啦等等。
目的只有一个,让你的页面更具有吸引力!

回复关键词 「linux」,即可获取 185 页 Linux 工具快速教程手册和154页的Linux笔记。


回复关键词 「Python进阶」,即可获取 106 页 Python 进阶文档 PDF


回复关键词 「Python面试题」,即可获取最新 100道 面试题 PDF


回复关键词 「python数据分析」,即可获取47页python数据分析与自然语言处理的 PDF


回复关键词 「python爬虫」,满满五份PPT爬虫教程和70多个案例


回复关键词 「Python最强基础学习文档」,即可获取 168 页 Python 最强基础学习文档 PDF,让你快速入门Python