定向爬取腾讯电视剧评论
本例思路:打开评论页面,通过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
执行结果:
到此完毕,已上代码可以直接应用,随着时间推移,连接与页面内容可能有变化,可灵活分析使用
转载于:https://blog.51cto.com/superleedo/2126099