起因

事情是这样的,我创建了一个仓库,里面有2018年到目前为止每日的必应壁纸,在八月份的时候我看到微软有接口文档,于是写了一个服务,每天早上八点钟会获取必应壁纸(目前已经可以作为api来使用了,暂时不对外开放) 然后推送到微信上面。这个项目的地址是 https://gitee.com/Pridejoy/Bing,有兴趣的可以去看看。但是吧,这个仓库有两个问题

  • 2018年以前的壁纸没有的

  • 2018年后的壁纸没有版权说明

为了更新这个仓库,我偶然见发现一个网站里面有必应壁纸,而且免费开放,我就绝对去爬这个网站

经过

说干就干,我学的是C#,听闻python的爬虫很厉害,但是0基础入门就不怎么回来,下定决心就干,我发现了一个neget包爬虫挺简单的。我分析了需要爬虫的网站。然后就开始下代码

步骤

「不如授人以鱼不如授人以渔」

安装包 HtmlAgilityPack

如何加载Html

主要常见的有三种方式;从文件加载、从字符串加载、从网页链接加载。

// 从物理路径的文件加载
var doc = new HtmlDocument();
doc.Load(filePath);//文件路径// 从Stream当中加载
var doc = new HtmlDocument();
doc.LoadHtml(html);// 从网页的Url链接加载
var url = "http://www.cnblogs.com/xuliangxing/";
var web = new HtmlWeb();
var doc = web.Load(url);

以Stream对象为主的重载方法:

(1)public void Load(Stream stream)    ///从指定的Stream对象中加载html;
(2)public void Load(Stream stream, bool detectEncodingFromByteOrderMarks)    ///指定是否从顺序字节流中解析编码格式
(3)public void Load(Stream stream, Encoding encoding)    ///指定编码格式
(4)public void Load(Stream stream, Encoding encoding, bool detectEncodingFromByteOrderMarks)
(5)public void Load(Stream stream, Encoding encoding, bool detectEncodingFromByteOrderMarks, int buffersize)  ///缓冲区大小

以指定的物理路径为主的重载方法:

(1)public void Load(string path)
(2)public void Load(string path, bool detectEncodingFromByteOrderMarks)    ///指定是否从顺序字节流中解析编码格式
(3)public void Load(string path, Encoding encoding)    ///指定编码格式
(4)public void Load(string path, Encoding encoding, bool detectEncodingFromByteOrderMarks)
(5)public void Load(string path, Encoding encoding, bool detectEncodingFromByteOrderMarks, int buffersize)
如何精准定位到我们需要的数据

这个时候我们需要用到HtmlNodeCollection和HtmlNode这两个类,我们把Html每个标签看作一个Node,所有我们想到定位到某个标签的内容,就需要知道这个标签的相关属性。顺便说一下,HtmlNode类实现了IXPathNavigable接口,这说明了它可以通过xpath来定位数据了,如果你对解析XML格式数据的XmlDocument类了解的话,特别是使用过了SelectNodes()和SelectSingleNode()方法的人来说,对使用HtmlNode类将会很熟悉。其实Html Agility Pack内部是把html解析成xml文档格式了的,所以支持xml中的一些常用查询方式。下面通过简单示例对HtmlNode的一些主要的常用成员作简要的说明。

1.通过ID属性(或者其他属性)来选择对应的节点

通用格式:@id=‘xxxx’(id可以是其他属性等等),比如我们要定位到本文博客主页的标题和副标题内容。

HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();doc.LoadHtml(url)//博客主页URL//下面的意思是:通过属性id的值,来定位header下的blogTitle节点信息HtmlNode titleNode = doc.DocumentNode.SelectSingleNode("//div[@id='header']/div[@id='blogTitle']");

我们还可以不通过属性id去定位,还有通过索引去定位,如下所示,这个效果和上面是等同的:

