1. 程式人生 > >爬蟲技術 -- 進階學習(十)網易新聞頁面資訊抓取(htmlagilitypack搭配scrapysharp)

爬蟲技術 -- 進階學習(十)網易新聞頁面資訊抓取(htmlagilitypack搭配scrapysharp)

最近在弄網頁爬蟲這方面的,上網看到關於htmlagilitypack搭配scrapysharp的文章,於是決定試一試~

於是到https://www.nuget.org/packages/ScrapySharp去看看,

看到這句下載提示:To install ScrapySharp, run the following command in the Package Manager Console

PM> Install-Package ScrapySharp

操作說明:From the Tools menu, select Library Package Manager and then click 

Package Manager Console.

發現還沒裝[email protected][email protected]!!

一、 安裝Nuget

  1. Visual studio 2012-> Tool-> Extension Manager。

  2. 選擇Online Gallery,在右上角的搜尋中輸入Nuget,之後按提示安裝即可。

  3. 安裝之後選單View-> Other windows中會出現Package Manager Console, 這是一個整合到VS中的控制檯工具。

注意:在選擇ScrapySharp的版本的時候也要考慮htmlAgilityPack的版本 

於是,繼續操作Tools->Library Package Manager->Package Manager Console

PM> Install-Package HtmlAgilityPack
正在安裝“HtmlAgilityPack 1.4.6”。
已成功安裝“HtmlAgilityPack 1.4.6”。
正在將“HtmlAgilityPack 1.4.6”新增到 WindowsFormsDemo0320。
已成功將“HtmlAgilityPack 1.4.6”新增到 WindowsFormsDemo0320。
PM> Install-
Package ScrapySharp 正在嘗試解析依賴項“HtmlAgilityPack (≥ 1.4.6)”。 正在安裝“ScrapySharp 2.2.63”。 已成功安裝“ScrapySharp 2.2.63”。 正在將“ScrapySharp 2.2.63”新增到 WindowsFormsDemo0320。 已成功將“ScrapySharp 2.2.63”新增到 WindowsFormsDemo0320。

接下來開始進行抓取,

下面實現的效果是,抓取title標籤的內容和正文內容(也就是<div id="endText">…(捕捉<p></p>中間的內容)…</div>)

捕捉title的時候需要注意,有時候一個網頁不只一對title標籤!!

但是,其實網易新聞頁面顯示的標題儲存的標籤<h1 id="hltitle">……</h1>

所以提取標題的核心程式碼為

String title = doc.DocumentNode.SelectSingleNode("//h1[@id='h1title']").InnerText;

捕捉正文內容的核心程式碼:

html.CssSelect("p").CssSelectAncestors("div#endText");

下面看下該新聞頁面正文部分的html程式碼:

