您好,登錄后才能下訂單哦!
本篇內容介紹了“怎么用IronPython做網頁爬蟲”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
由于各種原因,我們經常需要去別的網站采集一些信息,.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的文件,***在項目屬性的生成事件里寫上如下代碼,把這兩個文件拷貝到目標目錄里
copy $(ProjectDir)\*.py $(TargetDir) copy $(ProjectDir)\*.dtd $(TargetDir)
在baidu.py里首先引用必要的.net程序集
import clr, sys clr.AddReference("SgmlReaderDll") clr.AddReference("System.Xml")
完了導入我們需要的類
from Sgml import * from System.Net import * from System.IO import TextReader,StreamReader from System.Xml import * from System.Text.UnicodeEncoding import UTF8
利用SgmlReader寫一個把html轉換成xml的函數,注意SystemLiteral屬性必須設置,否則就會去網上找dtd了,浪費時間
def fromHtml(textReader): sgmlReader = SgmlReader() sgmlReader.SystemLiteral = "html.dtd" sgmlReader.WhitespaceHandling = WhitespaceHandling.All sgmlReader.CaseFolding = CaseFolding.ToLower sgmlReader.InputStream = textReader doc = XmlDocument() doc.PreserveWhitespace = True doc.XmlResolver = None doc.Load(sgmlReader) return doc
利用webrequest寫一個支持cookie和網頁編碼的抓網頁方法
def getWebData(url, method, data = None, cookie = None, encoding = "UTF-8"): req = WebRequest.Create(url) req.Method = method if cookie != None: req.CookieContainer = cookie if data != None: stream = req.GetRequestStream() stream.Write(data, 0, data.Length) rsp = req.GetResponse() reader = StreamReader(rsp.GetResponseStream(), UTF8.GetEncoding(encoding)) return reader
寫一個類來定義抓取結果,這個類不需要在c#項目里定義,到時候直接用c# 4.0的dynamic關鍵字就可以使用
class Post: def __init__(self, hit, comments, title, link, author): self.hit = hit self.comments = comments self.title = title self.link = link self.author = author
定義主要工作的類,__init__大概相當于構造函數,我們傳入編碼參數,并初始化cookie容器和解析結果,[]是python里的列表,大約相當于c#的List
class BaiDu: def __init__(self,encoding): self.cc = self.cc = CookieContainer() self.encoding = encoding self.posts = []
接下來定義抓取方法,調用getWebData抓網頁,然后用fromHtml轉換成xml,剩下的就是xml操作,和.net里一樣,一看便知
def getPosts(self, url): reader = getWebData(url, "GET", None, self.cc, self.encoding) doc = fromHtml(reader) trs = doc.SelectNodes("html//table[@id='thread_list_table']/tbody/tr") self.parsePosts(trs) def parsePosts(self, trs): for tr in trs: tds = tr.SelectNodes("td") hit = tds[0].InnerText comments = tds[1].InnerText title = tds[2].ChildNodes[1].InnerText link = tds[2].ChildNodes[1].Attributes["href"] author = tds[3].InnerText post = Post(hit, comments, title, link, author) self.posts.append(post)
c#代碼要創建一個腳本運行環境,設置允許調試,然后執行baidu.py,***創建一個Baidu的類的實例,并用dynamic關鍵字引用這個實例
Dictionary options = new Dictionary(); options["Debug"] = true; ScriptEngine engine = Python.CreateEngine(options); ScriptScope scope = engine.ExecuteFile("baidu.py"); dynamic baidu = engine.Operations.Invoke(scope.GetVariable("BaiDu"), "GBK");
接下來調用BaiDu這個python類的方法獲取網頁抓取結果,然后輸出就可以了
baidu.getPosts("http://tieba.baidu.com/f?kw=seo"); dynamic posts = baidu.posts; foreach (dynamic post in posts) { Console.WriteLine("{0} (回復數:{1})(點擊數:{2})[作者:{3}]", post.title, post.comments, post.hit, post.author); }
“怎么用IronPython做網頁爬蟲”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。