爬取时光网电影信息

本文详细介绍了如何爬取时光网评分在7-10分的电影信息,包括找到AJAX请求的URL,解析HTML内容,实现翻页,保存数据到Excel,以及如何将数据导入MySQL数据库。在爬虫过程中遇到的反爬机制和一些问题也进行了讨论。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

要求:

通过时光网爬取每年评分在7-10分之间的电影信息(电影名/链接/评分)

第一步 寻找URL

时光网的分类查询页面:http://movie.mtime.com/movie/search/section/#

时光网的页面是通过AJAX异步加载的,在浏览器上关闭JAVASCRPIT 会发现网页变成如下的样子(图1),如果直接用request对上面的URL进行请求,只能得到这个页面的HTML代码,但是这个页面是没有分类查询的任何功能和信息的。

图1
在这里插入图片描述
要找到分类查询真正请求的URL 需要去审查元素中的NETWORK中寻找。
在网页内筛选后(我这里按2015年 评分7-10分进行筛选)。在NETWORK中刷新后得到响应文件,可以看到下面红圈中(图2)都是筛选结果的电影海报图片。

图2
在这里插入图片描述
在这些JPG上面有一个叫search.msc?..的文件,点进去粗略地看了下response,能看到电影名称,感觉应该就是这个文件了。再进一步查看这个文件请求的URL(图3),很长一段,直接在浏览器中访问这个链接(图4) 又获得一大段HTML代码。可以看到这段代码里有我们需要的所有信息了(电影名称/链接/评分/年代),所以这才是我们需要用request进行请求的URL

图3
在这里插入图片描述
图4
在这里插入图片描述

第二步 解析页面

接下来就是对这段代码进行解析了;因为这段HTML 代码拿回来其实是以字典形式的文本呈现的,所以我还是用正则表达式去抓我们需要的信息。这里的正则表达式并不难,需要注意的是评分是分整数和小数的。把抓取到的内容都放在movie_info变量中,再把movie_info放到movie_list列表中

import re
name_pattern = re.compile(r'<a title=\\"(.*?)/[\s\S]*?href=\\"(.*?)\\"[\s\S]*?class=total>(\d)<[\s\S]*?class=total2>(.*?)<[\s\S]*?span class=\\"c_666\\">\((.*?)\)<')
movie_info=name_pattern.findall(response)
movie_list.extend(movie_info)

第三步 实现翻页

虽然URL很长,但大部分都是不变的,主要还是通过比较不同页的URL之间的区别,找到控制页码/年代/评分的参数,在后续写for循环的时候用变量替换。具体区别如下

在这里插入图片描述
黄色标注是固定不变的,蓝色部分是相关参数,year/rating/pageindex/t分别代表了年代/评分/页数/请求的时间,后面灰色部分看augument就知道也是参数,一共20个参数,其中也有代表年代/评分/页数的参数(图中标蓝的部分),在翻页时需要同步更改,具体每个AUGMENT控制了哪个变量在我不断的尝试下终于弄清了大部分,具体如下,

Ajax_CallBackArgument2: 国家/地区,如美国275,中国138
Ajax_CallBackArgument3: 类型
Ajax_CallBackArgument4:分级
Ajax_CallBackArgument5:对白语言
Ajax_CallBackArgument6:色彩
Ajax_CallBackArgument7:声音
Ajax_CallBackArgument9:起始年份
Ajax_CallBackArgument10:截止年份
Ajax_CallBackArgument11:评分下限
Ajax_CallBackArgument12:评分上限
Ajax_CallBackArgument14:中文名首字母
Ajax_CallBackArgument16: 英文名首字母
Ajax_CallBackArgument17:排序方法·
Ajax_CallBackArgument18:页数

我觉得很很奇怪,为什么同一个变量要在两个地方进行控制呢?后来我发现即使URL少了蓝色的部分(year%3D2015%26rating%3D7_10&t=201910320473241565),似乎也不影响请求,不过我后面的代码还是先留着了。

找到了翻页的规律,我们只要在URL对应的位置换成变量就行了,
还有个问题是我怎么知道这一页是最后一页呢?查看最后一页的URL,发现最后一页有一行特有的HTML代码<a class=\“mr10 false\”>下一页,所以只要加一个if语句,如果正则表达式能抓到这段,就说明时最后一页,那么就

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值