最近工作中需求定时爬取不同城市每天的温度。其实就是通过编程的方法去抓取不同网站网页进行分析筛选的过程。.NET提供了很多类去访问并获得远程网页的数据,比如WebClient类和HttpWebRequest类。这些类对于利用HTTP去访问远端的网页并且下载下来是很有用的,但在对于所下载下来的HTML的解析能力方面,则显得功能很弱了。推荐一个开源的组件HTML Agility Pack(http://htmlagilitypack.codeplex.com/),它的设计目标是尽可能简化对HTML文档的读和写。这个包本身是利用了DOM文档对象模型去解析HTML的。在此顺便记录一下最近收集的爬取历史和当前天气的网站备用:

中国天气网(Weather.com.cn)


  • 该网提供有如下三个Json格式的查询接口,以北京为例:
  • http://www.weather.com.cn/data/sk/101010100.html
  • http://www.weather.com.cn/data/cityinfo/101010100.html
  • http://m.weather.com.cn/data/101010100.html
  • ID是一个9位的数字,按照长度可以分为如下四部分:101(国家代号) 01(省) 01(二级地区) 00(三级地区)
  • 要获取所有的地区代号,通过如下方式:https://wqbot.blob.core.windows.net/botdemo/CityCode.xml

示例Demo


编程使用示例如下:我们要获取如下网页中的天气信息:

下载HTML Agility Pack组件,新建控制台程序,在你的工程中引用相应framework版本对应的组件,示例代码如下:

            string url = @"http://lishi.tianqi.com/beijing/201701.html";
var webGet = new HtmlWeb();
var document = webGet.Load(url);
var div = document.DocumentNode.SelectNodes("//div[@class='tqtongji2']/ul");
foreach (HtmlNode node in div)
{
var tmpNode = node.SelectNodes("li");
Console.WriteLine(string.Format("{0}-----------{1}---------{2}----------{3}",
tmpNode[].InnerText,
tmpNode[].InnerText,
tmpNode[].InnerText,
tmpNode[].InnerText));
}
Console.ReadKey();

程序运行效果:中文存在乱码,如下图

通过分析HTML Agility Pack源码,在HtmlWeb类的Get(Uri uri, string method, string path, HtmlDocument doc)方法中,局部变量 resp是http请求的response。设置断点发现resp.ContentEncoding为空。因此通过HttpWebRequest来下载数据,示例代码如下:

            string url = @"http://lishi.tianqi.com/beijing/201701.html";
HttpWebRequest req = WebRequest.Create(new Uri(url)) as HttpWebRequest;
req.Method = "GET";
WebResponse rs = req.GetResponse();
Stream rss = rs.GetResponseStream();
HtmlDocument doc = new HtmlDocument();
doc.Load(rss);
var div = doc.DocumentNode.SelectNodes("//div[@class='tqtongji2']/ul");
foreach (HtmlNode node in div)
{
var tmpNode = node.SelectNodes("li");
Console.WriteLine(string.Format("{0}-----------{1}---------{2}----------{3}",
tmpNode[].InnerText,
tmpNode[].InnerText,
tmpNode[].InnerText,
tmpNode[].InnerText));
}
Console.ReadKey();

代码运行效果如下:

that's ok!!!

C# 爬取网页上的数据的更多相关文章

  1. Python爬取网站上面的数据很简单,但是如何爬取APP上面的数据呢

  2. python3下scrapy爬虫(第八卷:循环爬取网页多页数据)

    之前我们做的数据爬取都是单页的现在我们来讲讲多页的 一般方式有两种目标URL循环抓取 另一种在主页连接上找规律,现在我用的案例网址就是 通过点击下一页的方式获取多页资源 话不多说全在代码里(因为刚才写 ...

  3. 简单又强大的pandas爬虫 利用pandas库的read_html()方法爬取网页表格型数据

    文章目录 一.简介 二.原理 三.爬取实战 实例1 实例2 一.简介 一般的爬虫套路无非是发送请求.获取响应.解析网页.提取数据.保存数据等步骤.构造请求主要用到requests库,定位提取数据用的比 ...

  4. PHP 爬取网页中表格数据

    public function spider_j($page) { $url="http://aaa/bbb".$page."_0/"; $fcontents= ...

  5. Python3.5:爬取网站上电影数据

    首先我们导入几个pyhton3的库: from urllib import requestimport urllibfrom html.parser import HTMLParser 在Python ...

  6. [原创]python爬虫之BeautifulSoup,爬取网页上所有图片标题并存储到本地文件

    from bs4 import BeautifulSoup import requests import re import os r = requests.get("https://re. ...

  7. 爬虫入门(三)——动态网页爬取:爬取pexel上的图片

    Pexel上有大量精美的图片,没事总想看看有什么好看的自己保存到电脑里可能会很有用 但是一个一个保存当然太麻烦了 所以不如我们写个爬虫吧(๑•̀ㅂ•́)و✧ 一开始学习爬虫的时候希望爬取pexel上的 ...

  8. 使用webdriver+urllib爬取网页数据(模拟登陆,过验证码)

    urilib是python的标准库,当我们使用Python爬取网页数据时,往往用的是urllib模块,通过调用urllib模块的urlopen(url)方法返回网页对象,并使用read()方法获得ur ...

  9. python爬虫——爬取网页数据和解析数据

    1.网络爬虫的基本概念 网络爬虫(又称网络蜘蛛,机器人),就是模拟客户端发送网络请求,接收请求响应,一种按照一定的规则,自动地抓取互联网信息的程序.只要浏览器能够做的事情,原则上,爬虫都能够做到. 2 ...

随机推荐

  1. 使用axios发送post请求,将JSON数据改为为form类型

    我的github(PS:希望star):https://github.com/thWinterSun/v-admin 通常前端通过POST请求向服务器端提交数据格式有4中,分别是"appli ...

  2. idea破解更新

    idea破解教程: https://www.cnblogs.com/jpfss/p/8872358.html JetbrainsCrack-3.1-release-enc.jar下载:http://i ...

  3. JavaScript学习总结(六)——JavaScript判断数据类型总结

    最近做项目中遇到了一些关于javascript数据类型的判断处理,上网找了一下资料,并且亲自验证了各种数据类型的判断,在此做一个总结吧! 一.JS中的数据类型 1.数值型(Number):包括整数.浮 ...

  4. spring boot 学习(六)spring boot 各版本中使用 log4j2 记录日志

    spring boot 各版本中使用 log4j2 记录日志 前言 Spring Boot中默认日志工具是 logback,只不过我不太喜欢 logback.为了更好支持 spring boot 框架 ...

  5. 数据库cmd窗口登录

    mysql -uroot -p123 -P3306 -h127.0.0.1 -uroot::root数据库登录用户名 -p123:数据库密码123 -P3306::3306数据库的端口号 -h127. ...

  6. Transfer files Using sshpass

    #! /bin/bash user=root password=12345678 remote_ip=192.168.3.140 remote_dir=/usr/bin/ local_file_dir ...

  7. 使用pool的多进程,不执行的问题

    from multiprocessing import Pool def fetch_data(idlist,test): pass p=Pool(4) result=[] for i in rang ...

  8. Tomcat 域名绑定多个Host配置要点

    一.在server.xml中添加Host节点,name就是需要绑定的域名,多个域名在Host节点下建立<Alias></Alias>子节点,可建立多个. <Engine ...

  9. C++基础:什么是命名空间

    命名空间是类的逻辑分组,它组织成一个层次结构——逻辑树.这个树的根是System.名字空间是为了防止名字污染在标准C++中引入的.它可以将其中定义的名字隐藏起来,不同的名字空间中可以有相同的名字而互不 ...

  10. windows与Linux实现文件传输Winscp工具的使用

    WinSCP是一个Windows环境下使用SSH的开源图形化SFTP客户端.同时支持SCP协议.它的主要功能就是在本地与远程计算机间安全的复制文件..winscp也可以链接其他系统,比如linux系统 ...