<div id="endText"></p><p>人民網蘭州4月13日電 蘭州市今天下午召開新聞釋出會,初步查明瞭導致自流溝內水體苯超標的原因。根據環保專家現場初步分析判斷,周邊地下含油汙水是引起自流溝內水體苯超標的直接原因。</p><p>根據目前的調查情況初步判定,自流溝周邊地下含油汙水形成的原因有三點:一是原蘭化公司原料動力廠原油蒸餾車間R205A#渣油罐曾於1987年12月28日8時50分發生物理爆破事故,罐體破裂造成90立方渣油瀉出,其中有34噸渣油跑料未能回收,滲入地下;二是原蘭化公司原料動力廠原油蒸餾車間泵B-113出口總管曾於2002年4月3日發生開裂著火,洩漏的渣油及救火過程中產生的大量消防汙水滲入地下。</p><p>另據中新網蘭州4月13日電&nbsp; 蘭州市“4·11”區域性自來水苯指標超標事故應急處置領導小組副組長鄭志強13日說,調查組從11日下午3時開始展開調查工作,採取開挖深坑的方法,查詢到了導致水體苯超標的方位。根據環保專家現場初步分析判斷,周邊地下含油汙水是引起自流溝內水體苯超標的直接原因。</p><p>蘭州官方通報稱,根據目前的調查情況初步判定,自流溝周邊地下含油汙水的形成原因有兩個:</p><p>一是原蘭化公司原料動力廠原油蒸餾車間R205A#渣油罐(該址原為蘭化公司原料動力廠250萬噸/年煉油裝置,該裝置建於1982年,2003年停用,2006年拆除。拆除後,在原址建成現有的40萬噸/年芳烴抽提裝置,罐區設計分別儲存餾份油、輕油、渣油),曾於1987年12月28日8時50分發生物理爆破事故,罐體破裂造成90立方渣油洩出,其中有34噸渣油跑料未能回收,滲入地下。</p><p><!-- AD200x300_2 -->
<div class="gg200x300">
<iframe src="http://g.163.com/r?site=netease&affiliate=news&cat=article&type=logo300x250&location=13" width="300" height="250" frameborder="no" border="0" marginwidth="0" marginheight="0" scrolling="no"> </iframe>
</div><p>二是原蘭化公司原料動力廠原油蒸餾車間泵B—113出口總管曾於2002年4月3日發生開裂著火,洩漏的渣油(具體數量當時未統計)及救火過程中產生的大量消防汙水滲入地下。</p><p>鄭志強說,目前蘭州石化現有生產裝置及罐區執行正常,未發現物料及產品洩漏現象。生產區域內雨排井、化汙系統水封井未發現物料洩漏現象,消防井內發現有少量飄油。</p><p>事故調查組下一步調查工作的重點是,對從開挖深坑中提取的含油廢水組份進行化驗,進一步從技術層面核實地下含油汙水與自流溝內苯超標水體的關聯性。同時,對4號、3號自流溝內的具體洩漏點位進行實地勘查核實,並對造成區域性自來水苯超標事件的相關責任單位和責任人進行進一步的調查取證。(完)</p>
<div class="ep-source cDGray"> <span class="left"><a href="http://news.163.com/"><img src="http://img1.cache.netease.com/cnews/css13/img/end_news.png" alt="netease" width="13" height="12" class="icon"></a> 本文來源:人民網 作者:高翔、銀燕、苗亮軍</span> <span class="ep-editor">責任編輯:NN102</span>
</div> </div>

下面貼一下實現的核心程式碼(但是編碼處理部分程式碼沒有貼出)

新增 :using ScrapySharp.Extensions;

namespace HtmlAgilityDemo 
{ 
    class Program 
    { 
        static void Main(string[] args) 
        { 
            var uri = new Uri("http://news.163.com/14/0413/18/9PNVIBV000014JB6.html"); 
            var browser1 = new ScrapingBrowser(); 
            var html1 = browser1.DownloadString(uri); 
            var doc = new HtmlDocument(); 
            doc.LoadHtml(html1); 
            var html = doc.DocumentNode;

            var title = html.CssSelect("title"); 
            foreach (var htmlNode in title) 
            { 
                Console.WriteLine(htmlNode.InnerText); 
            }

var ps = html.CssSelect("p").CssSelectAncestors("div#endText"); foreach (var htmlNode in ps) { Console.WriteLine(htmlNode.InnerHtml); } } } }

執行後輸出:

蘭州官方公佈自流溝周邊地下含油汙水形成原因_網易新聞中心
                
