背景:最近喜欢看百度贴吧,因为其内容大多都是吧友的真实想法表达等等原因。但是通过网页去浏览贴吧,始终觉得不够简介,浏览帖子的效率不高,自己就萌发了通过自己爬取贴吧感兴趣的关键字内容,自己写了个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要方便。主要是测试前,可以提前序列化一批真实的帖子数据,测试界面时,就使用序列化的静态数据,这样降低了触发验证的风险,也能加快效率。
 
最后这个做的很简陋,心头其实是害怕自己没能力再把这个程序做得更好,所以就没有再继续尝试优化了。

【C#】爬取百度贴吧帖子 通过贴吧名和搜索关键词的更多相关文章

  1. Python爬虫实例(一)爬取百度贴吧帖子中的图片

    程序功能说明:爬取百度贴吧帖子中的图片,用户输入贴吧名称和要爬取的起始和终止页数即可进行爬取. 思路分析: 一.指定贴吧url的获取 例如我们进入秦时明月吧,提取并分析其有效url如下 http:// ...

  2. Python爬虫实战二之爬取百度贴吧帖子

    大家好,上次我们实验了爬取了糗事百科的段子,那么这次我们来尝试一下爬取百度贴吧的帖子.与上一篇不同的是,这次我们需要用到文件的相关操作. 前言 亲爱的们,教程比较旧了,百度贴吧页面可能改版,可能代码不 ...

  3. 转 Python爬虫实战二之爬取百度贴吧帖子

    静觅 » Python爬虫实战二之爬取百度贴吧帖子 大家好,上次我们实验了爬取了糗事百科的段子,那么这次我们来尝试一下爬取百度贴吧的帖子.与上一篇不同的是,这次我们需要用到文件的相关操作. 本篇目标 ...

  4. Python爬虫实战之爬取百度贴吧帖子

    大家好,上次我们实验了爬取了糗事百科的段子,那么这次我们来尝试一下爬取百度贴吧的帖子.与上一篇不同的是,这次我们需要用到文件的相关操作. 本篇目标 对百度贴吧的任意帖子进行抓取 指定是否只抓取楼主发帖 ...

  5. python爬取百度贴吧帖子

    最近偶尔学下爬虫,放上第二个demo吧 #-*- coding: utf-8 -*- import urllib import urllib2 import re #处理页面标签类 class Too ...

  6. 芝麻HTTP:Python爬虫实战之爬取百度贴吧帖子

    本篇目标 1.对百度贴吧的任意帖子进行抓取 2.指定是否只抓取楼主发帖内容 3.将抓取到的内容分析并保存到文件 1.URL格式的确定 首先,我们先观察一下百度贴吧的任意一个帖子. 比如:http:// ...

  7. Python爬虫-爬取百度贴吧帖子

    这次主要学习了替换各种标签,规范格式的方法.依然参考博主崔庆才的博客. 1.获取url 某一帖子:https://tieba.baidu.com/p/3138733512?see_lz=1&p ...

  8. 利用python的爬虫技术爬取百度贴吧的帖子

    在爬取糗事百科的段子后,我又在知乎上找了一个爬取百度贴吧帖子的实例,为了巩固提升已掌握的爬虫知识,于是我打算自己也做一个. 实现目标:1,爬取楼主所发的帖子 2,显示所爬去的楼层以及帖子题目 3,将爬 ...

  9. 爬虫系列(六) 用urllib和re爬取百度贴吧

    这篇文章我们将使用 urllib 和 re 模块爬取百度贴吧,并使用三种文件格式存储数据,下面先贴上最终的效果图 1.网页分析 (1)准备工作 首先我们使用 Chrome 浏览器打开 百度贴吧,在输入 ...

  10. 百度图片爬虫-python版-如何爬取百度图片?

    上一篇我写了如何爬取百度网盘的爬虫,在这里还是重温一下,把链接附上: http://www.cnblogs.com/huangxie/p/5473273.html 这一篇我想写写如何爬取百度图片的爬虫 ...

随机推荐

  1. MCM箱模型建模方法及大气O3来源解析

    OBM箱模型可用于模拟光化学污染的发生.演变过程,研究臭氧的生成机制和进行敏感性分析,探讨前体物的排放对光化学污染的影响.箱模型通常由化学机理.物理过程.初始条件.输入和输出模块构成,化学机理是其核心 ...

  2. openGauss每日一练第四天

    openGauss 每日一练第四天 本文出处:https://www.modb.pro/db/193083 学习地址 https://www.modb.pro/course/133 学习目标 学习 o ...

  3. Mogdb - 安装报错Failed to encrypt the password for databaseError

    Mogdb - 安装报错 Failed to encrypt the password for databaseError 本文出处:https://www.modb.pro/db/418363 版本 ...

  4. nginx重新整理——————编译nginx[二]

    前言 简单编译一下nginx. 正文 为什么我们要去编译nginx. 系统安装,比如yum安装,会把nginx 模块直接编译进来. 这意味着,我们无法使用第三方的包.如果我们需要使用第三方包,那么需要 ...

  5. c# mvc action 跳转方式

    前言 c# 的mvc 有很多的action跳转方式,在此总结一下具体的跳转方法. 这里不用去记,而是知道能怎么做,为什么能这样做,重在思考. 正文 一.RedirectToAction("I ...

  6. leetcode:1381. 设计一个支持增量操作的栈

    1381. 设计一个支持增量操作的栈 请你设计一个支持下述操作的栈. 实现自定义栈类 CustomStack : CustomStack(int maxSize):用 maxSize 初始化对象,ma ...

  7. 关于双独立时钟fifo的一些细节探讨

    最近遇到一个项目,就是接收数据转换成本地数据.两个时钟是频率是基本一样,但是存在5%偏差,而且存在相位差. 这是基本需求.一般转换的办法就是fifo写入有效数据,然后用empty读取出来.但是发现有个 ...

  8. WPF/C#:如何显示具有层级关系的数据

    前言 比方说我们有以下两个类: public class Class { public string? Name { get; set; } public List<Student>? S ...

  9. 力扣239(Java)- 滑动窗口最大值(困难)

    题目: 给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧.你只可以看到在滑动窗口内的 k 个数字.滑动窗口每次只向右移动一位. 返回 滑动窗口中的最大值 . 示 ...

  10. 力扣540(java&python)-有序数组中的单一元素(中等)

    题目: 给你一个仅由整数组成的有序数组,其中每个元素都会出现两次,唯有一个数只会出现一次. 请你找出并返回只出现一次的那个数. 你设计的解决方案必须满足 O(log n) 时间复杂度和 O(1) 空间 ...