突然要用到地区数据,想到以前用python的Scrapy框架写过一个爬虫,于是打算直接去国家统计局把最新的地区数据抓取回来.本想只需要copy一下以前的代码,就可以得到新鲜出炉的数据,谁知打开以前的项目,脑子一片空白,一点印象都莫得.只恨当时没有做做笔记,写个博客啥的来加深一下影响.点子已经到这里来了,于是在.net core框架下再做了一点简单的爬取工作,并截取前面一部分,整理成文,方便以后回顾

网页分析

网页数据抓取,第一步就是分析网页的结构,包括下面3种基本的信息:

1网页编码格式:得到正确的编码格式是非常重要的,乱码可是会让人头疼

2锁定目标节点:找到目标数据所在的节点

3找寻多级依赖关系:例如本次爬取的省,市,区...,他们之间是存在依赖关系的,找到它们之间的关系才能获取完整的数据

网页的复杂程度不止于此,当遇到复杂的情况时,我们需要分析更多的信息,但就本次抓取而言,上述信息足以,所以不多做考虑

下面就以抓取省份或直辖市为例:

页面如下:

查看页面元信息,页面编码格式为GB2312

<META content="text/html; charset=gb2312" http-equiv=Content-Type>

锁定数据所在的dom节点

 <tr class='provincetr'>
<td><a href='11.html'>北京市<br /></a></td>
<td><a href='12.html'>天津市<br /></a></td>
<td><a href='13.html'>河北省<br /></a></td>
<td><a href='14.html'>山西省<br /></a></td>
<td><a href='15.html'>内蒙古自治区<br /></a></td>
<td><a href='21.html'>辽宁省<br /></a></td>
<td><a href='22.html'>吉林省<br /></a></td>
<td><a href='23.html'>黑龙江省<br /></a></td>
</tr>
<tr class='provincetr'>
<td><a href='31.html'>上海市<br /></a></td>
<td><a href='32.html'>江苏省<br /></a></td>
<td><a href='33.html'>浙江省<br /></a></td>
<td><a href='34.html'>安徽省<br /></a></td>
<td><a href='35.html'>福建省<br /></a></td>
<td><a href='36.html'>江西省<br /></a></td>
<td><a href='37.html'>山东省<br /></a></td>
<td><a href='41.html'>河南省<br /></a></td>
</tr>
<tr class='provincetr'>
<td><a href='42.html'>湖北省<br /></a></td>
<td><a href='43.html'>湖南省<br /></a></td>
<td><a href='44.html'>广东省<br /></a></td>
<td><a href='45.html'>广西壮族自治区<br /></a></td>
<td><a href='46.html'>海南省<br /></a></td>
<td> <a href='50.html'>重庆市<br /></a></td>
<td><a href='51.html'>四川省<br /></a></td>
<td><a href='52.html'>贵州省<br /></a></td>
</tr>
<tr class='provincetr'>
<td><a href='53.html'>云南省<br /></a></td>
<td><a href='54.html'>西藏自治区<br /></a></td>
<td><a href='61.html'>陕西省<br /></a></td>
<td><a href='62.html'>甘肃省<br /></a></td>
<td><a href='63.html'>青海省<br /></a></td>
<td><a href='64.html'>宁夏回族自治区<br /></a></td>
<td><a href='65.html'>新疆维吾尔自治区<br /></a></td>
</tr>

找寻依赖关系

<a>标签的href属性的数字部分是进入下一级地域的关键

数据抓取

在分析完页面结构后,下一步就可以开始我们的数据抓取

首先安装AngleSharp(Install-Package AngleSharp )的包,

AngleSharp :一个基于.NET(C#)开发的专门为解析xHTML源码的DLL组件(传送门),有了它我们就可以把得到的网页内容转换成规则的DOM,找寻我们的目标节点就变得非常简单

其次我所用的版本net core(2.2)不支持GB2312,如果直接操作,得到的只能是乱码,解决方法如下

1安装System.Text.Encoding.CodePages包(Install-Package System.Text.Encoding.CodePages)

2在启动类Starup的Configure方法中加入Encoding.RegisterProvider(CodePagesEncodingProvider.Instance)

做好上述的工作准备后,具体的代码如下

     /// <summary>
/// 爬虫辅助类
/// </summary>
public static class SpiderHelper
{
private static HtmlParser htmlParser = new HtmlParser(); public static string GetHtml(string url)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); HttpWebResponse response = (HttpWebResponse)request.GetResponse(); try
{
Stream receive = response.GetResponseStream(); StreamReader readStream = new StreamReader(receive, Encoding.GetEncoding("GB2312")); return readStream.ReadToEnd();
} catch (Exception)
{
return "";
}
} /// <summary>
/// 获取省份
/// </summary>
private static List<AreaViewModel> GetProvinces()
{
string html = GetHtml("http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/2018/index.html"); List<AreaViewModel> data = new List<AreaViewModel>(); if (string.IsNullOrEmpty(html)) return data; //网页整体dom
var document = htmlParser.ParseDocument(html); //目标元素dom,class为provincetr的tr元素下的a标签
var list = document.QuerySelectorAll("tr.provincetr a"); foreach (var item in list)
{
string name = item.TextContent; string id = item.GetAttribute("href").Replace(".html", ""); data.Add(new AreaViewModel()
{
Id = id,
Name = name,
ParentId = "",
Type = ,
Zip = ""
});
}; return data;
}
}

总结

上述的例子属于最基本的类型,对于更多网页数据的爬取,需要考虑的情况更加复杂,那时候就需要更加深入的剖析结构后通过更加复杂的技术来获取数据.但是最基本通用的原理还是和本文介绍的小例子相似