//下面的意思是:通过索引定位,div[2]是表示根节点的第二个HtmlNode titleNode = doc.DocumentNode.SelectSingleNode("//div[2]/div[1]");

备注:注意路径里"//"表示从根节点开始查找,两个斜杠‘//’表示查找所有childnodes;一个斜杠'/'表示只查找第一层的childnodes(即不查找grandchild);点斜杠"./"表示从当前结点而不是根结点开始查找

2.如何获取节点文本内容

IDNode.OuterHtml ///返回结果是:<h1><a id="Header1_HeaderTitle" class="headermaintitle" href="http://www.cnblogs.com/xuliangxing/">法号阿兴</a></h1>IDNode.InnerHtml ///返回结果是:<a id="Header1_HeaderTitle" class="headermaintitle" href="http://www.cnblogs.com/xuliangxing/">法号阿兴</a>IDNode.InnerText ///返回结果是:法号阿兴

3.如何获取节点属性值

假如我们上面Html数据当中,博主博客地址,在标签<div id="header">里的<a>标签里,这个时候就需要使用HtmlNode下的Attribute属性了。

string url = doc.DocumentNode.SelectSingleNode("//div[@id='header']/div[@id='blogTitle']/a").Attributes["href"].Value;

4.如何获取某个标签的所有节点

我们如果获取前面Html数据的li所有分类,这个时候需要使用方法SelectNodes了

HtmlNodeCollection uiListNodes = doc.DocumentNode.SelectNodes("//ui[@id='navList']/li")

5.如何去掉外层的html tag只留下文本内容

回到我们刚刚上面讲到的地方,用remove方法。假设要删除上文结点<a id="Header1_HeaderTitle" class="headermaintitle" href="http://www.cnblogs.com/xuliangxing/">法号阿兴</a>,你想留下博客名称而不要的话,那你需要先得到这个Html结点,通过remove方法删除掉多余的HTML Tag假设该节点叫Node:

Node.ParentNode.RemoveChild(Node,true);

结果

结构当然是ok的了,经过一个小时的爬虫整理上传。

https://gitee.com/Pridejoy/Bing

已经上传 2016年壁纸(366张) 2017年必应壁纸(365) 2018年必应壁纸(365张) 2019年必应壁纸(365张) 2020年必应壁纸(366张) 每一张都是精彩绝伦

等到后面会把api开放出来,可以通过请求获取壁纸,包括不同的分辨率

先说明下, 具体的源码  https://wwa.lanzoui.com/iXeZTv7pevi

