定向爬取腾讯电视剧评论
本例思路:打开评论页面,通过fiddler提取加载评论页面的网址,对比分析url,构造内容和用户pattern,然后爬取输出。
1,打开电视剧如果爱页面https://v.qq.com/x/cover/zjfjxmtdzhowjoz.html,找到下图影评位置
2 、点击后面的数字(38535),进入评论页面 http://coral.qq.com/2701618945
在点击到最新的视乎,查看fiddler提取的网址,复制出来
3、点击2次 查看更多评论,查看fiddler提取的两次网址,复制出来
4、对比分析加载评论的网址
该页面加载最新评论页面,coral.qq.com/article/2701618945/comment/v2?callback=_article2701618945commentv2&orinum=10&oriorder=t&pageflag=1&cursor=0&scorecursor=0&orirepnum=2&reporder=o&reppageflag=1&source=1&_=1528358764027
下一个加载网址 coral.qq.com/article/2701618945/comment/v2?callback=_article2701618945commentv2&orinum=10&oriorder=t&pageflag=1&cursor=6410399564898481102&scorecursor=0&orirepnum=2&reporder=o&reppageflag=1&source=1&_=1528358764028
第二个加载网址 coral.qq.com/article/2701618945/comment/v2?callback=_article2701618945commentv2&orinum=10&oriorder=t&pageflag=1&cursor=6410398608228072596&scorecursor=0&orirepnum=2&reporder=o&reppageflag=1&source=1&_=1528358764029
观察三个网址之间的差异,可以分析出下面结果:
-->1 页面每次加载10条评论,cursor为下面加载内容的起始数据位置,且没有明显的数学变化规律
-->2 多次出现的2701618945,经过分析 应该是视频编号,该标号对应《如果爱》的评论
-->3 最后一个变化的参数&_=1528358764028,这里的数字具有自增长规律 +1 增长。
-->4 通过后两个网址内容分析,"last":"6410398608228072596"为第一次加载的最后一个评论的数据id,而且在此页面内容中last值是唯一的,用来作为新加载的起始数据位置
所以可以分析得到URL格式:
url="http://coral.qq.com/article/2701618945/comment/v2?callback=_article2701618945commentv2&orinum=10&oriorder=t&pageflag=1&cursor="+cursor_id+"&scorecursor=0&orirepnum=2&reporder=o&reppageflag=1&source=1&_="+str(str_id)
5.打开加载更多评论的网址,分析内容
内容分析:
------------------------------------------------------------------
"region":"\u4e2d\u56fd:\u5e7f\u4e1c:\u4e1c\u839e"
"nick":"\u7738"
"content":"\u8fd9\u4e2a\u5a46\u5a46\u75c5\u7684\u4e0d\u8f7b\u65e0\u6cd5\u6cbb\u4e86"
--------------------------------------------------------------------
用python命令执行出结果,分析这个编码的对应意思
>>> print U"\u8fd9\u4e2a\u5a46\u5a46\u75c5\u7684\u4e0d\u8f7b\u65e0\u6cd5\u6cbb\u4e86"
这个婆婆病的不轻无法治了
>>> print U"\u7738"
眸
>>> print u"\u4e2d\u56fd:\u6c5f\u897f:\u666f\u5fb7\u9547"
中国:江西:景德镇
-------------------------------------------------------------------------
由上面的对比知道,“content”是评论内容;“nick”是用户名;“region”是网友地址;
根据这些内容,构造pattern
curpat='"last":"(.*?)",' #位置id
userpat='"nick":"(.*?)",' #用户名
contpat='"content":"(.*?)",' #评论内容
addrpat='"region":"(.*?)",' #用户地址
6 根据上面的分析编写代码
#!/usr/bin/env python # -*- coding: utf-8 -*- import re import urllib.request import time import urllib.error ##模拟浏览器安装headers headers=("User-Agent","Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36") opener=urllib.request.build_opener() opener.addheaders=[headers] urllib.request.install_opener(opener) #视频编号 vid="2701618945" #起始评论编号 cursor_id="6410110614791238846" #str_id是自增参数,用数字,不加引号"" str_id=1528290248106 #构造通用url url="http://coral.qq.com/article/2701618945/comment/v2?callback=_article2701618945commentv2&orinum=10&oriorder=t&pageflag=1&cursor="+cursor_id+"&scorecursor=0&orirepnum=2&reporder=o&reppageflag=1&source=1&_="+str(str_id) #定义pattern curpat='"last":"(.*?)",' userpat='"nick":"(.*?)",' contpat='"content":"(.*?)",' #定义用户列表,用于分块输出 u_list=[] for i in range(1,10): data=urllib.request.urlopen(url).read().decode('utf-8') data=str(data) #设置处理时间,防止被timeout和屏蔽 time.sleep(3) for j in range(0,10): next_curid=re.compile(curpat).findall(data)[0] content_list=re.compile(contpat).findall(data) userlist=re.compile(userpat).findall(data) try: #输出解码后的用户评论 print("评论内容是:" +eval('u"'+content_list[j]+'"')) #处理无法解析uncode编码的异常 except Exception as e: print("***********该条评论含有有特殊字符************") continue url="http://coral.qq.com/article/2701618945/comment/v2?callback=_article2701618945commentv2&orinum=10&oriorder=t&pageflag=1&cursor="+next_curid+"&scorecursor=0&orirepnum=2&reporder=o&reppageflag=1&source=1&_="+str(str_id+1) print("-------------------------------------") #添加提取的用户到列表 for item in userlist: u_list.append(item) #循环集中输出用户 for k in range(0,len(u_list)): try: print("用户名是:" +eval('u"'+u_list[k]+'"')) except Exception as e: print("***********用户名有特殊字符************") continue
执行结果:
到此完毕,已上代码可以直接应用,随着时间推移,连接与页面内容可能有变化,可灵活分析使用