(终)

文档信息


感谢您的阅读,如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮。本文欢迎各位转载,但是转载文章之后必须在文章页面中给出作者和原文连接

Asp .Net Core网页数据爬取笔记的更多相关文章

  1. 使用for或while循环来处理处理不确定页数的网页数据爬取

    本文转载自以下网站: Python For 和 While 循环爬取不确定页数的网页  https://www.makcyun.top/web_scraping_withpython16.html 需 ...

  2. 关于js渲染网页时爬取数据的思路和全过程(附源码)

    于js渲染网页时爬取数据的思路 首先可以先去用requests库访问url来测试一下能不能拿到数据,如果能拿到那么就是一个普通的网页,如果出现403类的错误代码可以在requests.get()方法里 ...

  3. Python实训day07pm【Selenium操作网页、爬取数据-下载歌曲】

    练习1-爬取歌曲列表 任务:通过两个案例,练习使用Selenium操作网页.爬取数据.使用无头模式,爬取网易云的内容. ''' 任务:通过两个案例,练习使用Selenium操作网页.爬取数据. 使用无 ...

  4. Python爬虫 股票数据爬取

    前一篇提到了与股票数据相关的可能几种数据情况,本篇接着上篇,介绍一下多个网页的数据爬取.目标抓取平安银行(000001)从1989年~2017年的全部财务数据. 数据源分析 地址分析 http://m ...

  5. 基于python的统计公报关键数据爬取

    # -*- coding: utf-8 -*- """ Created on Wed Nov 8 14:23:14 2017 @author: 123 "&qu ...

  6. quotes 整站数据爬取存mongo

    安装完成scrapy后爬取部分信息已经不能满足躁动的心了,那么试试http://quotes.toscrape.com/整站数据爬取 第一部分 项目创建 1.进入到存储项目的文件夹,执行指令 scra ...

  7. Ajax数据爬取

    Ajax的基本原理 以菜鸟教程的代码为例: XMLHTTPRequest对象是JS对Ajax的底层实现: var xmlhttp; if (window.XMLHttpRequest) { // IE ...

  8. Python爬虫入门教程 15-100 石家庄政民互动数据爬取

    石家庄政民互动数据爬取-写在前面 今天,咱抓取一个网站,这个网站呢,涉及的内容就是 网友留言和回复,特别简单,但是网站是gov的.网址为 http://www.sjz.gov.cn/col/14900 ...

  9. 网页数据抓取工具,webscraper 最简单的数据抓取教程,人人都用得上

    Web Scraper 是一款免费的,适用于普通用户(不需要专业 IT 技术的)的爬虫工具,可以方便的通过鼠标和简单配置获取你所想要数据.例如知乎回答列表.微博热门.微博评论.淘宝.天猫.亚马逊等电商 ...

随机推荐

  1. Python3 exec 函数

    Python3 exec 函数  Python3 内置函数 描述 exec 执行储存在字符串或文件中的 Python 语句,相比于 eval,exec可以执行更复杂的 Python 代码. 语法 以下 ...

  2. java web 常用正则

    什么是 RegExp? RegExp 是正则表达式(Regular expression)的缩写,作用是对字符串执行模式匹配. 通常用于格式验证.正则替换.查找子串等 各种编程语言的正则表达式基本相同 ...

  3. Golang之并发篇

    进程和线程 A.进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位. B.线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位. C.一 ...

  4. PAT 1015 德才论 (25)(代码+思路)

    1015 德才论 (25)(25 分)提问 宋代史学家司马光在<资治通鉴>中有一段著名的"德才论":"是故才德全尽谓之圣人,才德兼亡谓之愚人,德胜才谓之君子, ...

  5. Santa Claus and a Place in a Class

    /* Santa Claus is the first who came to the Christmas Olympiad, and he is going to be the first to t ...

  6. Ubuntu下笔记本触控板的禁启

    1.命令行方式,得每次用终端输入命令行设置 sudo rmmod psmouse #禁用触摸板 sudo modprobe psmouse #启用触摸板 2.永久禁用触摸板 打开终端,然后 sudo ...

  7. 神奇的照片修复术,这才是 PS 的正确打开方式!

    蒲公英种子从远处飘回 聚成伞的模样 太阳从西边升起 落向东方 运动员回到起跑线上 轰鸣的火车退回家乡 雪花纷飞 飘向天际 我沉入梦乡 你还在我身旁 ——公益广告 大概只有时光倒流,我们才能回到那些每天 ...

  8. 关于UI设计的一些工作了解

    关于UI设计相信大家在刚接触UI的时候都不太了解,我来说说我在一段学习时间后的了解. UI从工作内容上来说分为3大类,即研究工具,研究人与界面的关系,研究人与之相应. ​ UI设计师的职能一个是图形设 ...

  9. [ Laravel 5.5 文档 ] 底层原理 —— 一次 Laravel 请求的生命周期

     Posted on 2018年3月5日 by  学院君 简介 当我们使用现实世界中的任何工具时,如果理解了该工具的工作原理,那么用起来就会得心应手,应用开发也是如此.当你理解了开发工具如何工作,用起 ...

  10. 摹客项目在2018年工信部"创客中国"名列10强并荣获二等奖

    2018“创客中国”互联网+大数据创新创业大赛(暨2018创客中国产业投资峰会)8月19日在厦门进行了总决赛.大赛由国家工业和信息化部.厦门市人民政府主办,厦门文广集团等承办.工信部信息中心领导.厦门 ...