记录一次C#爬虫记录,获取必应图片相关推荐

  1. python爬虫一:必应图片(从网页源代码中找出图片链接然后下载)

    这里讲解最简单的爬虫:从网页源代码中找出图片链接然后下载 代码: #coding=utf-8 #必应图片爬虫 import re import os import urllib.request url ...

  2. 【重写爬虫案例】百度图片、今日头条今日街拍爬取图片中遇到的问题

    大家好,我是石璞东. 我们来记录一个今天遇到的小问题:当我们想要通过爬虫程序获取百度图片.今日头条中的今日街拍中的图片的时候,我们发现请求的url地址有点麻烦,请看具体分析: 百度图片 我们在百度图片 ...

  3. 记录vultr搭建https爬虫代理

    记录vultr搭建https爬虫代理 记录vultr搭建https爬虫代理 准备 安装squid和httpd-tools,直接yum安装 设置认证的账号密码 配置squid,支持http代理 http ...

  4. 网络爬虫记录《企业工商注册信息》第一篇目标抓取平台

    为什么80%的码农都做不了架构师?>>>    网络爬虫记录<企业工商注册信息> 国家企业信用信息公示系统(http://www.gsxt.gov.cn)是企业信息公示系 ...

  5. Slq怎么样获取首条记录和最后一条记录

    sql如何查询表的第一条记录和最后一条记录 方法一:使用top select TOP 1 * from apple;TOP 1 表示表apple中的第一条数据select TOP 1 * from a ...

  6. JAVA写的网页爬虫爬取必应词典的词汇音标

    为了建立一个英语词汇音标库,需要从网上搜索词汇音标,由于有10万多个词汇需要处理,所以做个这个单词音标爬虫爬取必应网络词典网页上的单词音标. package bingword;import java. ...

  7. Python+Django+LeanCloud+腾讯云函数学习记录(第一周学习记录)

    第一周学习记录 开始从事微信小程序云开发和后台搭建的实习工作,这半年来会一直定期更新学习记录 1.微信爬虫模块 1.Itchat包 ​ 使用itchat包的初衷是为了通过该包的login端口直接通过扫 ...

  8. 使用webcollector爬虫技术获取网易云音乐全部歌曲

    使用webcollector爬虫技术获取网易云音乐全部歌曲 最近在知乎上看到一个话题,说使用爬虫技术获取网易云音乐上的歌曲,甚至还包括付费的歌曲,哥瞬间心动了,这年头,好听的流行音乐或者经典老歌都开始 ...

  9. 爬虫批量获取电影名称及电影评分

    前言 之前自己接触到一个网站:哈哩哈哩,对没错,就是和B站如此相似... 这个网站里也有许多的资源,包括很多的电影,动漫等等(似乎有广告之嫌...).但是苦于电影太多,而且很多电影都没有听过,就萌生了 ...

  10. 基于Jsoup的Java爬虫-爬取必应壁纸网站的壁纸(Java静态壁纸爬虫实例)

    准备阶段 1.必应壁纸网站:https://bing.ioliu.cn(爬取对象网站) 2.Jsoup包下载地址:https://jsoup.org/download(以下代码需要用到该包,记得导入包 ...

最新文章

  1. ICLR 6-6-6!自注意力可以替代CNN,能表达任何卷积滤波层丨代码已开源
  2. python四大软件-传智播客解析Python之移动端页面适配四大方式
  3. cmake中的变量和命令的大小写
  4. activiti 文档_免费、开源、多平台的PDF文档处理软件——PDFsam Basic
  5. iOS开发Cocoapods安装错误error: RPC failed; curl 56 LibreSSL SSL_read: SSL_ERROR_SYSCALL, errno 54
  6. vSphere 4系列之三:vCenter Server 4.0安装
  7. 数据库的主键Id不是从1开始的
  8. Http状态码大全(很全面)
  9. 车载视频监控基于JTT808/1078管理平台商业开源
  10. 有趣的黑客网站 | 伪装成黑客高手,像电影黑客一样打字如飞
  11. DDL和DML的含义
  12. 使用DDKWirzard+VS2005开发驱动
  13. [笔记]VMware常见问题
  14. VS2022编写Qt遇到的问题之 E1391 无法定义 dllimport 实体
  15. 小米5主板原理图_小米5手机拆机图解教程
  16. 单片机的c语言应用程序设计答案第六版,单片机C语言应用程序设计马忠梅课后习题答案...
  17. 消除计算机硬盘的碎片应该使用,Win10系统如何对磁盘碎片进行彻底清理优化
  18. office2010安装教程
  19. 匈牙利算法和卡尔曼滤波器
  20. 运维小知识之企业内部NTP服务器基础安装与配置使用

热门文章

  1. MCE | 打破 Western Blot 玄学操作
  2. 如何获得一个RAC Oracle数据库(从Github - oracle/docker-images) - 本地版
  3. 第六讲:AD、DA的工作原理及实现(郭天祥)
  4. Spark独到见解--Transformation算子总结
  5. 华为员工离职心声:菊厂15年退休,感恩公司,让我实现了财务自由!
  6. VB中关于Name属性和Caption属性
  7. 在openEuler上搭建LFS
  8. 压力传感器常用的3种检测方法
  9. android高仿朋友圈,高仿微信朋友圈图片展示效果 ImageWatcher
  10. Ajax请求下载文件