.NET Core玩转爬虫系列之借助正则表达式入门篇

接下来一段时间,我会花些时间研究C#玩转爬虫的方法及其实践。

话不多说,开始吧~

一般来说:

设计并实现一个爬虫的步骤是:

模拟登录 -> 模拟发送request请求 -> 取回response数据 -> 提取所需信息并将其进行重新组织 -> 存入DB或文件中 -> 后期处理或展示

流程图

640?wx_fmt=png

当然,有时还需要适当地应对所抓取目标站点的反爬虫策略,也就是大家常说的反反爬

下文以抓取豆瓣音乐为例来具体说明:

比如,我们在豆瓣音乐中搜索"摇滚"后爬取相关内容,然后写入csv文件中。

目标网址是:

https://music.douban.com/tag/摇滚?start=0&type=T

640?wx_fmt=png

抓取大概分为如下几个步骤:

获取页数

  • 发请求

每一页中都可以看到总的页数,直接取第1页的就好。

    byte[] buffer = webclient.DownloadData("https://music.douban.com/tag/%E6%91%87%E6%BB%9A?start=0&type=T");// utf-8, gb2312, gbk, utf-1......string html = System.Text.Encoding.GetEncoding("utf-8").GetString(buffer);

借助以上两行代码,就可以看到该网址Response的HTML字符串(debug时上面一行代码中html的值)为:

640?wx_fmt=png

  • 使用正则表达式匹配到页数

我们选用模式串 ">[0-9][0-9]{0,}</a>" 进行匹配,由于下面的页码是从第一页算起的,选最大页数就是总页数。

