突然要用到地区数据,想到以前用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. 【校招面试 之 C/C++】第13题 C++ 指针和引用的区别

    1.指针和引用的定义和性质区别: (1)指针:指针是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元:而引用跟原来的变量实质上是同一个东西,只不过是原变量的一个别名而已.如: int ...

  2. Golang之时间、日期类型

    孤身只影的一直小地鼠,艰难的走在路上 package main import ( "fmt" "time" ) //获取时间的格式 func testTime( ...

  3. [VBScript] 自动删除2小时以前生成的文件

    保存为deleteTempFiles.vbs,双击即可运行 dim folder, file, mFSO, subfolder Set mFSO = CreateObject("Script ...

  4. An existing resource has been found at location D:\Tomcat 7\apache-tomcat-7.0.55\webapps。。。

    这个错误是说你的资源丢失,就是说tomcat无法解析你的.class文件,需要自己重新配置一下. 解决方法: 右击项目名 ---> 点击properties --> 在搜索栏里 输入 WE ...

  5. SGU 169 Numbers (找规律)

    题意:中文题,直接忽略... 析:先说说我的思路,我一看这个题第一感觉就是要找规律,要是挨着算,猴年马月都跑不完,更何况时间限制是0.25s,怎么找规律呢,我算了一下前10位,分别是8,1,1,3,1 ...

  6. sql左外连接、右外连接、group by、distinct(区别)、intersect(交叉)、通配符、having

    连接条件可在FROM或WHERE子句中指定,建议在FROM子句中指定连接条件.WHERE和HAVING子句也可以包含搜索条件,以进一步筛选连接条件所选的行.             连接可分为以下几类 ...

  7. MySQL的NO_BACKSLASH_ESCAPES

    官方说明: https://dev.mysql.com/doc/refman/5.7/en/mysql-real-escape-string.html 相关资料: https://dev.mysql. ...

  8. 用Node完成AWS S3的Upload流程之全世界最简版

    开场: 查了两天文档,Error了38次,最后索性去掉所有附加条件, 连界面也不要了,在命令行里跑通了一坨最干瘪的Upload流程! 还冒着热气…… 在此先做记录,明天可以搭配美美的界面继续调试了. ...

  9. TurtleBot教程

    TurtleBot TurtleBot combines popular off-the-shelf robot components like the iRobot Create, Yujin Ro ...

  10. (KMP扩展 利用循环节来计算) Cyclic Nacklace -- hdu -- 3746

    http://acm.hdu.edu.cn/showproblem.php?pid=3746 Cyclic Nacklace Time Limit: 2000/1000 MS (Java/Others ...