Bug修复

https://github.com/ZhangQueque/quewaner.Crawler/issues/1

修复加载Https网址中午乱码,导致Node解析失败的问题

1、使用第三方类库 HtmlAgilityPack

官方网址:https://html-agility-pack.net/?z=codeplex、

// From File 从文件获取html信息
var doc = new HtmlDocument();
doc.Load(filePath); // From String 从字符串获取html信息
var doc = new HtmlDocument();
doc.LoadHtml(html); // From Web 从网址获取html信息
var url = "http://html-agility-pack.net/";
var web = new HtmlWeb();
var doc = web.Load(url);

1.1、这里介绍一下最后一种用法

var web = new HtmlWeb();
var doc = web.Load(url);

在 web 中我们还可以设置cookie、headers等信息,来处理一些特定的网站需求,比如需要登陆等。

1.2 用法解释

网页在你查看网页源代码之后只是一段字符串,而爬虫所做的就是在这堆字符串中,查询到我们想要的信息,挑选出来。

以往的筛选方法:正则 (太麻烦了,写起来有些头疼)

HtmlAgilityPack 支持通过XPath来解析我们需要的信息。

1.2.1 在哪里找XPath?

网页右键检查

通过XPath就可以准确获取你想要元素的全部信息。

1.2.2 获取选中Html元素的信息?

获取选中元素

var web = new HtmlWeb();
var doc = web.Load(url);
var htmlnode = doc?.DocumentNode?.SelectSingleNode("/html/body/header")

获取元素信息

htmlnode.InnerText;
htmlnode.InnerHtml;
//根据属性取值
htmlnode?.GetAttributeValue("src", "未找到")

2、自己封装的类库

 /// <summary>
/// 下载HTML帮助类
/// </summary>
public static class LoadHtmlHelper
{
/// <summary>
/// 从Url地址下载页面
/// </summary>
/// <param name="url"></param>
/// <returns></returns>
public async static ValueTask<HtmlDocument> LoadHtmlFromUrlAsync(string url)
{
HtmlWeb web = new HtmlWeb();
return await
web?.LoadFromWebAsync(url);
} /// <summary>
/// 获取单个节点扩展方法
/// </summary>
/// <param name="htmlDocument">文档对象</param>
/// <param name="xPath">xPath路径</param>
/// <returns></returns>
public static HtmlNode GetSingleNode(this HtmlDocument htmlDocument, string xPath)
{
return htmlDocument?.DocumentNode?.SelectSingleNode(xPath);
} /// <summary>
/// 获取多个节点扩展方法
/// </summary>
/// <param name="htmlDocument">文档对象</param>
/// <param name="xPath">xPath路径</param>
/// <returns></returns>
public static HtmlNodeCollection GetNodes(this HtmlDocument htmlDocument, string xPath)
{
return htmlDocument?.DocumentNode?.SelectNodes(xPath);
} /// <summary>
/// 获取多个节点扩展方法
/// </summary>
/// <param name="htmlDocument">文档对象</param>
/// <param name="xPath">xPath路径</param>
/// <returns></returns>
public static HtmlNodeCollection GetNodes(this HtmlNode htmlNode, string xPath)
{
return htmlNode?.SelectNodes(xPath);
} /// <summary>
/// 获取单个节点扩展方法
/// </summary>
/// <param name="htmlDocument">文档对象</param>
/// <param name="xPath">xPath路径</param>
/// <returns></returns>
public static HtmlNode GetSingleNode(this HtmlNode htmlNode, string xPath)
{
return htmlNode?.SelectSingleNode(xPath);
} /// <summary>
/// 下载图片
/// </summary>
/// <param name="url">地址</param>
/// <param name="filpath">文件路径</param>
/// <returns></returns>
public async static ValueTask<bool> DownloadImg(string url ,string filpath)
{
HttpClient httpClient = new HttpClient();
try
{
var bytes = await httpClient.GetByteArrayAsync(url);
using (FileStream fs = File.Create(filpath))
{
fs.Write(bytes, 0, bytes.Length);
}
return File.Exists(filpath);
}
catch (Exception ex)
{ throw new Exception("下载图片异常", ex);
} }
}

3、自己写的爬虫案例,爬取的网站https://www.meitu131.com/

数据存储层没有实现,懒得写了,靠你们喽,我是数据暂时存在了文件中

GitHub地址:https://github.com/ZhangQueque/quewaner.Crawler.git

