拿爱奇艺练手Python爬虫,是在法律边缘试探吗?爬虫技巧学习

梦想橡皮擦 2021-10-28 13:35:02
Python 爬虫 法律 边缘 练手

本案例进行一下中场休息,给大家带来一篇如何通过开发者工具定位接口的案例。

目标站点分析

本次要采集的是爱奇艺的 《理想之城》,采集该电视剧的评论内容。

首先通过下拉发现评论的加载为异步加载,即通过服务器调用接口进行返回,顾查找到对应接口是核心突破点。

但是当启用开发者工具之后,发现页面存在太多的请求,视频加载,广告加载,图片加载非常多,导致评论的接口很难被检测出。

拿爱奇艺练手Python爬虫,是在法律边缘试探吗?爬虫技巧学习
这里首先用到的第一个技巧是,通过某一评论内容,检索接口可能出现的位置。

在开发者工具标题栏按下 Ctrl+F 键,唤醒搜索窗口,如下图所示:
拿爱奇艺练手Python爬虫,是在法律边缘试探吗?爬虫技巧学习
然后输入任意评论内容,按下回车键,即可查找该数据存在的接口,如下图所示:
拿爱奇艺练手Python爬虫,是在法律边缘试探吗?爬虫技巧学习
双击目标接口,得到请求相关数据,然后切换到标头,即 headers 部分,此时就得到了数据返回接口。
拿爱奇艺练手Python爬虫,是在法律边缘试探吗?爬虫技巧学习
将得到的请求网址相关信息,放置到请求过滤输入框,然后页面就可以对评论接口进行过滤了。拿爱奇艺练手Python爬虫,是在法律边缘试探吗?爬虫技巧学习
在接下来的动作是拆解接口参数,此处用到的基本技巧是猜+试(有一部分是经常编写爬虫的经验)

https://sns-comment.iqiyi.com/v3/comment/get_comments.action?agent_type=118&agent_version=9.11.5&authcookie=null&business_type=17&channel_id=2&content_id=6341622380665900&hot_size=0&last_id=8268424748618621&page=&page_size=20&types=time&callback=jsonp_1634731681416_32977
https://sns-comment.iqiyi.com/v3/comment/get_comments.action?agent_type=118&agent_version=9.11.5&authcookie=null&business_type=17&channel_id=2&content_id=6341622380665900&hot_size=0&last_id=5385440691984721&page=&page_size=20&types=time&callback=jsonp_1634731930864_62806

复制 2 个进行比对就可以,对比完成,在将得到的结论应用到第 3 个地址。

接口地址:https://sns-comment.iqiyi.com/v3/comment/get_comments.action

  • agent_type:未知,保持默认 118 ;
  • agent_version:未知,保持默认 9.11.5 ;
  • authcookie:未知,保持 null;
  • business_type:未知,保持 17;
  • channel_id:未知,保持 2;
  • content_id:未知,保持 6341622380665900;
  • hot_size:未知,保持 0;
  • last_id:有变化,猜测与评论的 ID 有关;
  • page:页码,没有变化;
  • page_size:每页数据量,默认 20;
  • types:未知,保持默认;
  • callback:回到函数,用于 JS。(基于经验的结论)

然后复制第 3 个请求地址,验证结论。

https://sns-comment.iqiyi.com/v3/comment/get_comments.action?agent_type=118&agent_version=9.11.5&authcookie=null&business_type=17&channel_id=2&content_id=6341622380665900&hot_size=0&last_id=5385440691984721&page=&page_size=20&types=time&callback=jsonp_1634731705450_53631

接下来的一步是尝试去除部分参数,查看返回数据是否有变化。

最后得到的精简接口地址为:

https://sns-comment.iqiyi.com/v3/comment/get_comments.action?agent_type=118&business_type=17&content_id=6341622380665900&last_id=5385440691984721

这里如果你有编写爬虫的经验,可以知道 last_id 参数是上一接口返回的最后一条数据 ID
如果没有相关经验,依然使用开发者工具的检索功能,查询 last_id 值即可。

last_id 为空时数据返回第一页数据。

scrapy 采集爱奇艺评论

找到接口之后,使用 scrapy 采集就变得非常简单了,代码如下:

import json
import scrapy
class IqySpider(scrapy.Spider):
name = 'iqy'
allowed_domains = ['sns-comment.iqiyi.com']
start_urls = [
'https://sns-comment.iqiyi.com/v3/comment/get_comments.action?agent_type=118&business_type=17&content_id=6341622380665900&last_id=']
def parse(self, response):
html = response.body
json_data = json.loads(html)
yield json_data
if json_data is not None:
ret = json_data['data']
comments = ret['comments']
_id = comments[-1]['id']
next = self.start_urls[0] + str(_id)
# 下一接口
yield scrapy.Request(url=next)
else:
return None

请重点查看 parse 方法,首先返回的是 json_data,即接口返回数据的 JSON 对象,然后直接获取最后一条数据的 ID,拼接成下一页请求地址,从而实现循环采集。

使用下述命令运行爬虫程序:

scrapy crawl iqy -o comments.json -s CLOSESPIDER_ITEMCOUNT=10
  • -o comments.json:保存为 JSON 格式文件;
  • -s CLOSESPIDER_ITEMCOUNT=10:设置爬取多少个 item 之后关闭。

