平庸技術流,用 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.pswp.cn/news/375643.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/375643.shtml
英文地址,請注明出處:http://en.pswp.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 被創建…