成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

利用IronPython做更靈活的網頁爬蟲

開發 后端
對于哪些經常要在網站上采集信息的人來說,有一個靈活的網頁爬蟲是非常必要的,本篇文章將介紹如何用IronPython在.NET中做一個更靈活的網頁爬蟲。

  我們經常需要去別的網站采集一些信息,.NET下所有相關的技術都已經非常成熟,用Webrequest抓取頁面,雖然支持自定義Reference頭,又支持cookie,解析頁面一般都是用正則,但是對方網站結構一變,還得重新改代碼,重新編譯,發布。有了IronPython,可以把抓取和分析的邏輯做成Python腳本,如果對方頁面結構變了,只需修改腳本就行了,不需重新編譯軟件,這樣可以用c#做交互和界面部分,用Python封裝預期經常變化的部分。

如何利用IronPython把抓取和分析的邏輯做成Python腳本
  安裝好IronPython和vs.net 2010后,還需要下載一個SGMLReader(見參考鏈接),這個組件可以把格式不是很嚴格的HTML轉換成格式良好的XML文件,甚至還能增加DTD的驗證  
  我們以抓取百度貼吧頁面為例,新建一個Console項目,引用IronPython,Microsoft.Dynamic,Microsoft.Scripting,SgmlReaderDll這些組件,把SGMLReader里的Html.dtd復制到項目目錄下,如果沒有這個,它會根據doctype去網絡上找dtd,然后新建baidu.py的文件,最后在項目屬性的生成事件里寫上如下代碼,把這兩個文件拷貝到目標目錄里。

  1. copy $(ProjectDir)\*.py $(TargetDir)  
  2. copy $(ProjectDir)\*.dtd $(TargetDir) 

  在baidu.py里首先引用必要的.net程序集。
  1. import clr, sys  
  2. clr.AddReference("SgmlReaderDll")  
  3. clr.AddReference("System.Xml")  

  完了導入我們需要的類
  1. from Sgml import *  
  2. from System.Net import *  
  3. from System.IO import TextReader,StreamReader  
  4. from System.Xml import *  
  5. from System.Text.UnicodeEncoding import UTF8  

  利用SgmlReader寫一個把html轉換成xml的函數,注意SystemLiteral屬性必須設置,否則就會去網上找dtd了,浪費時間
  1. def fromHtml(textReader):      
  2. sgmlReader = SgmlReader()      
  3. sgmlReader.SystemLiteral = "html.dtd"    sgmlReader.WhitespaceHandling =WhitespaceHandling.All      
  4. sgmlReader.CaseFolding = CaseFolding.ToLower    sgmlReader.InputStream = textReader          
  5.  
  6.  
  7. doc = XmlDocument()      
  8. doc.PreserveWhitespace = True      
  9. doc.XmlResolver = None      
  10. doc.Load(sgmlReader)      
  11. eturn doc  

  利用webrequest寫一個支持cookie和網頁編碼的抓網頁方法
  1. def getWebData(url, method, data = None, cookie = None, encoding = "UTF-8"):      
  2.    req = WebRequest.Create(url)      
  3.    req.Method = method          
  4.    if cookie != None:          
  5.       req.CookieContainer = cookie          
  6.    if data != None:          
  7.       stream = req.GetRequestStream()          
  8.       stream.Write(data, 0, data.Length)              
  9.    rsp = req.GetResponse()      
  10.    reader = StreamReader(rsp.GetResponseStre(),            
  11.    UTF8.GetEncoding(encoding))            
  12.    return reader  

  寫一個類來定義抓取結果,這個類不需要在c#項目里定義,到時候直接用c# 4.0的dynamic關鍵字就可以使用
  1. class Post:  
  2.     def __init__(self, hit, comments, title, link, author):  
  3.         self.hit = hit  
  4.         self.comments = comments   
  5.         self.title = title  
  6.         self.link = link  
  7.         self.author = author  

  定義主要工作的類,__init__大概相當于構造函數,我們傳入編碼參數,并初始化cookie容器和解析結果,[]是python里的列表,大約相當于c#的List
  1. class BaiDu:  
  2.     def __init__(self,encoding):  
  3.         self.cc = self.cc = CookieContainer()  
  4.              self.encoding = encoding 
  5.             self.posts = []     

  接下來定義抓取方法,調用getWebData抓網頁,然后用fromHtml轉換成xml,剩下的就是xml操作,和.net里一樣,一看便知
  1. def getPosts(self, url):  
  2.         reader = getWebData(url, "GET", None, self.cc, self.encoding)  
  3.         doc = fromHtml(reader)  
  4.         trs = doc.SelectNodes("html//table[@id='thread_list_table']/tbody/tr")       
  5.         self.parsePosts(trs)  
  6.  
  7. def parsePosts(self, trs):  
  8.         for tr in trs:  
  9.             tds = tr.SelectNodes("td")  
  10.             hit = tds[0].InnerText  
  11.             comments = tds[1].InnerText  
  12.             title = tds[2].ChildNodes[1].InnerText  
  13.             link = tds[2].ChildNodes[1].Attributes["href"]   
  14.             author = tds[3].InnerText  
  15.  
  16.             post = Post(hit, comments, title, link, author)  
  17.             self.posts.append(post)  

  c#代碼要創建一個腳本運行環境,設置允許調試,然后執行baidu.py,最后創建一個Baidu的類的實例,并用dynamic關鍵字引用這個實例
  1. Dictionary<stringobject> options = new Dictionary<stringobject>();      
  2.   options["Debug"] = true;            
  3.   ScriptEngine engine = Python.CreateEngine(options);            
  4.   ScriptScope scope = engine.ExecuteFile("baidu.py");            
  5.   dynamic baidu = engine.Operations.Invoke(scope.GetVariable("BaiDu"), "GBK");  

  接下來調用BaiDu這個python類的方法獲取網頁抓取結果,然后輸出就可以了
  1. baidu.getPosts("http://tieba.baidu.com/f?kw=seo");             
  2.    dynamic posts = baidu.posts;          
  3.    foreach (dynamic post in posts)            
  4.  {                   
  5.      Console.WriteLine("{0} (回復數:{1})(點擊數:{2})[作者:{3}]",                      
  6.      post.title,                  
  7.  post.comments,                     
  8.   post.hit,                   
  9.  post.author);           
  10.  }  
