爬虫实验笔记

news/2024/11/1 18:39:13/

        这里的爬虫实验害暂时没有遇到验证码等问题,步骤可以简单概括为:

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.运行结果

        当然是成功获取到想要的数据拉


http://www.ppmy.cn/news/60519.html

相关文章

数据结构之队列,实现队列的增删改查

目录 一、队列的定义 二、队列的实现 1.使用链表来实现队列 2.实现队列的接口 初始化队列 void QueueInit(Queue *pq) 队尾入队列 void QueuePush(Queue *pq,QDataType data) 队头出队列 void QueuePop(Queue *pq) 获取队列头部元素 QDataType QueueFront(Queue *pq) …

java学习之异常二

目录 一、异常处理机制 一、try-catch-finally 二、throws 二、try-catch 异常处理使用细节 三、try-catch-finally练习 第一题 第二题 第三题 第四题 一、异常处理机制 共有两种异常处理机制 一、try-catch-finally 处理机制图示 二、throws 关于第二点,如E…

Android性能监控:主循环性能统计LooperStatsService详解

作者:飞起来_飞过来 简介 在Android性能监控和优化领域,一个会影响App性能表现的因素与Handler Message Looper机制有关。当Looper里面的Message处理不及时、或数量太多占用过多处理时间时,可能会出现卡顿感,并且不容易定位到卡顿…

苦学58天,最后就这结果......

背景 非计科大专一枚,当初学的机械自动化专业。大学完全可以说是玩过来的,临近毕业开始慌了,毕业后一直没能找到工作,在高中同学(211 计科)的引领下,入坑程序员,学的软件测试。 从…

Unity如何上传一个文件到服务器

在游戏开发过程中,有时候需要上传一些文件到远程服务器上,比如游戏资源文件、玩家数据等等。在Unity中,我们可以使用UnityWebRequest类来实现文件上传功能。本文将详细介绍Unity如何上传一个文件到服务器,并给出Unity与服务器的核…

Java RSA密钥转换,从RSAPrivateKey得到RSAPublicKey

概述: 在Java编程中,我们经常用到如下一段代码来生成RSA公私钥,分别拿到公私钥然后加解密计算: KeyPairGenerator keyPairGen; keyPairGen KeyPairGenerator.getInstance("RSA"); keyPairGen.initialize(2048, new S…

每日学术速递4.27

Subjects: cs.CV 1.End-to-End Spatio-Temporal Action Localisation with Video Transformers 标题:使用视频转换器进行端到端时空动作定位 作者:Alexey Gritsenko, Xuehan Xiong, Josip Djolonga, Mostafa Dehghani, Chen Sun, Mario Lučić, Corde…

ChatGPT带你领略自动驾驶技术

一、自动驾驶技术现概述 自动驾驶技术是指利用计算机、传感器和其他设备,使车辆能够在不需要人类干预的情况下自主行驶的技术。目前,自动驾驶技术已经在一些汽车厂商和科技公司中得到广泛应用,但仍然存在一些技术和法律上的挑战,需…