平庸技术流,用 WebApi +AngularJS 实现网络爬虫

最近园子里网络爬虫很火爆,从 PHP 到 Python,从 windows服务 到 winform 程序,各路大神各显神通。小弟也献下丑,从平庸流出发,简述下 WebApi +AngularJS 方式实现网络爬虫。

一、技术框架

1.1 前端:

AngularJS,创建SPA(单页面应用)。爬虫需要长时间的等待服务器返回结果,必须使用ajax实现,使用JQuery一样可以做到。

 

1.2 后端:

WebApi。AngularJS 配合 WebApi 使用十分融洽。

 

1.3 后端用到的框架/库:

a. Abp,最近园子里很火的基础框架,最大的优点是分模块的实现,包括 AppService(WebApi) 层的分模块,使用后,代码结构非常清晰。详细内容可以见 基于DDD的现代ASP.NET开发框架--ABP系列文章总目录

 

b. 苏飞论坛的C#HttpHelper万能框架,用于Html页面的采集,可以直接使用『HTTP代理』读取,这点很重要!

需要注意的一点是,这个框架不是免费的,需要成为年费会员才可以下载。

 

c. Ivony的Jumony库,项目介绍:“Jumony Core首先提供了一个近乎完美的HTML解析引擎,其解析结果无限逼近浏览器的解析结果。支持CSS3选择器。”

 

二、技术实现

2.1、抓取免费的 Http 代理地址。

这个百度就行,可以搜索到一大堆的提供 Http 代理网址的网站,首先将这些免费的Http代理抓取大自己的代理库,第二步和第三步需要用到这些代理。使用时,要记录代理的可用情况,设定策略,失败次数过多时,剔除掉。

当然,土豪直接购买收费的代理即可,稳定性高。

下面是我抓取的代理列表:

被禁的代理(我设定策略是失败次数大于成功次数3次,即抛弃):

 

2.2、读取文章列表(单线程)

有了足够的Http代理列表后,就可以抓取网页了。

后端实现功能:使用 HttpHelper 挂代理抓取网页,然后使用  Jumony 分析页面内容。同时要记录每个 Http 代理的成功/失败情况。

前端控制流程:根据 WebApi 返回的结果,判断是否抓取成功。如果成功,继续下一个页面的抓取;如果失败,换个代理继续抓取当前页。

由于文章列表不会太多,用单线程抓取足够了。

上图:

 

2.3、读取文章(多线程)

通过第二步抓取到了大量未读取内容的文章后,这时候就需要抓取文章内容了。由于量比较大,通过多线程实现。

所谓的多线程,就是通过 Ajax 同时调用多个 WebApi 进程,通过监控返回结果。

上图:

点击『开始读取』后

 点击『停止读取』后:

 

三、后记

没有用到什么高深的知识,高深的部分都被 AngularJS、Abp、HttpHelper、Jomony实现,因此是平庸技术流的实现。

以上。

 

转载于:https://www.cnblogs.com/dusdong/p/4733594.html

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

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

相关文章

linker `cc` not found

运行rustc hello_world.rs时出错。原因: 我的 gcc 是安装的指定版本 gcc-4.8,安装指定版本 gcc 可参考我的另一篇博文,这里找不到 cc 的原因是在移除原来软链的时候,cc 的软链也移除了。重新建立软链即可。 sudo ln -s gcc cc还有…

C# 通过服务启动窗体(把窗体添加到服务里)实现用户交互的windows服务[转发]...

由于个人需要,想找一个键盘记录的程序,从网上下载了很多,多数都是需要注册的,另外也多被杀软查杀。于是决定自己写一个,如果作为一个windows应用程序,可以实现抓取键盘的记录。想要实现随系统启动的话&…

error: default argument given for parameter 4

原因&#xff1a;定义函数的时候参数部分有默认值&#xff0c;如下&#xff1a; int classA::print(int a 0) {std::cout << a << std::endl; }分析&#xff1a;声明函数时参数可以有默认值&#xff0c;定义时不能。

python2.7虚拟环境virtualenv安装及使用

一 、虚拟环境virtualenv安装 1. 安装virtualenv 将Python的目录添加到系统环境变量后&#xff0c;在命令行输入&#xff1a; pip install virtualenv C:\Users\heroicai\Desktop>pip install virtualenv2. 建立虚拟环境 在桌面上建立建立一个虚拟环境myenv,输入:virtualenv…

Io 异常: The Network Adapter could not establish the connection

Io 异常: The Network Adapter could not establish the connection 这个异常的出现一般与数据库和你的PC的设置有关 这种异常的出现大致上有下面几种&#xff1a; 1。IP错误。 在设置URL时错误&#xff0c;例如&#xff1a;jdbc:oracle:thin:192.168.0.36:1521:sharp 数据库服…

git 删除tag

git tag -d v1.0如果 tag 已经在远程分支&#xff0c;还需执行一句git push origin :refs/tags/v1.0另&#xff1a;打 tag 的时候最好加上 description&#xff0c;防止出现未知的错误&#xff0c;如 Jenkins 集成的时候生成的包名不对等。