參考鏈接:

 【編輯推薦】

  1. 高性能ASP.NET站點構建之細節決定成敗
  2. Mono 2010 跨平臺的.NET運行環境發布了
  3. ASP.NET MVC 3 新特性全解析
  4. 手把手教你實現.NET程序打包
責任編輯:佚名 來源: 博客園
相關推薦

2011-02-23 09:48:00

Python.NET

2009-05-18 09:12:00

ASON自動交換光網絡

2023-06-06 19:24:06

KubernetesSpark

2009-06-03 09:08:20

ScalaJava類型

2020-09-14 09:33:02

網絡

2015-05-04 14:12:43

2017-07-18 06:08:41

2023-11-27 08:21:49

Camera2API,

2017-02-14 15:37:32

KappaLambda

2025-02-18 00:10:00

2015-10-10 10:01:39

VMware數據中心

2023-12-05 10:25:24

Python類型注解

2024-11-21 15:48:40

2020-10-28 15:17:08

Go服務超時net

2009-08-04 15:55:56

OracleEPMBI

2025-05-08 08:10:00

Python函數調用代碼

2017-08-09 15:27:33

python爬蟲開發工具

2009-10-15 09:32:39

什么是IronPythPython.NET

2020-11-11 10:58:59

Scrapy
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 高清视频一区二区三区 | 久久av一区 | av在线播放网站 | av一二三区| 久久最新| 欧美在线色视频 | 精品国产区 | 亚洲美女网站 | 国产日韩一区二区三区 | 国产午夜精品久久久久免费视高清 | 美女视频一区二区三区 | 丝袜美腿一区二区三区动态图 | 亚洲国产欧美一区 | www.日韩系列| 天天干干| 精品成人免费一区二区在线播放 | 狠狠色综合网站久久久久久久 | 99pao成人国产永久免费视频 | 精品久久久久国产免费第一页 | 在线观看免费av片 | 久久精品青青大伊人av | 日韩精品无码一区二区三区 | 国产精品激情在线 | 久久久一二三区 | 91精品久久久久久久 | 黄色大片免费观看 | 久久久久国产精品一区二区 | 亚洲第一色av | 国产黄色网址在线观看 | 中文字幕在线免费视频 | 欧美性大战久久久久久久蜜臀 | 久久高清| 一区二区三区视频在线观看 | 久久成人免费视频 | 男人av网 | 久草.com | 国产精品一区二区三区久久久 | 国产一区视频在线 | 91亚洲国产成人久久精品网站 | 日本黄色免费片 | 亚洲精品视频免费 |