人民網蘭州4月13日電 蘭州市今天下午召開新聞釋出會,初步查明瞭導致自流溝內水體苯超標的原因。根據環保專家現場初步分析判斷,周邊地下含油汙水是引起自流溝內水體苯超標的直接原因。根據目前的調查情況初步判定,自流溝周邊地下含油汙水形成的原因有三點:一是原蘭化公司原料動力廠原油蒸餾車間R205A#渣油罐曾於1987年12月28日8時50分發生物理爆破事故,罐體破裂造成90立方渣油瀉出,其中有34噸渣油跑料未能回收,滲入地下;二是原蘭化公司原料動力廠原油蒸餾車間泵B-113出口總管曾於2002年4月3日發生開裂著火,洩漏的渣油及救火過程中產生的大量消防汙水滲入地下。另據中新網蘭州4月13日電&nbsp; 蘭州市“4·11”區域性自來水苯指標超標事故應急處置領導小組副組長鄭志強13日說,調查組從11日下午3時開始展開調查工作,採取開挖深坑的方法,查詢到了導致水體苯超標的方位。根據環保專家現場初步分析判斷,周邊地下含油汙水是引起自流溝內水體苯超標的直接原因。蘭州官方通報稱,根據目前的調查情況初步判定,自流溝周邊地下含油汙水的形成原因有兩個:一是原蘭化公司原料動力廠原油蒸餾車間R205A#渣油罐(該址原為蘭化公司原料動力廠250萬噸/年煉油裝置,該裝置建於1982年,2003年停用,2006年拆除。拆除後,在原址建成現有的40萬噸/年芳烴抽提裝置,罐區設計分別儲存餾份油、輕油、渣油),曾於1987年12月28日8時50分發生物理爆破事故,罐體破裂造成90立方渣油洩出,其中有34噸渣油跑料未能回收,滲入地下。<!-- AD200x300_2 --> 二是原蘭化公司原料動力廠原油蒸餾車間泵B—113出口總管曾於2002年4月3日發生開裂著火,洩漏的渣油(具體數量當時未統計)及救火過程中產生的大量消防汙水滲入地下。鄭志強說,目前蘭州石化現有生產裝置及罐區執行正常,未發現物料及產品洩漏現象。生產區域內雨排井、化汙系統水封井未發現物料洩漏現象,消防井內發現有少量飄油。事故調查組下一步調查工作的重點是,對從開挖深坑中提取的含油廢水組份進行化驗,進一步從技術層面核實地下含油汙水與自流溝內苯超標水體的關聯性。同時,對4號、3號自流溝內的具體洩漏點位進行實地勘查核實,並對造成區域性自來水苯超標事件的相關責任單位和責任人進行進一步的調查取證。(完)                                                                                                     本文來源:人民網  作者:高翔、銀燕、苗亮軍     
     責任編輯:NN102                                            

然後看下輸出,發現出現殘留【<!-- AD200x300_2 -->

部分註釋程式碼未被清除,那麼處理一下,

foreach (HtmlNode nodeScripte in node.Descendants("script").ToList())
{ nodeScripte.Remove(); }
foreach (HtmlNode nodeStyle in node.Descendants("style").ToList()) { nodeStyle.Remove(); } foreach (HtmlNode nodeComment in node.Descendants("//comment()").ToList()) { nodeComment.Remove(); }

 發現巢狀在其中的註釋標籤用上面的方法無法清除乾淨。

那麼採用下面方法,

foreach(var script in doc.DocumentNode.Descendants("script").ToArray())
{ script.Remove();
}
foreach(var style in doc.DocumentNode.Descendants("style").ToArray())
{ style.Remove();
}
foreach(var comment in doc.DocumentNode.SelectNodes("//comment()").ToArray())
{ comment.Remove();
}

執行後發現,已經清除乾淨。

把所有的script、style標籤從dom樹中去掉(為了解決迭代器在工作時不能從集合中Remove元素的問題,使用ToArray()轉換為陣列再遍歷)。

HtmlAgilityPack是使用XPath語法,"//comment()"在XPath中表示“所有註釋節點”。

一些相關的語句:

1、獲取網頁title:doc.DocumentNode.SelectSingleNode("//title").InnerText; 

  解釋:XPath中“//title”表示所有title節點。SelectSingleNode用於獲取滿足條件的唯一的節點。

2、獲取所有的超連結:doc.DocumentNode.Descendants("a")

