周六周天身边同事阳了一批,自己也啥也没干,昨晚又手痒了,敲了会代码,在这分享一下!
废话不多说:
第一步分析列表页:某瓣排行榜影片不分第几页了,跟微博一样,是发送Ajax请求用JS渲染的,特点就是下拉加载只刷新部分内容,检查网页,进入NetWork,选择XHR,然后下拉让网页刷新几下,会发现几个特殊的XHR请求,典型的Ajax,双击每个请求分析url得到每页的关系,也很容易请求到每页的网址了。
1671408207372.jpg (68.38 KB, 下载次数: 0)
下载附件
2022-12-19 08:04 上传
第二步分析详情页:详情页正常的requests.get访问,即可拿到源代码,影评什么的都在里边,这个不需要多解释了直接拿,通过查看列表页的js代码可以看到详情页的url在每个电影数据里的url:数据下,我们直接遍历列表页的每个电影数据,然后get("url")就可拿到。其余的就是苦逼的代码时间。
1671408647473.png (60.76 KB, 下载次数: 0)
下载附件
2022-12-19 08:10 上传
image.png (69.07 KB, 下载次数: 0)
下载附件
2022-12-19 08:12 上传
第三步写代码:
①导入库:time只用sleep上个帖子说过了,requests请求库会爬虫的都会,没用过logging可以到网上查查很好用的一个日志库比print好用,pyquery可以简单拿到网页数据,pymongo操作数据库的
1671408953426.jpg (20.69 KB, 下载次数: 0)
下载附件
2022-12-19 08:15 上传
②定义全局变量:MONGO_CONNECTION_STRING连接数据库的地址,每个人的数据库在本地打开都是这个连接;MONGODB_NAME数据库集合名称;client、db、collection连接数据库;logging.basicConfig定义日志输出格式;LIMIT每页显示的数据数量;TOTAL_PAGE要爬取的页面数量;REQUEST_URL这个是为了跳过404页面的后边说;Headers、proxies不用多说了
1671409289944.jpg (76.46 KB, 下载次数: 0)
下载附件
2022-12-19 08:21 上传
③定义每页的请求函数:这个地方我想写一个函数来着,详情页返回html代码列表页返回json我去网上搜了怎么判断是json数据然后写入之后发现不对,就写了两个函数,两个函数还是有必要的,因为详情页和列表页考虑的不一样,分开更具有代表性。
抓取列表页的json数据:判断网页响应状态输出对应异常状态方便处理
image.png (69.99 KB, 下载次数: 0)
下载附件
2022-12-19 08:32 上传
抓取html数据:检测到404可以直接return的,我本来写的是让程序请求两遍,请求不到再return来着,后来发现没必要,凑合看,哈哈
image.png (87.54 KB, 下载次数: 0)
下载附件
2022-12-19 08:35 上传
④定义url拼接函数:接受页码,拼接每页的url,找到关系很简单
1671410303106.jpg (29.32 KB, 下载次数: 0)
下载附件
2022-12-19 08:39 上传
⑤定义详情页数据抓取函数:不再多说自己看看详情页代码这里很简单,空字符不跳过会异常(异常都显示None,且代码会停)
image.png (77.59 KB, 下载次数: 0)
下载附件
2022-12-19 08:40 上传
⑥定义保存数据到MongoDB的函数:空字符不跳过会异常(异常都显示None,且代码会停)
1671410534559.jpg (27.43 KB, 下载次数: 0)
下载附件
2022-12-19 08:41 上传
⑦定义主函数串联加翻页:
[color=]这里实际抓了十页,输出的确是9页,是我忘记把输出页码加一了
image.png (53.83 KB, 下载次数: 0)
下载附件
2022-12-19 08:48 上传
最后是运行结果:两页空数据404的,一共198条,
[color=]没加进程池子,速度有点慢,后期加
00b9d03fc8667a5ab06e34e36cd7b68.png (105.87 KB, 下载次数: 0)
下载附件
2022-12-19 08:51 上传
29f56a1a9ea8148e3cdf017ea580482.png (180.57 KB, 下载次数: 0)
下载附件
2022-12-19 08:52 上传