巧用ironpython做更靈活的網頁爬蟲 - 51cto.com
2011-02-23 09:48 胡浩 胡浩的部落格字型大小:t |
t如果有了ironpython,可以把抓取和分析的邏輯做成python指令碼,如果對方頁面結構變了,只需修改指令碼就行了,不需重新編譯軟體,這樣可以用c#做互動和介面部分,用python封裝預期經常變化的部分。 ad:
由於各種原因,我們經常需要去別的**採集一些資訊,.net下所有相關的技術都已經非常成熟,用webrequest抓取頁面,既支援自定義reference頭,又支援cookie,解析頁面一般都是用正則,而且對方**結構一變,還得重新改**,重新編譯,發布。
如果有了ironpython,可以把抓取和分析的邏輯做成python指令碼,如果對方頁面結構變了,只需修改指令碼就行了,不需重新編譯軟體,這樣可以用c#做互動和介面部分,用python封裝預期經常變化的部分。
copy $(projectdir)\*.py $(targetdir)copy $(projectdir)\*.dtd $(targetdir)
在baidu.py裡首先引用必要的.net程式集
import clr, sysclr.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
接下來定義抓取方法,呼叫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)
c#**要建立乙個指令碼執行環境,設定允許除錯,然後執行baidu.py,最後建立乙個baidu的類的例項,並用dynamic關鍵字引用這個例項
接下來呼叫baidu這個python類的方法獲取網頁抓取結果,然後輸出就可以了
MVC巧用列舉做許可權管理
使用者資料表,每個使用者有乙個或者多個許可權,使用者表如下 userid,roleid,username等 許可權列舉如下 public class customenum 為以下物件許可權物件賦值 使用者角色 public static customenum.userrole userrole el...
Java高併發程式設計 巧用Memcache做高併發鎖
2019年08月08日草稿 我們假設要做乙個拍賣系統,誰先下單,那麼就鎖定這個商品設定memcache裡的資料 等待支付。那麼一般流程是怎樣的呢?我們假設 商品id 1001 使用者a id 2001 使用者b id 2002商品a被使用者a鎖定的資料狀態為 key lock 1001 value ...
巧用幾大站長工具做seo
國內十大搜尋引擎中,佔據最大的流量,其餘的搜尋引擎雖偶有建樹,但是在大的流量方向上始終不如。從seo的角度來分析,為什麼會區別那麼大呢?下面筆者就當前的幾大站長工具做乙個簡要分析。國有目前的搜尋引擎有 谷歌 搜搜 搜狗 360搜尋 云云搜尋 中搜 即刻等,但是擁有獨立的站長工具的有站長工具 谷歌站長...