python爬取网易评论

最近学习了json模块,并用它爬取了网易的评论。

爬取的是“最近华北空气污染严重”的新闻(http://comment.news.163.com/news3_bbs/B9MBB38O00014Q4P.html)

1、首先获取json格式的文件:我用的是360浏览器(貌似用谷歌比较好,但我谷歌出了点问题委屈所以用的360,不过没啥影响)

      打开评论的网页,选取‘工具—开发人员工具’,或直接按F12,得到如下工具,点击Network,可以直接点 Scripts 得到 json 文件,一开始不知道评论是哪个文件。后来发现后缀名是 .html 的是评论网页。

   

2、网址:网易的评论有两种,一个是热门跟帖,一个是最新跟帖,两种帖子的网址不同,其中热门只有一个,而最新是多页的

#热门跟帖,也许它后面有个"_1",但若改成“_2”或更大时,它都长得一样但并不是评论!
http://comment.news.163.com/data/news3_bbs/df/B9MBB38O00014Q4P_1.html
#最新跟帖
http://comment.news.163.com/cache/newlist/news3_bbs/B9MBB38O00014Q4P_1.html</span>

所以要同时爬取两种网址。

3、处理字符串:用  json.loads()  解码字符串转换为python形式时格式很重要,在这里转换成字典形式。

将开头和结尾去掉,只剩下一个大字典,并去掉里面多余的信息

开头:


结尾:

这时候可以  printpost.keys() 试一下,可以得到字典中的键,在两种网址中,包含评论的键为:


接着获取这两个键里的值,可以得到每条帖子的信息:


接下来就可以获得评论了。

4、报错:socket.error: [Errno 10054],查了一下是远程主机重置了链接,是大量访问的原因,加了一个 time.sleep()就好了。

5、代码如下:

#coding=utf-8
import urllib2
import json
import re
import time
class WEPL:
    def __init__(self):
        self.user_agent = 'Mozilla/4.0(compatible;MSIE 5.5;Windows NT)'
        self.headers = {'User_Agent' :self.user_agent}
        self.url1='http://comment.news.163.com/data/news3_bbs/df/B9MBB38O00014Q4P_1.html'
    def getPageIndex(self,pageIndex):
        url2='http://comment.news.163.com/cache/newlist/news3_bbs/B9MBB38O00014Q4P_'+str(pageIndex)+'.html'
        return url2
    def getHtml(self,url):
        try:
            request=urllib2.Request(url,headers=self.headers)
            response=urllib2.urlopen(request)
            html=response.read()
            return html
        except urllib2.URLError,e:
            if hasattr(e,'reason'):
                print u'loading error',e.reason
                return None
    def getPost(self):
        for i in range(1,10):
            #两种网址分开处理
            if i==1:
                html=self.getHtml(self.url1)
                data1=re.sub('^var replyData=','',html)
                data2=data1[:-1]
            else:
                url2=self.getPageIndex(i)
                html=self.getHtml(url2)
                data1=re.sub('^var newPostList=','',html)
                data2=data1[:-2]
            data3=re.sub("&nbsp;\[\<a href=''\>(.*?)\<\\\\/a\>\]: ","",data2)
            data4=re.sub("\<span (.*?)\<\\\\/span\>","",data3)
            data5=re.sub("\<br\>","",data4)
            #将json文件解码为python格式
            post=json.loads(data5)
            if i==1:
                for allvalue in post['hotPosts']:
                    with open('pl3.txt','a+') as fd:
                        fd.write(allvalue['1']['f'].encode('utf-8')+'('+'IP:')
                        fd.write(allvalue['1']['ip'].encode('utf-8')+')'+'\n'+'---')
                        fd.write(allvalue['1']['b'].encode('utf-8')+'\n')
            else:
                for allvalue in post['newPosts']:
                    with open('pl3.txt','a+') as fd:
                        fd.write(allvalue['1']['f'].encode('utf-8')+'('+'IP:')
                        fd.write(allvalue['1']['ip'].encode('utf-8')+')'+'\n'+'---')
                        fd.write(allvalue['1']['b'].encode('utf-8')+'\n')
            #防止链接被重置
            time.sleep(2)
spider=WEPL()
spider.getPost()

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值