知乎问题下用户评论的爬取

您所在的位置:网站首页 知乎评论显示不出来 知乎问题下用户评论的爬取

知乎问题下用户评论的爬取

2024-07-04 20:48| 来源: 网络整理| 查看: 265

 需要完整代码的可以直接拉到最后 1.前期准备

        本次所用到的模块如下

import json #本次需要爬取json文件,故用此模块 import socket import urllib.error import requests import urllib.request import urllib.parse from bs4 import BeautifulSoup import datetime import time from icecream import ic #测试模块,类似print输出 ##########因为这两天进行了n场试验,所以到最后我都不知道自己加了多少模块,大家在具体使用中发现用不到的模块删除就是

        模块安装本文就不做赘述,有兴趣的小伙伴可以查看其他博主的文章。

2.分析网页

        按照我以往的经验,网页的小秘密都藏在html原文件中,于是我兴高采烈的爬取了网页html文件,结果发现文章都在,但是本次目标评论区却找不出来,在仔细查看原网页后我发现了一个神奇的东西:

        没错,评论区是要点开的。(以往用的太顺就下意识的忽略的这个问题)

        那么我们有了一个猜想,评论区是我们点击这个链接之后又动态加载出来的,在检查页面的network中,我们点击评论区,然后等待评论区加载出来之后点击小红点,再选择HXR,于是,我们便得到了它:

 

        打开这个文件,出来了一页天书,这个时候不要紧,我们将其复制之后,找到一个叫做 BEJSON的网站,粘贴在文本框中让它帮助我们排版,如下:

        

        泪目,这个时候我们终于看到了我们心心念念的评论和评论者,下面就开始动工拿出来。

3.取出有用数据 

        我们的目标在于得到评论和评论的人,那么这个时候观察这个json文件的结构我们会发现,它类似于html文件的标签,是一层层包裹的(莫名的想到某句歌词是怎么肥事?)。我们可以利用json模块取出这些信息。

jsonfile = json.loads(html) next_page=jsonfile['paging']['is_end']#is_end是用来判断评论是否为最后一页 print(next_page) for data in jsonfile['data']: id=data['id'] content=data['content'] author=data['author']['member']['name'] print(id,content,author) response.close() if next_page==True: break

        完整代码在最后。

4.黎明前的黑暗

        就在我踌躇满志,准备获取评论区的时候,意外发生了。

        上网搜索资料发现,这个报错原因在于知乎服务器觉得我访问的过于频繁,觉得我是恶意攻击,就给我断开了。。。

        后来按照网上的资料,加了好几处代码用于减缓访问速度,最后成果展示。

         

 ##############################完整代码如下#################################

