Python的定向爬取实例

定向爬取就是根据设置的主题进行内容的筛选,这里用一个例程简单记录

假如要对腾讯视频的某部电视剧的评论内容进行爬取,首先腾讯视频的评论是在当前页面进行加载,不会显示下一页,所以就需要用Fiddler进行抓包,找到请求新评论的网址。

首先点击加载更多


同时查看Fiddler里会有一个请求评论的网址



多点击几次,拿到两个这样的网址,然后分析这两个网址的相同与不同之处



然后打开这个网址

https://coral.qq.com/article/2215352252/comment?commentid=6336279930049572930&reqnum=20,会看到一些字典形式的信息

{"id":"6336246885607177351","rootid":"0","targetid":2215352253,"parent":"0","timeDifference":"\u4eca\u5929 01:02:59","time":1510678979,"content":"\u80e1\u6b4c\u5440\u80e1\u6b4c\uff0c\u50cf\u4f60\u548c\u6211\u8fd9\u4e48\u5e05\u7684\u4eba\uff0c\u90fd\u6ca1\u7ed3\u5a5a\u5440\uff01","title":"","up":"1","rep":"0","type":"1","hotscale":"0","checktype":"1","checkstatus":"0","isdeleted":"0","tagself":"","taghost":"","source":"9","location":"","address":"","rank":"-1","custom":"usertype=0","extend":{"at":0,"ut":0,"ct":"","wt":0},"orireplynum":"0","richtype":0,"userid":"179669897","poke":0,"abstract":"","thirdid":"pubsource=mobileupdate&msgid=478047797872&userid=119316627&cfrom=0&scene=1&datakey=cid%3Di5w51tl7vbl5mid%26vid%3Dd0025yxy8ii%26type%3D2&seq=21397864-b975-46ac-8ac2-32c64896c8b2&ctrid=0","ispick":0,"ishide":0,"isauthor":0,"replyuser":"","replyuserid":0,"replyhwvip":0,"replyhwlevel":0,"replyhwannual":0,"userinfo":{"userid":"179669897","uidex":"ec49c7a5ca2323df8deec2a2803e762e90","nick":"My. past","head":"http:\/\/q4.qlogo.cn\/g?

这就是评论信息,里面有一些被Unicode编码的字段,

"content":"\u80e1\u6b4c\u5440\u80e1\u6b4c\uff0c\u50cf\u4f60\u548c\u6211\u8fd9\u4e48\u5e05\u7684\u4eba\uff0c\u90fd\u6ca1\u7ed3\u5a5a\u5440\uff01"

"replyuser":""

"nick":"My. past"

"content"-----》胡歌呀胡歌,像你和我这么帅的人,都没结婚呀!

"nick":-----》"My. past"

"replyuser":""


所以,

"content"-----》这个字段是评论内容

"nick":-----》评论用户名,用户名本来就是英文,所以不用编码

"replyuser":""评论回复,这个评论没有回复所以为空


拿到这些信息之后就可以进行Python爬虫的编写了,代码如下,对作者代码进行了部分修改

#优化后的代码,增加自动加载新评论
vid='2215352573'#视频编号
comid='6335962088657810543'#设置评论起始编号
url='https://coral.qq.com/article/'+vid+'/comment?commentid='+comid+'&reqnum=20'#构造出真实的评论请求网址
#设置头信息伪装成浏览器爬取
h={'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
   'Accept-Encoding':'gb2312,utf-8',
   'Accept-Language':'zh-CN,zh;q=0.8',
    'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36',
   'Connection':'keep-alive',
   'referer':'https://v.qq.com'}
#设置cookie
cjar=http.cookiejar.CookieJar()
op=urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cjar))#设置对象
h1=[]
for key,value in h.items():#循环提取字典键值对并以元组形式赋予一个列表
    item=(key,value)
    h1.append(item)
op.addheaders=h1
urllib.request.install_opener(op)#安装为全局

def con(vid,comid):
    url='https://coral.qq.com/article/'+vid+'/comment?commentid='+comid+'&reqnum=20'
    data=urllib.request.urlopen(url).read().decode('utf-8')
    return data#构建爬取数据的函数

#分别构建筛选id、用户名、评论内容的正则表达式
idpat='"id":"(.*?)"'
userpat='"nick":"(.*?)"'
conpat='"content":"(.*?)"'
for i in range(0,10):
    print('--------------------------------------')
    print('第'+str(i)+'页评论内容')
    data=con(vid,comid)
    for j in range(0,20):
         #输出对应的信息
        try:
            #根据正则表达式匹配内容
            idlist=re.compile(idpat,re.S).findall(data)
            userlist=re.compile(userpat,re.S).findall(data)
            conlist=re.compile(conpat,re.S).findall(data)
            print('用户名是:'+eval('u"'+userlist[j]+'"'))
            print('评论内容是:'+eval('u"'+conlist[j]+'"'))
            print('\n')
        except Exception as e:#这里有一段Unicode编码在编译时会报错不知为何,所以加了一段异常处理
            print('excepyion:'+str(e))
    comid=idlist[19]

这里的的评论用户名,有些用户名在进行编码是出现报错,分析后发现是编码问题,把不对的编码删掉就可以正常编译了


所以我在程序里增加了异常处理,避免因为编码问题影响进程,每20条评论大约有1条这种编码,也可能一条也没有


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值