首页 > 编程语言 >【C#】爬取百度贴吧帖子 通过贴吧名和搜索关键词

【C#】爬取百度贴吧帖子 通过贴吧名和搜索关键词

时间:2022-10-29 23:22:58浏览次数:53  
标签:帖子 dom C# 关键词 爬取 json 斜杠 div 节点

背景:最近喜欢看百度贴吧,因为其内容大多都是吧友的真实想法表达等等原因。但是通过网页去浏览贴吧,始终觉得不够简介,浏览帖子的效率不高,自己就萌发了通过自己爬取贴吧感兴趣的关键字内容,自己写了个winform客户端,目前大致能浏览帖子了。 成果简陋:

 

总结: 这个我做的十分的简陋,没啥说的,我自己感觉,就解析dom节点比较费时,要观察网页,不同的贴吧名,搜索结果的展示dom节点是不一样的,所以要找到合适的xpath去解析想要的信息,用的库就是 HtmlAgilityPack,这个没有那种使用浏览器内核的库复杂,完成这种值爬取文字信息的我认为对我来讲是够用的了。 说起xpath的使用,其语法 分为单斜杠、双斜杠、中括号属性名查找。比如说: /div[1]/div[2]就是从根开始匹配第一个div下面的第二个div子节点。用单斜杠我的理解是只能向dom一级一级的匹配。而双斜杠能从任意未知匹配,比如: //div[@id="postContent_123"]表示查找dom节点中任意id为双引号内容的节点。使用时注意,如果时在某个自己点调用查找单个节点时,比如: node.GetSingalNode("//div[@class=\"p_post\"]"),这个不会从node这个节点下面去找,依然是全文的dom查找。   获取html文档,可以使用这个包自带的HtmlWeb类,也可以自己写RequestHelper封装一下,注意网页编码,目前贴吧搜索页是gbk,帖子内容是utf-8。 这里还有个坑,帖子楼层下得回复消息是异步得,那么从获取html网页的方式获取不到这些回复,只会得到一张img的标签dom,但是通过F12查看,发现所有的回复都是一个请求返回的json,楼层的pid和json的回复对应。 newtownsoft.json 也有根xpath类似的语法,比较好定位某个属性的值。因为这个回复json有的关键属性是数字,所以我没有设计类去接收json字符,而是使用jsonobject。   这个贴吧有反爬机制,有图片验证,目前我还不能一次性永久解决,但短暂的办法,我的是加上cookie和userAgent,可以试试,在浏览器出现需要验证的情况去看看cookie,用排除法去找到关键的cookie。这个用上了,不久后又会需要验证,在更换哈cookie的值或者useragent的值就好了。如果用htmlWeb就没这么灵活了,用自己的请求类我觉得还是比较好点。   做的时候,为了调试方便,写单元测试是个不错的方法,不需要界面操作,可以提高效率。核心方法直接封装成一个类,直接调用方法就行,因为这个简单没啥界面的复杂交互,所以写单测也好写。   做界面设计渲染的时候,使用了自定义控件,flowlayoutpanel比panel要方便。主要是测试前,可以提前序列化一批真实的帖子数据,测试界面时,就使用序列化的静态数据,这样降低了触发验证的风险,也能加快效率。   最后这个做的很简陋,心头其实是害怕自己没能力再把这个程序做得更好,所以就没有再继续尝试优化了。

标签:帖子,dom,C#,关键词,爬取,json,斜杠,div,节点
From: https://www.cnblogs.com/HelloQLQ/p/16840190.html

相关文章

  • AcWing 1113. 红与黑
    蒟蒻只会暴搜了要点是先找到起点,从起点开始向各个方向搜DFS:(DFS当然也可以用for(inti=0;i,4;i++)来搜索四个方向,这里是个人习惯)#include<iostream>#include<cstring......
  • JavaScript
    JavaScriptJavaScript(JS)是一种脚本语言,可以用来更改页面内容,控制多媒体,制作图像动画等.在body标签里面写一个script标签,在script标签里面编写JavaScript代码......
  • 实验2:Open vSwitch虚拟交换机实践
    一、实验目的能够对OpenvSwitch进行基本操作;能够通过命令行终端使用OVS命令操作OpenvSwitch交换机,管理流表;能够通过Mininet的Python代码运行OVS命令,控制网络拓扑中的O......
  • C#压缩帮助类
    1/***2*Title:"基础工具"项目3*Title:"基础工具"项目4*主题:压缩包帮助类5*Description:6*功能:7*1、......
  • CSP2022 游记
    Day0吃了个KFCJ组:赛前:J组总得AK掉吧?!赛时:T1,切了。T2,这不解方程吗,不过做得有些复杂,还手写了int128和sqrt,但还是很快切了。T3,大模拟先放一会儿。T4,好水,还不......
  • Context,多个组件公用的数据传导方法
    三个组件:输入A组件输出B组件TestContext组件,数据x。方法:输入端(A):    importTestContextfrom"TestContext组件路径";    constA=()=>{   ......
  • 拓端tecdat|R语言辅导Poisson回归的拟合优度检验
    R语言Poisson回归的拟合优度检验在这篇文章中,我们将看一下Poisson回归的拟合优度测试与个体计数数据。许多软件包在拟合Poisson回归模型时在输出中......
  • 【LeeCode】字符串的排列
    【题目描述】给你两个字符串 ​​s1​​​ 和 ​​s2​​​ ,写一个函数来判断 ​​s2​​​ 是否包含 ​​s1​​ 的排列。如果是,返回 ​​true​​​ ;否则,返回 ......
  • connect()和close()的man手册
    英文小册原文地址:​​beej.us/guide/bgnet…​​作者:Beej中文翻译地址:​​www.chanmufeng.com/posts/netwo…​​connect()将你本地的socket连接到服务器。函数原型#include......
  • accept()的man手册
    英文小册原文地址:​​beej.us/guide/bgnet…​​作者:Beej中文翻译地址:​​www.chanmufeng.com/posts/netwo…​​接受侦听套接字上传入的连接。函数原型#include<sys/types......