本次案例直接将接口请求返回的原数据进行了保存。
拿爱奇艺练手Python爬虫,是在法律边缘试探吗?爬虫技巧学习
如果希望保存为 UTF-8 编码,使用如下命令即可。

scrapy crawl iqy -o comments.json -s CLOSESPIDER_ITEMCOUNT=10 -s FEED_EXPORT_ENCODING=UTF-8

拿爱奇艺练手Python爬虫,是在法律边缘试探吗?爬虫技巧学习如果不想在命令行编写,可以直接在 settings.py 文件中进行设置。

拿爱奇艺练手Python爬虫,是在法律边缘试探吗?爬虫技巧学习

以上代码就是本篇博客的全部内容啦。

写在后面

今天是持续写作的第 250 / 365 天。
期待 关注点赞评论收藏

更多精彩

《爬虫 100 例,专栏销售中,买完就能学会系列专栏》
从前有一个网站叫"在行",今天拿它练练Python爬虫

↓ ↓ ↓ ↓一对一指导你的疑问↓ ↓ ↓ ↓
版权声明
本文为[梦想橡皮擦]所创,转载请带上原文链接,感谢
https://dream.blog.csdn.net/article/details/121007901

  1. 保姆级教程!将 Vim 打造一个 IDE (Python 篇)
  2. python给定两个函数和定义域,判定两个函数是否构造为复合函数。
  3. 求 python3.8 有条件的递增方法
  4. 如何让python的//运算得到一个小数点不是0的结果
  5. 关于#matlab# #算法# #python#的问题:校园导航制作
  6. python的字典编程练习。!
  7. Python类的实例化应用实现输入打印
  8. python的字典编程练习,!
  9. 调试来自于逐飞的MM32F3277移植有MicroPython开发板
  10. 求 python3.8 有条件的递增递减算法
  11. 如何才能在python中实现动态宽度对齐输出
  12. 14道Python基础练习题(附答案)
  13. python写一个正则,匹配内容以“关于”,(代转)开头的那句话,要怎么写正则?
  14. 来个Python能做的救救孩子.
  15. Python爬虫,写完程序获取不到结果,
  16. python for循环和while循环打印九九乘法表
  17. Python异常
  18. Python请设计一能产生某月份月历的程序,能提示用 户输入某月份第1天是星期几,并将该月份的月历打印出来,求
  19. Python入门语法(简洁不啰嗦)
  20. Python入门与各种系统安装部署应用
  21. 你只认识大众汽车的车标怎么能行?赶紧用python采集所有车标学习一下
  22. python回文词如何以文件形式解决python问题
  23. 工作排程中Bat调用Python 程式无发打开(一闪而过)?
  24. python题目不会写求朋友们帮帮忙
  25. pythonwx内进行for循环导致窗体未响应
  26. Python自动化测试框架,谁才是你的唯一?
  27. 如何删除anaconda文件夹里的python.exe
  28. python爬取数据报错求解决一下
  29. Python编写程序求复利率,复利计算公式为
  30. 每周最怕编程课,懂python的朋友看看我吧
  31. 使用python批量将csv文件转为txt文件
  32. 用python写程序!!救命!!
  33. Python编写程序,输入年龄和出生年份,输入姓名和年龄
  34. Python爬虫,关于Xpath定位与预期不符
  35. python 批量计算的数据 print()到console的数据如何全部保存到指定路径文档,目前只能保存最后一个文件的
  36. 安装Python时出现错误:显示发现windows7 怎么弄
  37. 关于python中的PiP升级,尝试过很多遍了还是这个问题
  38. 这个怎么整啊,刚接触python
  39. 用python做图形旋转,opencv如何自动旋转图片到正常的水平位置
  40. Python零基础入门:字符串使用详解(常用方法及使用案例)
  41. Python Qt GUI设计:QPrinter打印图片类(基础篇—21)
  42. python中一维数组怎么转置
  43. 遇到一个问题,关于Python的复数的
  44. python批量将文件夹里的csv文件转成txt文件
  45. Python 彻底搞懂列表推导式|初级到进阶(实例30+)
  46. python爬虫,遇到urllib.error.URLError: <urlopen error [Errno 11001] getaddrinfo failed>错误
  47. Python程序设计输入五到十之间的整数n,生成并输出一个n位的验证码,不能把大小写字母和数字全写出来
  48. python程序打包之后没运行tkinter
  49. python提取多个Excel文件内目的格内容按一定格式写入新的Excel。
  50. pandas读取csv文件文件末尾都是NaN值,发生了什么?
  51. Python使用matplotlib可视化自定义背景色实战:自定义可视化图像的背景色(Background Color)
  52. 大学生Python实验的列表与元组
  53. python 关于线程的参数args的问题
  54. 如何用python将pdf转成网页html的格式
  55. python基础题 运行后卡在某一步 随后电脑疯狂运转发声 等待无果
  56. 求大神教怎么用python写字
  57. 云计算开发:Python3-expandtabs()方法详解
  58. 9000字深度整理: 全网最详细 Pandas 合并数据集操作总结!
  59. python这个代码有错误,请帮我修改
  60. python redis自带门神 lock 方法