这里的爬虫实验害暂时没有遇到验证码等问题,步骤可以简单概括为:
1.找到爬虫必要的信息;
2.内容提取;
3.将提取到的内容保存至xlsx文件
1.找到爬虫必要的信息
以zh为例,首先找一个自己感兴趣的贴,进入开发者模式,刷新,网络抓包:
这个时候会看到一个feeds?的包,这就是页面的feeds接口,所有的回复都可以在这里看到
点开它,可以在里面看到关于评论的所有信息,例如target下的content储存了评论,tarfer下的author下的name储存了层主的名字。
当然,最重要的部分在于消息头:
在消息头中找到accept-language、origin、referer、user-agent,这样才能够让机器人访问网页。
2.内容提取
找到以上信息后,就开始写代码了:
首先是请求头:
headers = {'accept-language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2','origin': 'https://www.zhihu.com','referer': 'https://www.zhihu.com/question/20744784','user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/111.0'
}
然后是页面的feeds接口:
start_url='https://www.zhihu.com/api/v4/questions/20744784/feeds?include=data%5B*%5D.is_normal%2Cadmin_closed_comment%2Creward_info%2Cis_collapsed%2Cannotation_action%2Cannotation_detail%2Ccollapse_reason%2Cis_sticky%2Ccollapsed_by%2Csuggest_edit%2Ccomment_count%2Ccan_comment%2Ccontent%2Ceditable_content%2Cattachment%2Cvoteup_count%2Creshipment_settings%2Ccomment_permission%2Ccreated_time%2Cupdated_time%2Creview_info%2Crelevant_info%2Cquestion%2Cexcerpt%2Cis_labeled%2Cpaid_info%2Cpaid_info_content%2Creaction_instruction%2Crelationship.is_authorized%2Cis_author%2Cvoting%2Cis_thanked%2Cis_nothelp%2Cis_recognized%3Bdata%5B*%5D.mark_infos%5B*%5D.url%3Bdata%5B*%5D.author.follower_count%2Cvip_info%2Cbadge%5B*%5D.topics%3Bdata%5B*%5D.settings.table_of_content.enabled&offset=&limit=3&order=default&platform=desktop'
然后进行内容的提取,但是要注意检测IP是否被限制,如果爬不到数据就说明可能被限制了。
response = requests.get(url, headers=headers) # response即请求的反馈print(response)# 可以通过print输出response,若输出200则发送请求成功c = response.json() # 获取页面内容中的json数据# 判断data是否在获取的json数据中if "data" not in c:print("获取数据失败,本IP可能已被限制")break# 没有退出循环 说明data在c中datas = c.get('data')
这一步提取到的是页面内容的所有json数据,要从中提取需要的数据,也就是第一部中找到的喜欢的标签下的内容。但是,因为正如第一步体现的,content中的数据并不全是text,所以需要使用PyQuery库,剔除HTML标签后提取回答内容中的文本。
for d in datas:user = d.get("target").get("author").get("name") # 回答者用户名print("用户名:" + user)users.append(user) # 将用户名添加至自定义用户名列表answer = pq(d.get("target").get("content")).text()print("回答:"+answer) # 与用户名同理,输出所获取的内容文本answers.append(answer) # 将用户名添加至自定义用户名列表vote = d.get("target").get("voteup_count") # 赞同数print("赞同数:"+str(vote)) # 同理,注意将vote转化成字符串votes.append(vote) # 将支持数添加至自定义支持数
获取下一个链接,添加在自定义链接列表中,进行下一次循环:
next_url.append(c["paging"]["next"]) # 将next所指向的回答导入next_url中# 当不存在下一个链接时跳出循环if c["paging"]["is_end"]:break
3.内容存储
这一步使用的是xlsxwriter库
filename = 'zhihu.xlsx' # 要保存的文件名fileW = xlsxwriter.Workbook(filename) # 写入filenametableWrite = fileW.add_worksheet('sheet1') # 向这个文件增加表单sheet1# 把第一行的三个列名插入进去tableWrite.write(0, 0, '用户名') # 第1行第1列tableWrite.write(0, 1,'内容') # 第1行第2列tableWrite.write(0, 2,'赞同数') # 第1行第3列# 遍历要合并的评论集,从第二行开始依次插入数据,i从0开始for i in range(len(users)):tableWrite.write(i + 1, 0, users[i]) # 第i+2行第1列tableWrite.write(i + 1, 1, answers[i]) # 第i+2行第2列tableWrite.write(i + 1, 2, votes[i]) # 第i+2行第3列fileW.close()
4.运行结果
当然是成功获取到想要的数据拉