当前位置:   article > 正文

python爬取网易评论_利用phython爬取网易评论

利用phython爬取网易评论

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

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

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

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

   

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

  1. #热门跟帖,也许它后面有个"_1",但若改成“_2”或更大时,它都长得一样但并不是评论!
  2. http://comment.news.163.com/data/news3_bbs/df/B9MBB38O00014Q4P_1.html
  3. #最新跟帖
  4. 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、代码如下:

  1. #coding=utf-8
  2. import urllib2
  3. import json
  4. import re
  5. import time
  6. class WEPL:
  7. def __init__(self):
  8. self.user_agent = 'Mozilla/4.0(compatible;MSIE 5.5;Windows NT)'
  9. self.headers = {'User_Agent' :self.user_agent}
  10. self.url1='http://comment.news.163.com/data/news3_bbs/df/B9MBB38O00014Q4P_1.html'
  11. def getPageIndex(self,pageIndex):
  12. url2='http://comment.news.163.com/cache/newlist/news3_bbs/B9MBB38O00014Q4P_'+str(pageIndex)+'.html'
  13. return url2
  14. def getHtml(self,url):
  15. try:
  16. request=urllib2.Request(url,headers=self.headers)
  17. response=urllib2.urlopen(request)
  18. html=response.read()
  19. return html
  20. except urllib2.URLError,e:
  21. if hasattr(e,'reason'):
  22. print u'loading error',e.reason
  23. return None
  24. def getPost(self):
  25. for i in range(1,10):
  26. #两种网址分开处理
  27. if i==1:
  28. html=self.getHtml(self.url1)
  29. data1=re.sub('^var replyData=','',html)
  30. data2=data1[:-1]
  31. else:
  32. url2=self.getPageIndex(i)
  33. html=self.getHtml(url2)
  34. data1=re.sub('^var newPostList=','',html)
  35. data2=data1[:-2]
  36. data3=re.sub("&nbsp;\[\<a href=''\>(.*?)\<\\\\/a\>\]: ","",data2)
  37. data4=re.sub("\<span (.*?)\<\\\\/span\>","",data3)
  38. data5=re.sub("\<br\>","",data4)
  39. #将json文件解码为python格式
  40. post=json.loads(data5)
  41. if i==1:
  42. for allvalue in post['hotPosts']:
  43. with open('pl3.txt','a+') as fd:
  44. fd.write(allvalue['1']['f'].encode('utf-8')+'('+'IP:')
  45. fd.write(allvalue['1']['ip'].encode('utf-8')+')'+'\n'+'---')
  46. fd.write(allvalue['1']['b'].encode('utf-8')+'\n')
  47. else:
  48. for allvalue in post['newPosts']:
  49. with open('pl3.txt','a+') as fd:
  50. fd.write(allvalue['1']['f'].encode('utf-8')+'('+'IP:')
  51. fd.write(allvalue['1']['ip'].encode('utf-8')+')'+'\n'+'---')
  52. fd.write(allvalue['1']['b'].encode('utf-8')+'\n')
  53. #防止链接被重置
  54. time.sleep(2)
  55. spider=WEPL()
  56. spider.getPost()

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/665164
推荐阅读
相关标签
  

闽ICP备14008679号