相应的函数GetTotalCount如下:

        private static int GetTotalCount(System.Net.WebClient webclient, int startIdx){//html下载/* https://music.douban.com/tag/%E6%91%87%E6%BB%9A?start=0&amp;type=T  */byte[] buffer = webclient.DownloadData("https://music.douban.com/tag/%E6%91%87%E6%BB%9A?start=" + startIdx + "&amp;type=T");// utf-8, gb2312, gbk, utf-1......string html = System.Text.Encoding.GetEncoding("utf-8").GetString(buffer);MatchCollection pageCount_matches = new Regex("&gt;[0-9][0-9]{0,}&lt;/a&gt;").Matches(html);if (pageCount_matches.Count == 0)return 0;string tempPageNum = pageCount_matches[pageCount_matches.Count - 1].Value;int.TryParse(tempPageNum.Replace("&lt;/a&gt;", string.Empty).Substring(1), out int lastPageNum);return lastPageNum;}

获取当前页的数据

  • 发请求

用与上一步相同的方法

byte[] buffer = webclient.DownloadData("https://music.douban.com/tag/%E6%91%87%E6%BB%9A?start=0&amp;type=T");// utf-8, gb2312, gbk, utf-1......
string html = System.Text.Encoding.GetEncoding("utf-8").GetString(buffer);

debug时可得到当前页对应的HTML字符串:

640?wx_fmt=png

  • 使用正则表达式匹配到每一天记录

我们选用模式串 "<p class=\"pl\">([\\s\\S]*?)</p>" 进行匹配,可得到如下格式的内容:

刺猬 / 2018-01-08 / 单曲 / 数字(Digital) / 摇滚

接着进行split可得到一个记录的各个属性。

具体的函数GetCurrentPageRecords如下:

    private static void GetCurrentPageRecords(System.Net.WebClient webclient, int startIdx){byte[] buffer = webclient.DownloadData("https://music.douban.com/tag/%E6%91%87%E6%BB%9A?start=" + startIdx + "&amp;type=T");// utf-8, gb2312, gbk, utf-1......string html = System.Text.Encoding.GetEncoding("utf-8").GetString(buffer);// Console.WriteLine(html);// html分析// 通过正则获取到需要的数据// &lt;p class="pl"&gt;刺猬 / 2018-01-08 / 单曲 / 数字(Digital) / 摇滚&lt;/p&gt;MatchCollection musicItem_matches = new Regex("&lt;p class=\"pl\"&gt;([\\s\\S]*?)&lt;/p&gt;").Matches(html);int count = musicItem_matches.Count;for (int i = 0; i &lt; count; i++){string item = musicItem_matches[i].Result("$1");string[] strArr = item.Trim().Split('/');Record record = new Record{SongName = strArr[0],Date = strArr.ElementAtOrDefault(1),Album = strArr.ElementAtOrDefault(2),Type = strArr.ElementAtOrDefault(3),Topic = strArr.ElementAtOrDefault(4)};_records.Add(record);}}

获取所有页的数据

  • 循环修改url中start的值

https://music.douban.com/tag/摇滚?start=0&type=T

第一页的start=0,每页20条,于是后面每一页的start是前一页start的值+20

  • 发请求

  • 将每页的数据加入到Array或List中

写入csv

  • 在VS的NuGet包管理器中为当前项目引入CSVHelper.

640?wx_fmt=png

  • 将一条记录封装成一个类Record

Record.cs

using System;
using System.Collections.Generic;
using System.Text;namespace CsSpider
{public class Record{public string SongName { get; set; }public string Date { get; set; }public string Album { get; set; }public string Type { get; set; }public string Topic { get; set; }}
}// 举例: 万能青年旅店 / 2010-11-12 / 专辑 / CD / 摇滚
  • 使用CSVHelper把获得的所有数据写入到csv中

    if (_records.Count &gt; 0){var writer = new StreamWriter(_filename);using (var csv = new CsvWriter(writer)){csv.WriteRecords(_records);Console.WriteLine("导出完成.");}}

解决乱码问题

只需要给上述writer设置Encoding即可~

        if (_records.Count &gt; 0){var writer = new StreamWriter(_filename, false, System.Text.Encoding.UTF8);  // 设置Encoding,防止乱码using (var csv = new CsvWriter(writer)){csv.WriteRecords(_records);Console.WriteLine("导出完成.");}}

运行结果

640?wx_fmt=png

最后得到的CSV文件如下:

640?wx_fmt=png

接下来,会发现一个问题:

如果多执行几次,前面的HTML字符串会变成下面这种内容:

&lt;script&gt;var d=[navigator.platform,navigator.userAgent,navigator.vendor].join("|");window.location.href="https://sec.douban.com/a?c=3d001f&amp;d="+d+"&amp;r=https%3A%2F%2Fmovie.douban.com%2Fsubject%2F26590960%2F";&lt;/script&gt;

说明此时,你触发了豆瓣的反作弊功能。如果再多执行几次,会出现 403 Error.

解决办法是模拟登录,这个留在下一篇文章再说,敬请关注!

CsSpider · yanglr/csharp_spiderhttps://github.com/yanglr/csharp_spider/tree/master/spider-test/CsSpider

欢迎star、fork或拉取使用和研究!!!

640?wx_fmt=jpeg

smiley_66.png你点的每一个"在看"

                                           我都当成了喜欢!

640?wx_fmt=gif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/314336.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ASP.NET Core on K8S深入学习(5)Rolling Update

本篇已加入《.NET Core on K8S学习实践系列文章索引》&#xff0c;可以点击查看更多容器化技术相关系列文章。01—What is Rolling Update?为了服务升级过程中提供可持续的不中断的服务&#xff0c;K8S提供了Rolling Update机制&#xff0c;它可以使得服务近乎无缝地平滑升级&…

依赖注入在 dotnet core 中实现与使用:1 基本概念

关于 Microsoft Extension: DependencyInjection 的介绍已经很多&#xff0c;但是多数偏重于实现原理和一些特定的实现场景。作为 dotnet core 的核心基石&#xff0c;这里准备全面介绍它的概念、原理和使用。这里首先介绍概念部分。1. 概念该项目在 GitHub 的地址&#xff1a;…

【LOJ#572】Misaka Network 与求和(莫比乌斯反演/杜教筛/min_25筛)

【LOJ#572】Misaka Network 与求和 https://www.cnblogs.com/cjyyb/p/10170630.html 看到次大质因子就可以想到是min_25筛了&#xff0c;然后只需要做莫比乌斯反演&#xff0c;然后预处理整除分块点的前缀和&#xff0c;然后再结合杜教筛即可。

软件设计的第一性原理:结构化抽象

软件设计的第一性原理&#xff0c;是结构化抽象。术生于道&#xff0c;技术生于原理。引语所谓的第一性原理&#xff0c;就是无论使用什么方法论&#xff0c;都无法绕过的那最最基础的部分。无论是 DDD 设计&#xff0c;还是面向模式的架构设计&#xff0c;或 微服务架构&#…

基于.NetCore结合docker-compose实践Gitlab-CI/CD 排坑指南

引言看过docker-compose真香的园友可能留意到当时是【把部署dll文件拷贝到生产机器】&#xff0c;即时打包成镜像并启动容器&#xff0c;并没有完成CI/CD。经过长时间实操验证&#xff0c;终于完成基于Gitlab的CI/CD实践&#xff0c;本次实践的坑位很多&#xff0c; 实操过程尽…

.NET Core很酷,你不得不知

我一直回想我的第一篇博文&#xff0c;那是关于多个服务的服务器平台的详细教程&#xff0c;它使用 GitLab CI 在 AWS 上&#xff0c;当时使用单个命令行进行部署&#xff0c; 至今回想&#xff0c;令人感觉很酷。前几天&#xff0c;我偶然听说一些软件公司的 HR 在招聘原则上拒…

程序员修神之路--高并发系统设计负载均衡架构

点击上方“蓝字”关注&#xff0c;酷爽一夏菜菜哥&#xff0c;上次你给我讲的分库分表策略对我帮助很大有帮助就好&#xff0c;上次请我的咖啡也很好喝~呵呵&#xff0c;不过随着访问量的不断加大&#xff0c;网站我又加了nginx做负载均衡好呀&#xff0c;看来要进阶高级工程师…

【学习笔记】Docker - 01. Docker是啥

我只是把之前的学习笔记整理一下&#xff0c;贴到这里&#xff0c;可能会显得比较凌乱。。。1.1 啥是Docker?Docker 是一个开源项目&#xff0c;它被用来做构建、打包和运行程序。它是一个命令行程序&#xff0c;一个后台进程&#xff0c;也是一组使用逻辑方法来解决常见软件问…

使用 .NET CORE 创建 项目模板,模板项目,Template

场景&#xff1a;日常工作中&#xff0c;你可能会碰到需要新建一个全新的解决方案的情况&#xff08;如公司新起了一个新项目&#xff0c;需要有全新配套的后台程序&#xff09;&#xff0c;如果公司内部基础框架较多、解决方案需要DDD模式等&#xff0c;那么从新起项目到各种依…

谈谈surging 微服务引擎 2.0的链路跟踪和其它新增功能

一、前言surging是基于.NET CORE 服务引擎。初始版本诞生于2017年6月份&#xff0c;经过NCC社区二年的孵化&#xff0c;2.0版本将在2019年08月28日进行发布&#xff0c;经历二年的发展&#xff0c;已经全部攘括了微服务架构的技术栈&#xff0c;覆盖了从服务注册、服务发现、中…

奇淫巧技-Flutter调用C#

前言众所周知&#xff0c;Xamarin应该是.net下的跨平台开发工具。2016年之前还处于收费状态&#xff0c;后被微软收购后开源。但似乎有个现象&#xff0c;开源后的Xamarin发展似乎有些停滞&#xff0c;而且维护Xamarin的团队又很固执不愿变通。社区多次建议UI层应该统一绘图引擎…

.NET World——gPRC概览

官方的定义&#xff1a;gRPC is a modern open source high performance RPC framework that can run in any environment. It can efficiently connect services in and across data centers with pluggable support for load balancing, tracing, health checking and authen…

推荐高质量的公众号,值得跟进学习!

为大家推荐几个高质量的公众号&#xff1a;当你迷茫的时候刷刷这些大公司的牛人所运营的公众号&#xff0c;就可以知道自己的不足&#xff0c;不是仅仅局限于.NET技术之下&#xff0c;通过他们扩展我们的知识宽度&#xff0c;我们可以一起来学习。人工智能爱好者社区专注人工智…

.net core redis的全套操作

Redis支持五种数据类型&#xff1a;string&#xff08;字符串&#xff09;&#xff0c;hash&#xff08;哈希&#xff09;&#xff0c;list&#xff08;列表&#xff09;&#xff0c;set&#xff08;集合&#xff09;及zset(sorted set&#xff1a;有序集合)。Redis支持主从同步…

Stack Overflow引入CROKAGE,搜问题不用再东拼西凑

许多开发者使用 Stack Overflow 搜索开发中遇到的问题&#xff0c;有时候需要查询的结果中有通俗的讲解&#xff0c;而且最好还能够带上代码 demo&#xff0c;但是两者同时很完美地满足要求还是比较困难的。不过最近 Stack Overflow 官方博客上介绍了一种智能化的技术&#xff…

使用Kubectl部署应用

目录 使用Kubectl部署应用 Kubectl部署流程 部署一个简单的Demo网站 使用Kubectl部署应用一旦运行了Kubernetes集群&#xff0c;就可以在其上部署容器化应用程序。因此在开始之前&#xff0c;我们需要先确保集群已经准备就绪&#xff0c;无论是使用Minikube还是kubeadm创建的集…

Docker系列之.NET Core入门(三)

在Docker生态系统中除了上一节所讲解的基本概念&#xff0c;还有其他专业术语&#xff0c;本文我们将一笔带过&#xff0c;同时会开始陆续进入到在.NET Core中使用Docker。专业术语Docker Engine&#xff08;Docker引擎&#xff09;&#xff1a;客户端 - 服务器应用程序。Docke…

通过Blazor使用C#开发SPA单页面应用程序(4) - Ant Design

通过Blazor使用C#开发SPA单页面应用程序(1)通过Blazor使用C#开发SPA单页面应用程序(2)通过Blazor使用C#开发SPA单页面应用程序(3)前面学习了Blazor的特点、环境搭建及基础知识&#xff0c;现在我们尝试的做个实际的组件。Ant Design是蚂蚁金服是基于Ant Design设计体系的 UI 组…

Mercurial黄昏,Bitbucket宣布全面转向Git

源代码托管平台 Bitbucket 宣布将逐步放弃对版本控制系统 Mercurial 的支持。Bitbucket 推出于 2008 年&#xff0c;当时集中式版本控制是比较普遍的&#xff0c;Mercurial 是其中的典型代表&#xff0c;但是当前 Git 才是主流&#xff0c;它已经成为了大部分开源项目的首选版本…

使用 Azure DevTest Lab 搭建云端开发测试环境

点击上方蓝字关注“汪宇杰博客”导语程序员和测试工程师经常需要自己搭环境用于开发和测试目的&#xff0c;这些机器可能只会使用很短一段时间。通常我们会在本机使用 Hyper-V、VMWare 之类的虚拟机产品&#xff0c;或者使用企业IT管理员分配的虚拟机去完成这项工作。然而安装配…