日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
巧用IronPython做更靈活的網(wǎng)頁爬蟲

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

目前成都創(chuàng)新互聯(lián)已為上千的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)站空間、網(wǎng)站托管、服務(wù)器租用、企業(yè)網(wǎng)站設(shè)計(jì)、正藍(lán)網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。

如果有了IronPython,可以把抓取和分析的邏輯做成Python腳本,如果對方頁面結(jié)構(gòu)變了,只需修改腳本就行了,不需重新編譯軟件,這樣可以用c#做交互和界面部分,用Python封裝預(yù)期經(jīng)常變化的部分。

安裝好IronPython和vs.net 2010后,還需要下載一個(gè)SGMLReader(見參考鏈接),這個(gè)組件可以把格式不是很嚴(yán)格的HTML轉(zhuǎn)換成格式良好的XML文件,甚至還能增加DTD的驗(yàn)證

我們以抓取百度貼吧頁面為例,新建一個(gè)Console項(xiàng)目,引用IronPython,Microsoft.Dynamic,Microsoft.Scripting,SgmlReaderDll這些組件,把SGMLReader里的Html.dtd復(fù)制到項(xiàng)目目錄下,如果沒有這個(gè),它會根據(jù)doctype去網(wǎng)絡(luò)上找dtd,然后新建baidu.py的文件,***在項(xiàng)目屬性的生成事件里寫上如下代碼,把這兩個(gè)文件拷貝到目標(biāo)目錄里

 
 
 
  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") 

完了導(dǎo)入我們需要的類

 
 
 
  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寫一個(gè)把html轉(zhuǎn)換成xml的函數(shù),注意SystemLiteral屬性必須設(shè)置,否則就會去網(wǎng)上找dtd了,浪費(fèi)時(shí)間

 
 
 
  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寫一個(gè)支持cookie和網(wǎng)頁編碼的抓網(wǎng)頁方法

 
 
 
  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 

寫一個(gè)類來定義抓取結(jié)果,這個(gè)類不需要在c#項(xiàng)目里定義,到時(shí)候直接用c# 4.0的dynamic關(guān)鍵字就可以使用

 
 
 
  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__大概相當(dāng)于構(gòu)造函數(shù),我們傳入編碼參數(shù),并初始化cookie容器和解析結(jié)果,[]是python里的列表,大約相當(dāng)于c#的List

 
 
 
  1. class BaiDu:  
  2.     def __init__(self,encoding):  
  3.         self.cc = self.cc = CookieContainer()          
  4.         self.encoding = encoding  
  5.         self.posts = [] 

接下來定義抓取方法,調(diào)用getWebData抓網(wǎng)頁,然后用fromHtml轉(zhuǎn)換成xml,剩下的就是xml操作,和.net里一樣,一看便知

 
 
 
  1. def getPosts(self, url):  
  2.         reader = getWebData
  3. (url, "GET", None, self.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#代碼要創(chuàng)建一個(gè)腳本運(yùn)行環(huán)境,設(shè)置允許調(diào)試,然后執(zhí)行baidu.py,***創(chuàng)建一個(gè)Baidu的類的實(shí)例,并用dynamic關(guān)鍵字引用這個(gè)實(shí)例

 
 
 
  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"); 

接下來調(diào)用BaiDu這個(gè)python類的方法獲取網(wǎng)頁抓取結(jié)果,然后輸出就可以了

 
 
 
  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. (回復(fù)數(shù):{1})(點(diǎn)擊數(shù):{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


網(wǎng)站名稱:巧用IronPython做更靈活的網(wǎng)頁爬蟲
網(wǎng)頁網(wǎng)址:http://www.5511xx.com/article/cdieode.html