Asp .Net Core网页数据爬取笔记
突然要用到地区数据,想到以前用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;
}
}
总结
上述的例子属于最基本的类型,对于更多网页数据的爬取,需要考虑的情况更加复杂,那时候就需要更加深入的剖析结构后通过更加复杂的技术来获取数据.但是最基本通用的原理还是和本文介绍的小例子相似
(终)
文档信息
- 发表作者: 半路独行
- 发表出处: 博客园
- 原文地址: https://www.cnblogs.com/banluduxing/p/10732827.html
- 版权信息:
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
感谢您的阅读,如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮。本文欢迎各位转载,但是转载文章之后必须在文章页面中给出作者和原文连接。
Asp .Net Core网页数据爬取笔记的更多相关文章
- 使用for或while循环来处理处理不确定页数的网页数据爬取
本文转载自以下网站: Python For 和 While 循环爬取不确定页数的网页 https://www.makcyun.top/web_scraping_withpython16.html 需 ...
- 关于js渲染网页时爬取数据的思路和全过程(附源码)
于js渲染网页时爬取数据的思路 首先可以先去用requests库访问url来测试一下能不能拿到数据,如果能拿到那么就是一个普通的网页,如果出现403类的错误代码可以在requests.get()方法里 ...
- Python实训day07pm【Selenium操作网页、爬取数据-下载歌曲】
练习1-爬取歌曲列表 任务:通过两个案例,练习使用Selenium操作网页.爬取数据.使用无头模式,爬取网易云的内容. ''' 任务:通过两个案例,练习使用Selenium操作网页.爬取数据. 使用无 ...
- Python爬虫 股票数据爬取
前一篇提到了与股票数据相关的可能几种数据情况,本篇接着上篇,介绍一下多个网页的数据爬取.目标抓取平安银行(000001)从1989年~2017年的全部财务数据. 数据源分析 地址分析 http://m ...
- 基于python的统计公报关键数据爬取
# -*- coding: utf-8 -*- """ Created on Wed Nov 8 14:23:14 2017 @author: 123 "&qu ...
- quotes 整站数据爬取存mongo
安装完成scrapy后爬取部分信息已经不能满足躁动的心了,那么试试http://quotes.toscrape.com/整站数据爬取 第一部分 项目创建 1.进入到存储项目的文件夹,执行指令 scra ...
- Ajax数据爬取
Ajax的基本原理 以菜鸟教程的代码为例: XMLHTTPRequest对象是JS对Ajax的底层实现: var xmlhttp; if (window.XMLHttpRequest) { // IE ...
- Python爬虫入门教程 15-100 石家庄政民互动数据爬取
石家庄政民互动数据爬取-写在前面 今天,咱抓取一个网站,这个网站呢,涉及的内容就是 网友留言和回复,特别简单,但是网站是gov的.网址为 http://www.sjz.gov.cn/col/14900 ...
- 网页数据抓取工具,webscraper 最简单的数据抓取教程,人人都用得上
Web Scraper 是一款免费的,适用于普通用户(不需要专业 IT 技术的)的爬虫工具,可以方便的通过鼠标和简单配置获取你所想要数据.例如知乎回答列表.微博热门.微博评论.淘宝.天猫.亚马逊等电商 ...
随机推荐
- Django的mode的分组查询和聚合查询和F查询和Q查询
1.聚合查询 # 聚合函数aggregate,求指定字段的最大值,最小值,平均值,和的值,方法如下 from django.db.models import Avg from django.db.mo ...
- swift UIAlertController使用 UIAlertController的宽度 为270
添加子控件 1. 有标题, alert标题高度大概 是 40, 子控件的 Y一般在40 ,如果中间有换行, \n 的高度大概是30 2.alert的宽度 是270, 设置frame 的时候注意 /// ...
- DataTable的序列化和反序列化
/// <summary> /// DataTable序列化 /// </summary> /// <param name="dt"></ ...
- 『SpringMVC』<context:include-filter>&<context:exclude-filter>爬坑
原文地址:https://segmentfault.com/a/1190000012972619 大家好,我是猪弟,猪在我心中从来不是蠢的代名词,而是懒的代名词,本次准备记录一个在开发测试过程中遇到的 ...
- c3p0数据源配置
Xml代码 <c3p0-config> <default-config> <!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数.Default: --> ...
- static 和 final
static是静态修饰关键字,可以修饰变量和程序块以及类方法:当你定义一个static的变量的时候jvm会将将其分配在内存堆上,所有程序对它的引用都会指向这一个地址而不会重新分配内存:修饰一个程序块的 ...
- 如果程序集是从 Web 上下载的,即使它存储于本地计算机,Windows 也会将其标记为 Web 文件,http://go.microsoft.com/fwlink/?LinkId=179545
使用Silverlight,经常弄出很多莫名的XXX文件来于Web,神马信任程序集,就Build个程序都那么麻烦,应该在所有发布时注明一些最基本的配置说明,最BT莫过于连下载程序集的地方都找不到. 若 ...
- java网络爬虫实现信息的抓取
转载请注明出处:http://blog.csdn.NET/lmj623565791/article/details/23272657 今天公司有个需求,需要做一些指定网站查询后的数据的抓取,于是花了点 ...
- 2018.09.08 bzoj1151: [CTSC2007]动物园zoo(状压dp)
传送门 状压dp好题啊. 可以发现这道题的状压只用压缩5位. f[i][j]表示当前在第i个位置状态为j的最优值. 显然可以由f[i-1]更新过来. 因此只用预处理在第i个位置状态为j时有多少个小朋友 ...
- IntelliJ IDEA 2017版 spring-boot加载jsp配置详解(详细图文实例)
一.创建项目 (File--->New-->Project) 2.项目配置内容 3.选择配置项目的Group包名,Artifact项目名称 4.选择项目类型为web类型 5.创建成功,点击 ...