记录一次C#爬虫记录,获取必应图片
起因
事情是这样的,我创建了一个仓库,里面有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#爬虫记录,获取必应图片相关推荐
- python爬虫一:必应图片(从网页源代码中找出图片链接然后下载)
这里讲解最简单的爬虫:从网页源代码中找出图片链接然后下载 代码: #coding=utf-8 #必应图片爬虫 import re import os import urllib.request url ...
- 【重写爬虫案例】百度图片、今日头条今日街拍爬取图片中遇到的问题
大家好,我是石璞东. 我们来记录一个今天遇到的小问题:当我们想要通过爬虫程序获取百度图片.今日头条中的今日街拍中的图片的时候,我们发现请求的url地址有点麻烦,请看具体分析: 百度图片 我们在百度图片 ...
- 记录vultr搭建https爬虫代理
记录vultr搭建https爬虫代理 记录vultr搭建https爬虫代理 准备 安装squid和httpd-tools,直接yum安装 设置认证的账号密码 配置squid,支持http代理 http ...
- 网络爬虫记录《企业工商注册信息》第一篇目标抓取平台
为什么80%的码农都做不了架构师?>>> 网络爬虫记录<企业工商注册信息> 国家企业信用信息公示系统(http://www.gsxt.gov.cn)是企业信息公示系 ...
- Slq怎么样获取首条记录和最后一条记录
sql如何查询表的第一条记录和最后一条记录 方法一:使用top select TOP 1 * from apple;TOP 1 表示表apple中的第一条数据select TOP 1 * from a ...
- JAVA写的网页爬虫爬取必应词典的词汇音标
为了建立一个英语词汇音标库,需要从网上搜索词汇音标,由于有10万多个词汇需要处理,所以做个这个单词音标爬虫爬取必应网络词典网页上的单词音标. package bingword;import java. ...
- Python+Django+LeanCloud+腾讯云函数学习记录(第一周学习记录)
第一周学习记录 开始从事微信小程序云开发和后台搭建的实习工作,这半年来会一直定期更新学习记录 1.微信爬虫模块 1.Itchat包 使用itchat包的初衷是为了通过该包的login端口直接通过扫 ...
- 使用webcollector爬虫技术获取网易云音乐全部歌曲
使用webcollector爬虫技术获取网易云音乐全部歌曲 最近在知乎上看到一个话题,说使用爬虫技术获取网易云音乐上的歌曲,甚至还包括付费的歌曲,哥瞬间心动了,这年头,好听的流行音乐或者经典老歌都开始 ...
- 爬虫批量获取电影名称及电影评分
前言 之前自己接触到一个网站:哈哩哈哩,对没错,就是和B站如此相似... 这个网站里也有许多的资源,包括很多的电影,动漫等等(似乎有广告之嫌...).但是苦于电影太多,而且很多电影都没有听过,就萌生了 ...
- 基于Jsoup的Java爬虫-爬取必应壁纸网站的壁纸(Java静态壁纸爬虫实例)
准备阶段 1.必应壁纸网站:https://bing.ioliu.cn(爬取对象网站) 2.Jsoup包下载地址:https://jsoup.org/download(以下代码需要用到该包,记得导入包 ...
最新文章
- ICLR 6-6-6!自注意力可以替代CNN,能表达任何卷积滤波层丨代码已开源
- python四大软件-传智播客解析Python之移动端页面适配四大方式
- cmake中的变量和命令的大小写
- activiti 文档_免费、开源、多平台的PDF文档处理软件——PDFsam Basic
- iOS开发Cocoapods安装错误error: RPC failed; curl 56 LibreSSL SSL_read: SSL_ERROR_SYSCALL, errno 54
- vSphere 4系列之三:vCenter Server 4.0安装
- 数据库的主键Id不是从1开始的
- Http状态码大全(很全面)
- 车载视频监控基于JTT808/1078管理平台商业开源
- 有趣的黑客网站 | 伪装成黑客高手,像电影黑客一样打字如飞
- DDL和DML的含义
- 使用DDKWirzard+VS2005开发驱动
- [笔记]VMware常见问题
- VS2022编写Qt遇到的问题之 E1391 无法定义 dllimport 实体
- 小米5主板原理图_小米5手机拆机图解教程
- 单片机的c语言应用程序设计答案第六版,单片机C语言应用程序设计马忠梅课后习题答案...
- 消除计算机硬盘的碎片应该使用,Win10系统如何对磁盘碎片进行彻底清理优化
- office2010安装教程
- 匈牙利算法和卡尔曼滤波器
- 运维小知识之企业内部NTP服务器基础安装与配置使用
热门文章
- MCE | 打破 Western Blot 玄学操作
- 如何获得一个RAC Oracle数据库(从Github - oracle/docker-images) - 本地版
- 第六讲:AD、DA的工作原理及实现(郭天祥)
- Spark独到见解--Transformation算子总结
- 华为员工离职心声:菊厂15年退休,感恩公司,让我实现了财务自由!
- VB中关于Name属性和Caption属性
- 在openEuler上搭建LFS
- 压力传感器常用的3种检测方法
- android高仿朋友圈,高仿微信朋友圈图片展示效果 ImageWatcher
- Ajax请求下载文件