Python 爬取腾讯电视剧评论

定向爬取腾讯电视剧评论

本例思路:打开评论页面,通过fiddler提取加载评论页面的网址,对比分析url,构造内容和用户pattern,然后爬取输出。


1,打开电视剧如果爱页面https://v.qq.com/x/cover/zjfjxmtdzhowjoz.html,找到下图影评位置,

image.png

2 、点击后面的数字(38535),进入评论页面 http://coral.qq.com/2701618945


image.png

在点击到最新的视乎,查看fiddler提取的网址,复制出来


3、点击2次 查看更多评论,查看fiddler提取的两次网址,复制出来

image.png

image.png


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

观察三个网址之间的差异,可以分析出下面结果:cursor为下面加载内容的起始数据位置,且没有增长规律

-->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.打开加载更多评论的网址,分析内容

image.png

image.png


image.png

"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	

执行结果:


image.png


到此完毕,已上代码可以直接应用,随着时间推移,连接与页面内容可能有变化,可灵活分析使用





猜你喜欢

转载自blog.51cto.com/superleedo/2126099