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 技术的)的爬虫工具,可以方便的通过鼠标和简单配置获取你所想要数据.例如知乎回答列表.微博热门.微博评论.淘宝.天猫.亚马逊等电商 ...
随机推荐
- visual code golang配置
前言 其实环境搭建没什么难的,但是遇到一些问题,主要是有些网站资源访问不了(如:golang.org), 导致一些包无法安装,最终会导致环境搭建失败,跟据这个教程几步,我们将可以快速的构建golang ...
- 常用特殊符号的HTML代码(HTML字符实体)
适当使用实体,对页面开发有相当大的帮助. 自己收集的一些常用的以实体代替与HTML语法相同的字符,避免浏览解析错误. 常用HTML字符实体(建议使用实体): 字符 名称 实体名 实体数 • 圆点 ...
- sqlserver2008debug存储过程
新建一个查询窗口,exec proc_name params…… 然后启动调试 右侧可以选择“逐过程”“逐语句”“跳出”,下方展示变量的值 参考文章:https://www.cnblogs.com/s ...
- 记录java版本不兼容的坑,(kafka运行报错)
启动kafka报错 错误原因是: 由较高版本的jdk编译的java class文件 试图在较低版本的jvm上运行的报错 解决办法是: 查看java版本 C:\Users\Administrator&g ...
- jmeter完成数据批量添加
Jmeter结构如图 目的: 需要在每个组织下面分别添加5个设备资源 思路: 1.先登录平台 2.进入系统配置页面 3.获取到每个区域的ID 4.在每个区域下面添加设备资源 重点及难点: 1.登录加密 ...
- linux下安装oracle数据库详细教程
一.安装yum源 下载或拷贝RedHat的iso镜像到本地,比如 /repo/iso/ rhel-server-6.6-x86_64-dvd.iso 1.建立ISO文件存放目录(/repo/iso)和 ...
- IETF
一.简介 https://zh.wikipedia.org/wiki/%E4%BA%92%E8%81%94%E7%BD%91%E5%B7%A5%E7%A8%8B%E4%BB%BB%E5%8A%A1%E ...
- PAT 1035 插入与归并(25)(代码+思路+测试点分析)
1035 插入与归并(25 分) 根据维基百科的定义: 插入排序是迭代算法,逐一获得输入数据,逐步产生有序的输出序列.每步迭代中,算法从输入序列中取出一元素,将之插入有序序列中正确的位置.如此迭代直到 ...
- java.text.SimpleDateFormat的使用
SimpleDateFormat 是一个以国别敏感的方式格式化和分析数据的具体类. 它允许格式化 (date -> text).语法分析 (text -> date)和标准化. Simpl ...
- Storm 系列(二)实时平台介绍
Storm 系列(二)实时平台介绍 本章中的实时平台是指针对大数据进行实时分析的一整套系统,包括数据的收集.处理.存储等.一般而言,大数据有 4 个特点: Volumn(大量). Velocity(高 ...