3、獲取name為kw的input,也就是相當於getElementsByName():

     var kwBox = doc.DocumentNode.SelectSingleNode("//input[@name='kw']");

  解釋:"//input[@name='kw']"也是XPath的語法,表示:name屬性等於kw的input標籤。

4、其他:

var divs = html.CssSelect("div");  //all div elements

var nodes = html.CssSelect("div.content"); //all div elements with css class ‘content’

var nodes = html.CssSelect("div.widget.monthlist"); //all div elements with the both css class

var nodes = html.CssSelect("#postPaging"); //all HTML elements with the id postPaging

var nodes = html.CssSelect("div#postPaging.testClass"); // all HTML elements with the id postPaging and css class testClass 

var nodes = html.CssSelect("div.content > p.para"); //p elements who are direct children of div elements with css class ‘content’ 

var nodes = html.CssSelect("input[type=text].login"); // textbox with css class login 

We can also select ancestors of elements:

var nodes = html.CssSelect("p.para").CssSelectAncestors("div.content > div.widget");

參考連結:

相關推薦

爬蟲技術 -- 學習新聞頁面資訊htmlagilitypack搭配scrapysharp

最近在弄網頁爬蟲這方面的,上網看到關於htmlagilitypack搭配scrapysharp的文章,於是決定試一試~ 於是到https://www.nuget.org/packages/ScrapySharp去看看, 看到這句下載提示:To install ScrapySharp, run the fo

爬蟲技術 -- 學習【補充】獲取html中meta標籤中的content的內容

但是meta標籤中的content內容的抓取,沒有提及到! 上網搜尋了下,發現很少提及,所以寫篇隨筆,備忘一下! 還是在HtmlAgillityPack搭配ScrapySharp的環境下,具體如何配置點選上一篇連結。 例子:<meta name="keywords" content="召開新聞

MYSQL學習筆記八:MySQL備份和還原!視頻序號:_37)

back 系統 結構 生產 下載地址 family 需要 絕對路徑 isa 知識點十九:MySQL的備份的還原(38)   一、mysql的備份       1、通過使用mysqldump的命令備份         使用mysqldump命令備份,mysqldump命令將數

Java學習五天Struts框架

一、自定義一個Struts框架 1、MVC模式包括 Model:模型 View:檢視 Control:控制器 2、傳統mvc開發總結 ① 跳轉程式碼寫死,不靈活 ② 每次都去寫servlet,要web.xml中配置servlet! 3、自定義一個Struts框架 ① 配置檔案

Java學習四天泛型、反射泛型、註解、Log4J日誌元件

一、泛型 1、概述 泛型是JDK1.5以後才有的,可以在編譯時期進行型別檢查,且可以避免頻繁型別轉化! // 執行時期異常 @Test public void testGeneric() throws Exception { // 集合的宣告 List list

Java學習二天監聽器、國際化

一、監聽器 1、監聽器(listener):主要是用來監聽特定物件的建立或銷燬、屬性的變化的!是一個實現特定介面的普通java類! 2、物件: 自己建立自己用(不用監聽) 別人建立自己用(需要監聽) 3、Servlet中哪些物件需要監聽? request / se

Java學習第二四天Spring框架:事務管理、Spring與Hibernate整合

一、事務控制 1、引入 使用者訪問 > Action > Service > Dao 如何保證: 在service中呼叫2次dao,其中一個dao執行失敗,整個操作要回滾 2、事務控制概述 ① 程式設計式事務控制:自己手動控制事務 Jdbc程式

Java學習第二六天JavaScript增強、AJAX基礎

一、JavaScript增強 1、什麼是JavaScript ① 基於物件 JS本身就有一些現成的物件可供程式設計師使用,例如:Array、Math、String ② 事件驅動 JS程式碼寫好後,需要外界觸發後,方可執行,例如:單擊事件,定時執行 ③ 解釋性 每