leetcode 的shell部分4道题整理

对shell的某些细节还不是十分熟悉&#xff0c;借鉴了好多别人的东西 1. Word Frequency此题很简单&#xff0c;只要能排序就可以cat words.txt |tr -s " " "\n" sort | unique -c | sort -r | awk {print $2" "$1}2. Valid Phone Numbers cat …

Mysql操作集锦

mysql安装成功后可以看到已经存在mysql、information_schema和test这个几个数据库&#xff0c;information_schema库中有一个名为COLUMNS的表&#xff0c;这个表中记录了数据库中所有表的字段信息。知道这个表后&#xff0c;获取任意表的字段就只需要一条select语句即可。 例如…

shadows a parameter

原因&#xff1a;函数内声明变量与参数名相同。 如&#xff1a; void print(int hello) {int hello;std::cout << hello << std::endl; }解决办法&#xff1a;改变参数参数名或者局部变量名

iOS 9之WatchKit for WatchOS 2

金田&#xff08;github示例源码&#xff09; 自AppleWatch发行的同时就可以为AppWatch开发相应的应用程序&#xff0c;不过最初的版本&#xff0c;能开发的功能极为有限&#xff0c;所以也只是有少数的App厂商为Apple定制了App&#xff0c;所以迄今为止&#xff0c;Apple Stor…

创建响应式布局的10款优秀网格工具集锦

在这篇文章中&#xff0c;我们为您呈现了一组优秀的网格工具清单。如果我们错过了任何没有列出在这个清单上的东西&#xff0c;请分享给我们。如果网页设计和开人员采用了正确的工具集&#xff0c;并基于一个灵活的网格架构&#xff0c;以及能够把响应图像应用到到设计之中&…

expected initializer before

原因&#xff1a;某个地方缺少分号 如&#xff1a; void print(int a) {int b ///wrong herestd::cout << a << std::endl; }解决&#xff1a;重点排查报错行前几行的变量声明等。

memcpy、memmove、memset、memchr、memcmp、strstr详解

第一部分  综述 memcpy、memmove、memset、memchr、memcmp都是C语言中的库函数&#xff0c;在头文件string.h中。memcpy和memmove的作用是拷贝一定长度的内存的内容&#xff0c;memset用于缓冲区的填充工作&#xff0c;memchr用于字符的查找工作&#xff0c;memcmp用于比较内…

21分钟 MySQL 入门教程(转载)

链接&#xff1a;http://www.cnblogs.com/mr-wid/archive/2013/05/09/3068229.html转载于:https://www.cnblogs.com/hxb316/p/3966731.html

Maven仓库详解

转载自&#xff1a;Maven入门指南④&#xff1a;仓库 1 . 仓库简介 没有 Maven 时&#xff0c;项目用到的 .jar 文件通常需要拷贝到 /lib 目录&#xff0c;项目多了&#xff0c;拷贝的文件副本就多了&#xff0c;占用磁盘空间&#xff0c;且难于管理。Maven 使用一个称之为仓库…

c++ 从 string 到 short

string test"1234"; short *p reinterpret_cast<short*>(const_cast<char*>(test.c_str()));从 short 到 char * char *q reinterpret_cast<char*>(const_cast<short*>(p));还可以利用 memcpy 这个函数 #include <cstring>short a…

JavaScript02

JavaScript02 如果<head>标签中包含的外部文件很多&#xff0c;那么这将直接导致页面展示速度很慢。因为html只有当<body>元素开始之后&#xff0c;才会开始页面展示动作&#xff0c;因此&#xff0c;最直接的解决办法就是&#xff0c;将一部分不是页面加载之后立刻…

.NET使用NPOI读取Word模板并替换关键字并下载

NPOI 是 POI 项目的 .NET 版本。POI是一个开源的Java读写Excel、WORD等微软OLE2组件文档的项目。 使用 NPOI 你就可以在没有安装 Office 或者相应环境的机器上对 WORD/EXCEL 文档进行读写 NPOI下载地址&#xff1a;http://npoi.codeplex.com/ 以下代码仅供参考&#xff0c;请根…

中间件、MetaQ入门学习

目录 1. 中间件技术 2. MetaQ中间件 3. MetaQ编程实践 1. 中间件技术 0x1: 中间件简介 中间件(Middleware)是提供系统软件和应用软件之间连接的软件&#xff0c;以便于软件各部件之间的沟通&#xff0c;特别是应用软件对于系统软件的集中的逻辑&#xff0c;在现代信息技术应用框…

MyBatis 入门到精通(二) SQL语句映射XML文件

MyBatis 真正强大之处就在这些映射语句&#xff0c;也就是它的魔力所在。对于它的强大功能&#xff0c;SQL 映射文件的配置却非常简单。 如果您比较SQL 映射文件配置与JDBC 代码&#xff0c;您很快可以发现&#xff0c;使用SQL 映射文件配置可以节省95%的代码量。MyBatis 被创建…