当前位置: 首页 > article >正文

爬虫实验笔记

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

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)  # 写入filename
    tableWrite = 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.kler.cn/a/17724.html

相关文章:

  • [运维][Nginx]Nginx学习(1/5)--Nginx基础
  • Golang | Leetcode Golang题解之第559题N叉树的最大深度
  • 使用 Visual Studio Installer 彻底卸载 Visual Studio方法与下载
  • 时序数据库TimescaleDB安装部署以及常见使用
  • Xcode 16 使用 pod 命令报错解决方案
  • fastapi 查询参数支持 Pydantic Model:参数校验与配置技巧
  • Java面试题,吐血整理~
  • 【LeetCode】413. 等差数列划分
  • git合并分支(开发版本分支合并到发布版本分支)
  • JavaWeb:JavaScript 教程 笔记
  • 【系统集成项目管理工程师】计算题专题一
  • 3.13 结构体嵌套、大小及位域
  • Golang每日一练(leetDay0055) 最长子串、相交链表
  • Yuzuki Lizard V851S开发板 –编译 OPENCV 4.5.4
  • MySQL:常见运算符
  • FLstudio21支持中文语言及水果最新版本功能特点
  • C++之C++新特性
  • 借助PLC-Recorder,西门子PLC S7-200SMART实现2ms周期采集的方法(带时间戳采集)
  • C plus plus ——【继承与派生】
  • TouchGFX开发(2)----触摸屏幕组件点亮LED
  • 【Android入门到项目实战-- 8.5】—— 使用HTTP协议访问网络的实践用法
  • 命令设计模式
  • python基本数据类型---数字字符串
  • 有关教育的几段话
  • 基于zookeeper实现分布式锁
  • 【无人车】无人驾驶地面车辆避障研究(Matlab代码实现)