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

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

開發 后端
如果有了IronPython,可以把抓取和分析的邏輯做成Python腳本,如果對方頁面結構變了,只需修改腳本就行了,不需重新編譯軟件,這樣可以用c#做交互和界面部分,用Python封裝預期經常變化的部分。

由于各種原因,我們經常需要去別的網站采集一些信息,.net下所有相關的技術都已經非常成熟,用Webrequest抓取頁面,既支持自定義Reference頭,又支持cookie,解析頁面一般都是用正則,而且對方網站結構一變,還得重新改代碼,重新編譯,發布。

如果有了IronPython,可以把抓取和分析的邏輯做成Python腳本,如果對方頁面結構變了,只需修改腳本就行了,不需重新編譯軟件,這樣可以用c#做交互和界面部分,用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" 
  4.     sgmlReader.WhitespaceHandling = WhitespaceHandling.All  
  5.     sgmlReader.CaseFolding = CaseFolding.ToLower  
  6.     sgmlReader.InputStream = textReader  
  7.       
  8.     doc = XmlDocument()  
  9.     doc.PreserveWhitespace = True 
  10.     doc.XmlResolver = None 
  11.     doc.Load(sgmlReader)  
  12.     return doc 

利用webrequest寫一個支持cookie和網頁編碼的抓網頁方法

  1. def getWebData
  2. (url, method, data = None, cookie = None, encoding = "UTF-8"):  
  3.     req = WebRequest.Create(url)  
  4.     req.Method = method  
  5.       
  6.     if cookie != None:  
  7.         req.CookieContainer = cookie  
  8.       
  9.     if data != None:  
  10.         stream = req.GetRequestStream()  
  11.         stream.Write(data, 0, data.Length)  
  12.           
  13.     rsp = req.GetResponse()  
  14.     reader = StreamReader
  15. (rsp.GetResponseStream(), UTF8.GetEncoding(encoding))  
  16.     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
  3. (url, "GET"Noneself.cc, self.encoding)  
  4.         doc = fromHtml(reader)  
  5.           
  6.         trs = doc.SelectNodes
  7. ("html//table[@id='thread_list_table']/tbody/tr")  
  8.         self.parsePosts(trs)  
  9.       
  10.     def parsePosts(self, trs):  
  11.         for tr in trs:              
  12.             tds = tr.SelectNodes("td")  
  13.             hit = tds[0].InnerText  
  14.             comments = tds[1].InnerText  
  15.             title = tds[2].ChildNodes[1].InnerText  
  16.             link = tds[2].ChildNodes[1].Attributes["href"]  
  17.             author = tds[3].InnerText  
  18.               
  19.             post = Post(hit, comments, title, link, author)  
  20.             self.posts.append(post) 

c#代碼要創建一個腳本運行環境,設置允許調試,然后執行baidu.py,***創建一個Baidu的類的實例,并用dynamic關鍵字引用這個實例

  1. Dictionary options = new Dictionary();  
  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}   
  6. (回復數:{1})(點擊數:{2})[作者:{3}]",  
  7.                     post.title,  
  8.                     post.comments,  
  9.                     post.hit,  
  10.                     post.author);  
  11.             } 

原文鏈接:http://www.cnblogs.com/onlytiancai/archive/2011/02/22/1960859.html

【編輯推薦】

  1. Python 3.2發布 改進調試器PDB
  2. 淺談Python Web的五大框架
  3. 一個Python程序員的進化
  4. 年度黑馬Python 自省指南
  5. 學習python處理python編碼
責任編輯:陳貽新 來源: 胡浩的博客
相關推薦

2011-02-22 10:00:38

.NETc#IronPython

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

網絡

2017-07-18 06:08:41

2023-11-27 08:21:49

Camera2API,

2015-05-04 14:12:43

2017-02-14 15:37:32

KappaLambda

2024-11-21 15:48:40

2025-02-18 00:10:00

2015-10-10 10:01:39

VMware數據中心

2023-12-05 10:25:24

Python類型注解

2020-10-28 15:17:08

Go服務超時net

2009-08-04 15:55:56

OracleEPMBI

2009-10-15 09:32:39

什么是IronPythPython.NET

2017-08-09 15:27:33

python爬蟲開發工具

2025-05-08 08:10:00

Python函數調用代碼

2021-06-14 07:39:13

比特幣區塊鏈加密貨幣
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 精品一区久久 | 日韩亚洲一区二区 | 国产精品亚洲综合 | 国产一区91精品张津瑜 | 国产精品1| 欧美一区二区免费视频 | 精品一级 | 国产精品美女久久久久久不卡 | 精品久久久久久亚洲综合网 | 一区二区精品 | 久久一区二区三区四区五区 | 97人人澡人人爽91综合色 | 国产精品乱码一区二三区小蝌蚪 | 精品一级电影 | 中文字幕在线一区 | av毛片| 国产精品久久久久久久久污网站 | 日韩电影一区二区三区 | 亚洲欧美精品在线观看 | 国产亚洲欧美在线 | 亚洲中午字幕 | 日韩伦理电影免费在线观看 | 久国产精品 | 国产亚洲一区在线 | 国产一级特黄aaa大片评分 | 日韩中文字幕2019 | 中文字幕日韩欧美一区二区三区 | 精品国产色| 国产一区二区三区在线看 | 黄色成人免费在线观看 | 欧美一级久久 | 天天综合干 | 精品入口麻豆88视频 | 成人精品一区二区三区四区 | 亚洲欧美激情国产综合久久久 | 久久丁香| 亚洲视频欧美视频 | 91文字幕巨乱亚洲香蕉 | 精品一区二区久久久久久久网站 | av在线成人| 九九久久在线看 |