突然要用到地区数据,想到以前用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. 判断UNITY版本号

    代码示例: #if (UNITY_5_3 || UNITY_5_4 || UNITY_5_5 || UNITY_5_6 || UNITY_5_7 || UNITY_5_8 || UNITY_5_9)u ...

  2. 运行php网站需要安装什么

    php的运行环境: 为了能够运行php,有以下两种方法: 1. 使用支持php和MySQL的web主机(): 2. 本机(自己电脑)安装web服务器,然后安装MySQL和php. web虚拟主机: 大 ...

  3. 使用UltraISO制作光盘镜像

    为什么使用光盘镜像文件: 1. 有些光盘中的内容必须在光盘运行环境中运行: 有些光盘的内容要在光盘运行的时候才能运行,即使你安装到电脑上都不行!例如某些游戏光盘等,这样就得每次使用时都要用光盘,对光驱 ...

  4. TZOJ 4855 排座椅(贪心)

    描述 上课的时候总有一些同学和前后左右的人交头接耳,这是令小学班主任十分头疼的一件事情.不过,班主任小雪发现了一些有趣的现象,当同学们的座次确定下来后,只有有限的D对同学上课时会交头接耳.同学们在教室 ...

  5. 'wmic' 不是内部或外部命令,也不是可运行的程序 解决方法

    在环境变量中查看变量名Path下的变量值是否有以下讯息? 如没有复制(Ctrl+C).黏贴(Ctrl+V)→确定即可. %SystemRoot%;%SystemRoot%\system32;%Syst ...

  6. 18-从n个数中选m个

    #include <iostream>using namespace std; int f(int n, int m){        if(n < m)         //这个条 ...

  7. discuz回贴通知插件实现-配置邮件服务器

    添加smtp服务器,填写相应的smtp服务器,发信人地址,用户名和密码.   填写发件人地址和收件人地址来测试邮件是否发送成功.

  8. Spring官方文档翻译(1~6章)

    Spring官方文档翻译(1~6章) 转载至 http://blog.csdn.net/tangtong1/article/details/51326887 Spring官方文档.参考中文文档 一.S ...

  9. 电商类Web原型制作分享——聚美优品

    这是一家化妆品限时特卖商城.作为美妆电商类网站的佼佼者,网站以用户体验为核心,画面主色调符合女性消费者审美.排版整齐,布局合理.网站用弹出面板实现点击弹出内容,鼠标悬停文字按钮颜色改变等交互效果. 本 ...

  10. mvc模拟实现

    .定义httpmodule <system.webServer> <modules> <add name="UrlRoutingModule" typ ...