#-*- coding:utf-8 -*- import json import socket import urllib.error import requests import urllib.request import urllib.parse from bs4 import BeautifulSoup import re import datetime import time import os import xlwings as xw import pandas as pd from pandas import Series,DataFrame from icecream import ic headers={ 'cookie': 'SESSIONID=xwURHfOU0xGbhvPOqkomcXX8opLBrwl5LNezAxJzrpF; JOID=UFgcBU45jpkVlZgYdT3LjJ4eLnFtaMPjZ8DgXD1Wu-orw_d_FHmTtnCQkx55Qg_ODq_vVE5h2RrfKMYevuF6f2E=; osd=WlwdAEMzipgQmJIcdDjGhpofK3xnbMLmasrkXThbse4qxvp1EHiWu3qUkht0SAvPC6LlUE9k1BDbKcMTtOV7emw=; _zap=392cbcd0-daa0-4648-b49e-7ed0bd12454d; d_c0="AJBe8YOybBOPTti9boB6ZgojHtjIN6dS2mw=|1626492068"; _xsrf=G9L7PUhDwrRyzYp63ARHskHT5CKyPhpu; captcha_session_v2="2|1:0|10:1627373534|18:captcha_session_v2|88:T29TbGNXOUV3VnlzZnVhaUxoQjhyUkg1RmZaOUk1SC9NRWdwQkovY3kxM0trSnFnNXpac2VlZGQ5ckp3Y1FSOA==|f7c53f6b4397bd09fd3b2acb96238bae93527c8a570acd19c61e2081475e324c"; __snaker__id=nqkcDnffjqlhJ1TI; gdxidpyhxdE=Hf0OGSP4gvmTOyGz8Zr1Z6Oa2dh1QfcqHyKJdXvnhUf%2FxWWaXpmCLjKX%2BkB00T01nm%2Bps4%2F7sKU9zXsnSmplwKLfC1DPRio98oGNomiWnoAUao75iwB7EO%2FY17HXhLW%5C36%5CX5Q%2F%5CH8e1rdxO%2F5wkmgcomyvCzZQH4dX8D8hY0zZnz7Ys%3A1627374435409; _9755xjdesxxd_=32; YD00517437729195%3AWM_NI=P8vNoYkW8IaOf8QK12%2BWbljphq1pb3GCnYlVLdu1dyGIe7wdiNwn9K6Y952dGETg9Jleo%2FMO7iFjwJfL4U44xNQqKZFPG4recLIkyO5ahrxZ%2Bggxf5uGUl4CKGAZCBEieGw%3D; YD00517437729195%3AWM_NIKE=9ca17ae2e6ffcda170e2e6eea3e56d9aab9cd3b153af968ea6d15e979f9fbaaa6789b9bab6d74197899996b22af0fea7c3b92a94e8baafee53a989f8aae445a6e89facb43ae989ae8de97cacafff91e139859da2baef5e90bcbbd2e7738597abd8f670ab92b98fbc41f687f7d6b170859b9c88bc42b0bba1d0d045f5b78a8bf642a694fcb6b740bc929f92ca52869089d5f16fa194878cfc45f7bfa893fb52e9b9a999e53fb7999b8db74989998fbbc24a87b7aba8f637e2a3; YD00517437729195%3AWM_TID=P3l0zEP%2F6ehAEFQAUUM%2BzakuFDLRGT6y; z_c0="2|1:0|10:1627373568|4:z_c0|92:Mi4xOFdMVkNBQUFBQUFBa0Y3eGc3SnNFeWNBQUFDRUFsVk5fMHduWVFEYUx1OTdPeFA4UURndHVHR2hJc192NjVCSHhB|43a0b899f375f96c51f6b4b2bcc4e5d702c69c26e70139d4ec669f7fe43e6730"; Hm_lvt_98beee57fd2ef70ccdd5ca52b9740c49=1629338649,1629427261,1629427381,1629690689; tshl=; tst=h; SESSIONID=JzORnMOA1otXvit399hIW7QUyCyJivhcGbOfAjRhUFe; JOID=UVodAEMBNB8HX7MzLwF-CovYAVU3SkRbXjr_dmU7WmFUItFGFjt8PGZVuDIvOL3jDdRlxaJOFRjxO5k3J9vlHIE=; osd=U1wVA0kDMhcEVbE1JwJ0CI3QAl81TExYVDj5fmYxWGdcIdtEEDN_NmRTsDElOrvrDt5nw6pNHxr3M5o9Jd3tH4s=; Hm_lpvt_98beee57fd2ef70ccdd5ca52b9740c49=1629703883; KLBRSID=d1f07ca9b929274b65d830a00cbd719a|1629704810|1629698954', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36' } def answer(): socket.setdefaulttimeout(20) i = 0 while True: url = 'https://www.zhihu.com/api/v4/answers/66261219/root_comments?limit=20\u0026offset={}\u0026order=normal\u0026status=open'.format(i) i+=20 try: req = urllib.request.Request(url=url,headers=headers) response = urllib.request.urlopen(req) html = response.read() jsonfile = json.loads(html) next_page=jsonfile['paging']['is_end']#is_end是用来判断评论是否为最后一页 print(next_page) for data in jsonfile['data']: id=data['id'] content=data['content'] author=data['author']['member']['name'] print(id,content,author) response.close() if next_page==True: break except urllib.error.URLError as e: print(e.reason) time.sleep(20) answer()

 注:1、注意实际应用的时候改下cookie和user-Agent,不然有可能爬不到js文件

2、具体网址是在获取js文件的时候人家直接写在代码里面的,我就直接用了。

3、对代码中i,js文件和is_end这块有问题的可以看下这个博主写的文章,我在实际操作过程中这篇文章给了我很大启发,链接如下:

https://blog.csdn.net/purvispanwu/article/details/107364343

#######################以上#########################################

欢迎大家评论留言,有问题也欢迎大家反馈讨论,谢谢。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3