(Bug修复)C#爬虫,让你不再觉得神秘的更多相关文章

  1. 莫烦python课程里面的bug修复;课程爬虫小练习爬百度百科

    我今天弄了一下午修改这个代码,最后还是弄好了.原因是正则表达式的筛选不够准确,有时候是会带http:baidu这些东西的.所以需要一个正则表达式的断言,然后还有一点是如果his里面只有一个元素就不要再 ...

  2. 仿酷狗音乐播放器开发日志十九——CTreeNodeUI的bug修复二(附源码)

    转载请说明原出处,谢谢 今天本来打算把仿酷狗播放列表的子控件拖动插入功能做一下,但是仔细使用播放列表控件时发现了几个逻辑错误,由于我的播放 列表控件是基于CTreeViewUI和CTreeNodeUI ...

  3. OJ2.0userInfo页面Modify逻辑bug修复,search功能逻辑实现

    这周的主要任务:userInfo页面Modify逻辑bug修复,search功能逻辑实现. (一)Modify逻辑bug修复: 这里存在的bug就是在我们不重置password的时候依照前面的逻辑是不 ...

  4. cocos2d-x多分辨率和随后的自适应CCListView的bug修复

    cocos2d-x多分辨率自适配及因此导致的CCListView的bug修复 cocos2d-x是一款众所周知的跨平台的游戏开发引擎.因为其跨平台的特性.多分辨率支持也自然就有其需求. 因此.在某一次 ...

  5. android-misc-widgets四向(上下左右)抽屉bug修复版--转载

     android-misc-widgets四向(上下左右)抽屉bug修复版 2013-08-04 08:58:13 标签:bug down top panel slidingdrawer 原创作品,允 ...

  6. Spring+SpringMVC+MyBatis+easyUI整合基础篇(八)mysql中文查询bug修复

    写在前面的话 在测试搜索时出现的问题,mysql通过中文查询条件搜索不出数据,但是英文和数字可以搜索到记录,中文无返回记录.本文就是写一下发现问题的过程及解决方法.此bug在第一个项目中点这里还存在, ...

  7. 微信小程序(有始有终,全部代码)开发---跑步App+音乐播放器 Bug修复

    开篇语 昨晚发了一篇: <简年15: 微信小程序(有始有终,全部代码)开发---跑步App+音乐播放器 > 然后上午起来吃完午饭之后,我就准备继续开工的,但是突然的,想要看B站.然后在一股 ...

  8. Saiku Table展示数据合并bug修复(二十五)

    Saiku Table展示数据合并bug修复 Saiku以table的形式展示数据,如果点击了 非空的字段 按钮,则会自动进行数据合并,为空的数据行以及数据列都会自动隐藏掉. 首先我们应该定位问题: ...

  9. ThinkPHP 3.2.3+ORACLE插入数据BUG修复及支持获取自增Id的上次记录

    TP+ORACLE插入数据BUG修复以及获取自增Id支持getLastInsID方法 这些天在做Api接口时候,发现用TP操作Oracle数据库,发现查询修改删除都能执行, 但一旦执行插入操作老是报错 ...

随机推荐

  1. BUCK 电路PSIM仿真模型搭建之二 (传递函数模块的使用)

    1. 利用S函数模块进行环路仿真 将PI 写成 截止频率的表示形式 Kp* (Ti*s+1)/Ti*s  ,  这里Kp = 20,  Ti = 0.0001  ,  写入仿真模型参数框 仿真结果: ...

  2. Spring Bean 标签解析

    上一篇文章讲到了标签在 parseDefaultElement 方法中进行解析,本篇文章将讲解这部分内容 bean 标签解析 查看 processBeanDefinition 方法,针对各个操作作具体 ...

  3. Element 2 组件源码剖析之布局容器

    0x00 简介 前文分析过组件的 布局栅格化(Grid Layout) ,通过基础的 24 分栏,迅速简便地创建布局. 本文将介绍用于布局的容器组件,使用 Flexbox 功能将其所控制区域设定为特定 ...

  4. Matplotlib(基本用法)

    Matplotlib 是数据分析绘图的常见模块,可以算是 2D-绘图(Python)领域使用最广泛的套件,可以将数据图形化,并且提供多样化的输出格式,利于数据的显示并分析. 接下来展示的是Matplo ...

  5. 使用rust调用c++静态库并编译nodejs包

    在项目上经常要用到身份证阅读器.护照阅读仪.指纹仪等各种品牌硬件,假如每套系统的都做集成开发那代码的维护成本将变得很高,为此采用rust来调用厂家提供的sdk c++开发包并封装成nodejs包,用f ...

  6. git diff与linux diff的输出格式之unified format

    前言 前面有一篇文章<一个有些意思的项目--文件夹对比工具(一)>,里面简单讲了下diff算法之--Myers算法. 既然是算法,就会有实现,比如git diff中有Myers的实现,gi ...

  7. python通过CMD直接生成exe文件

    py文件打包好为exe文件: pyinstaller -F --icon=my.ico test.py my.ico 是一个图标名,和当前的test.py文件在同一个目录下 常用参数说明: –icon ...

  8. 使用docker简单编译k20pro内核

    简介 本文将介绍一下如何使用docker编译红米k20pro的内核.作者当时尝试构建内核的原因是为了将3年前(好像是吧)购买的k20pro至尊版(已退役,12GB内存,512GB硬盘)制作成一个小的服 ...

  9. iommu系列之---概念解释篇

    本文会对iommu中的一些容易引起疑惑的概念进行阐述,内核版本为4.19. 先上简写: DMAR - DMA remapping DRHD - DMA Remapping Hardware Unit ...

  10. 超实用在线工具!能将文字加密为Emoji表情

    试想一下,如果你需要将一段比较敏感的内容发送给你的好友. 但如果这段内容不小心外泄,被别人看到了,可能会带来很多麻烦. 那么,有什么方法能够让传输的文本内容不那么容易被"看破"呢? ...