Java學習第二六天JSON基礎、jQuery基礎

一、JSON基礎 1、JSON的定義 ① JSON(Java Script Object Notation)是一種輕量級的資料交換語言,以文字字串為基礎,且易於讓人閱讀 注意:XML就是一個重量級的資料交換語言 ② JSON採用完全獨立於任何程式語言的文字格式,

Java學習第二九天POI操作Excel

一、POI操作Excel 1、Excel簡介 一個excel檔案就是一個工作簿workbook,一個工作簿中可以建立多張工作表sheet,而一個工作表中包含多個單元格Cell,這些單元格都是由列(Column)行(Row)組成,列用大寫英文字母表示,從A開始到Z共26列,然後再從AA

MySQL快速入門—Java學習五天

文件版本 開發工具 測試平臺 工程名字 日期 作者 備註 V1.0 2016.05.09 lutianfei none

區塊鏈技術-深入詳解以太坊智慧合約語言 solidity含原始碼-熊麗兵-專題視訊課程...

區塊鏈技術進階-深入詳解以太坊智慧合約語言 solidity(含原始碼)—103人已學習 課程介紹         區塊鏈開發技術進階-深入詳解以太坊智慧合約語言 solidity視訊培訓教程:本課

靜態頁面學習簡單爬蟲

聖誕節快樂(づ ̄ 3 ̄)づ~~~ 在這個半放假的日子裡,人也變得慵懶起來,在MOOC下學習了靜態頁面的簡單爬蟲(傳送門:http://www.imooc.com/learn/563),乾貨滿滿啊~~ 所以爬了一個羋月傳麼麼噠~~~ # coding=u

實訓專案——58同城出租資訊

本節課將利用前面學習的基礎知識,實現58同城出租資訊抓取。爬蟲整體流程58同城抓取流程進入成都小區頁面,確定抓取目標 觀察頁面,獲取各行政區的連結 分行政區抓取各小區的URL 進入各小區詳情頁面,抓取名字、價格、地址、年份等資訊 抓取小區二手房頁面第一頁的價格,在管道中求該小

Java學習第三Lucene

一、Lucene概念 1、回顧索引 ① 定義:索引是對資料庫表中一列或多列的值進行排序的一種結構 ② 目的:加快對資料庫表中記錄的查詢 ③ 特點:以空間換取時間,提高查詢速度快 2、什麼是Lucene Lucene是apache軟體基金會發布的一個開放原始碼的全文檢索引擎工具包,

Java學習第三四天WebService

一、WebService介紹 1、使用場景 ① 不同的移動客戶端訪問 ② 需要訪問第三方的專案 2、ISO的七層模型:物理層、資料鏈路層、網路層、傳輸層、表示層、會話層、應用層 3、基於Socket建立Web服務 ① Socket通訊的服務端,實現大小寫轉化 publ

Java學習第三二天SpringMVC

一、回顧struts2+Spring開發 1、需求:學生註冊【add.jsp > StudentAction.java > addOK.jsp】 ① Emp.java public class Emp { private String id;//編號 privat

Java學習第三一天EasyUI

一、省-市-區三級聯動【struts2 +非資料庫版】 public class Bean { private String province;//省份 private String city;//城市 public Bean(){} public String getPro

Python爬蟲入門+學習筆記 3-1 爬蟲工程師:HTTP請求分析

Chrome瀏覽器相對於其他的瀏覽器而言,DevTools(開發者工具)非常強大。這節課將為大家介紹怎麼利用Chrome瀏覽器的開發者工具進行HTTP請求分析Chrome瀏覽器講解Chrome 開發者工具是一套內置於Google Chrome中的Web開發和除錯工具,可用來對

python學習

分享 target for buffer yun lena hello pri true 同樣是《python基礎教程(第二版)》的內容,只是後面內容學起來,相比前面會比較有趣,也更加實用,所以,將“基礎”改為“進階”。 python 電子書分享地址:http://yu