- 首頁(yè)|
- 網(wǎng)校|
- 焚題庫(kù)|
- APP |
-
微信公眾號(hào)
在linux端的網(wǎng)絡(luò)爬蟲(chóng)有時(shí)需要利用代理,而且有些網(wǎng)站碰到一些IE才有的bug時(shí)候不得不換瀏覽,還要開(kāi)虛擬機(jī)進(jìn)去搞IE6、IE8、360、搜狗這些瀏覽器。建議搞個(gè)bat腳本來(lái)做這些。
具體實(shí)現(xiàn)步驟如下:
安裝pywin32、WMI支持。具體下載地址Google一下,因?yàn)槲业氖?2位python2.7系列,下載到的文件名分別為(pywin32-218.win32-py2.7.exe、WMI-1.4.7.win32.exe)
首先,我們查資料知道,IE瀏覽器的代理內(nèi)容在注冊(cè)表中『HKEYCURRENTUSER\Software\Microsoft\Windows\CurrentVersion\Internet Settings』這里存著,所以我們理論上只要修改這里相關(guān)的鍵值就可以切換IE代理。
所以,第一個(gè)函數(shù)就是修改注冊(cè)表鍵值:
def changeIEProxy(keyName, keyValue):
pathInReg = 'Software\Microsoft\Windows\CurrentVersion\Internet Settings'
key = win32api.RegOpenKey(win32con.HKEY_CURRENT_USER,pathInReg, 0, win32con.KEY_ALL_ACCESS)
win32api.RegSetValueEx(key, keyName, 0, win32con.REG_SZ, keyValue)
win32api.RegCloseKey(key)
因此段代碼中用到了pywin32的的東西,所以在文件最開(kāi)頭需要做import win32api, win32con,引入相關(guān)的class
修改系統(tǒng)注冊(cè)表的函數(shù)其實(shí)就這么幾行…當(dāng)然,因?yàn)槲覐S必須通過(guò)代理服務(wù)器上網(wǎng),所以修改系統(tǒng)注冊(cè)表的鍵值類(lèi)型我只用到了REG_SZ這一種,實(shí)際其他情況還會(huì)有REG_DWORD啊等等類(lèi)型。
然后咱需要一個(gè)配置文件,來(lái)保存各種場(chǎng)景『QA啊開(kāi)發(fā)環(huán)境啊』的不同的配置信息,這時(shí)候我使用的配置文件為ini格式,用Python自帶的ConfigParser就可以解析此種文件格式。
沒(méi)有采用以往我最熟悉的XML或者json純粹為了裝x,xml和json總覺(jué)著是web上用的東西,ini看起來(lái)比較像一個(gè).exe比較常用的配置文件格式。
也因?yàn)橐郧皼](méi)用過(guò)ini格式的配置文件,這次權(quán)當(dāng)又學(xué)會(huì)一種Python的玩法而已。
所以讀取ini配置文件的代碼為:
config = ConfigParser.ConfigParser()
config.read('config.ini')
if config.has_section(_section):
_ProxyServer = config.get(_section, 'ProxyServer')
_ProxyOverride = config.get(_section, 'ProxyOverride')
同樣,因?yàn)橛玫搅薈onfigParser,需要在文件最開(kāi)頭也import ConfigParser一下。
細(xì)心的小伙伴會(huì)注意到這段代碼中有一個(gè)_section的變量實(shí)際是沒(méi)有定義的,而這個(gè)變量俺給它的含義是前邊所寫(xiě)的『場(chǎng)景』,比如_section=='dev'表示開(kāi)發(fā)環(huán)境,_section=='qa'表示QA環(huán)境,而咱們這次既然做的是一個(gè)類(lèi)似exe的程序,所以_section需要在執(zhí)行exe時(shí)候當(dāng)作參數(shù)傳進(jìn)來(lái)。
這時(shí)候咱們就要用到Python的sys模塊了,同樣import sys,然后在程序中通過(guò):
_section = sys.argv[1] if len(sys.argv) > 1 else 'dev'
這樣的方式來(lái)獲取『場(chǎng)景』這個(gè)參數(shù),這一段代碼就會(huì)變成:
_section = sys.argv[1] if len(sys.argv) > 1 else 'dev'
config = ConfigParser.ConfigParser()
config.read('config.ini')
if config.has_section(_section):
_ProxyServer = config.get(_section, 'ProxyServer')
_ProxyOverride = config.get(_section, 'ProxyOverride')
既然已經(jīng)讀取到配置文件中的ProxyServer和ProxyOverride,寫(xiě)入到注冊(cè)表理論上就能完成咱們的修改IE代理配置的大業(yè)了:
_section = sys.argv[1] if len(sys.argv) > 1 else 'dev'
config = ConfigParser.ConfigParser()
config.read('config.ini')
if config.has_section(_section):
_ProxyServer = config.get(_section, 'ProxyServer')
_ProxyOverride = config.get(_section, 'ProxyOverride')
changeIEProxy('ProxyServer', _ProxyServer)
changeIEProxy('ProxyOverride', _ProxyOverride)
因?yàn)樽?cè)表內(nèi)容雖然已經(jīng)修改了,但實(shí)際上IE瀏覽器并沒(méi)有生效,讓IE瀏覽器生效需要關(guān)閉重新打開(kāi)。
這時(shí)候就用到前邊安裝WMI,import wmi ctypes,然后:
def kill_ie():
c = wmi.WMI()
kernel32 = ctypes.windll.kernel32
for process in c.Win32_Process():
if process.Name=='iexplore.exe':
kernel32.TerminateProcess(kernel32.OpenProcess(1, 0, process.ProcessId), 0)
當(dāng)然,這段代碼是有一點(diǎn)點(diǎn)問(wèn)題的,只關(guān)閉了IE沒(méi)有重新打開(kāi)
綜上所述:
完整的代碼為:
#coding=utf-8
import win32api, win32con, sys, ConfigParser, os, wmi, ctypes
def kill_ie():
c = wmi.WMI()
kernel32 = ctypes.windll.kernel32
for process in c.Win32_Process():
if process.Name=='iexplore.exe':
kernel32.TerminateProcess(kernel32.OpenProcess(1, 0, process.ProcessId), 0)
def changeIEProxy(keyName, keyValue):
pathInReg = 'Software\Microsoft\Windows\CurrentVersion\Internet Settings'
key = win32api.RegOpenKey(win32con.HKEY_CURRENT_USER,pathInReg, 0, win32con.KEY_ALL_ACCESS)
win32api.RegSetValueEx(key, keyName, 0, win32con.REG_SZ, keyValue)
win32api.RegCloseKey(key)
def check_config():
if not os.path.isfile('config.ini'):
cfg = ConfigParser.ConfigParser()
#開(kāi)發(fā)環(huán)境
cfg.add_section('dev')
cfg.set('dev', 'ProxyServer', '192.168.0.6:3128')
cfg.set('dev', 'ProxyOverride', 'localhost;127.0.0.1')
#預(yù)上線
cfg.add_section('prepare')
cfg.set('prepare', 'ProxyServer', '192.168.0.6:3128')
cfg.set('prepare', 'ProxyOverride', 'localhost;127.0.0.1;')
#線上
cfg.add_section('online')
cfg.set('online', 'ProxyServer', '192.168.0.6:3128')
cfg.set('online', 'ProxyOverride', 'localhost;127.0.0.1')
#QA
cfg.add_section('qa')
cfg.set('qa', 'ProxyServer', '192.168.2.16:3128')
cfg.set('qa', 'ProxyOverride', 'localhost;127.0.0.1')
cfg.write(open('config.ini', 'a'))
return False
return True
if __name__ == "__main__":
_section = sys.argv[1] if len(sys.argv) > 1 else 'dev'
if check_config():
kill_ie()
config = ConfigParser.ConfigParser()
config.read('config.ini')
if config.has_section(_section):
_ProxyServer = config.get(_section, 'ProxyServer')
_ProxyOverride = config.get(_section, 'ProxyOverride')
changeIEProxy('ProxyServer', _ProxyServer)
changeIEProxy('ProxyOverride', _ProxyOverride)
print 'done, open ie'
else:
print 'config.ini is created, modify config.ini and try again'
初級(jí)會(huì)計(jì)職稱中級(jí)會(huì)計(jì)職稱經(jīng)濟(jì)師注冊(cè)會(huì)計(jì)師證券從業(yè)銀行從業(yè)會(huì)計(jì)實(shí)操統(tǒng)計(jì)師審計(jì)師高級(jí)會(huì)計(jì)師基金從業(yè)資格稅務(wù)師資產(chǎn)評(píng)估師國(guó)際內(nèi)審師ACCA/CAT價(jià)格鑒證師統(tǒng)計(jì)資格從業(yè)
一級(jí)建造師二級(jí)建造師消防工程師造價(jià)工程師土建職稱房地產(chǎn)經(jīng)紀(jì)人公路檢測(cè)工程師建筑八大員注冊(cè)建筑師二級(jí)造價(jià)師監(jiān)理工程師咨詢工程師房地產(chǎn)估價(jià)師 城鄉(xiāng)規(guī)劃師結(jié)構(gòu)工程師巖土工程師安全工程師設(shè)備監(jiān)理師環(huán)境影響評(píng)價(jià)土地登記代理公路造價(jià)師公路監(jiān)理師化工工程師暖通工程師給排水工程師計(jì)量工程師
人力資源考試教師資格考試出版專(zhuān)業(yè)資格健康管理師導(dǎo)游考試社會(huì)工作者司法考試職稱計(jì)算機(jī)營(yíng)養(yǎng)師心理咨詢師育嬰師事業(yè)單位教師招聘公務(wù)員公選考試招警考試選調(diào)生村官
執(zhí)業(yè)藥師執(zhí)業(yè)醫(yī)師衛(wèi)生資格考試衛(wèi)生高級(jí)職稱護(hù)士資格證初級(jí)護(hù)師主管護(hù)師住院醫(yī)師臨床執(zhí)業(yè)醫(yī)師臨床助理醫(yī)師中醫(yī)執(zhí)業(yè)醫(yī)師中醫(yī)助理醫(yī)師中西醫(yī)醫(yī)師中西醫(yī)助理口腔執(zhí)業(yè)醫(yī)師口腔助理醫(yī)師公共衛(wèi)生醫(yī)師公衛(wèi)助理醫(yī)師實(shí)踐技能內(nèi)科主治醫(yī)師外科主治醫(yī)師中醫(yī)內(nèi)科主治兒科主治醫(yī)師婦產(chǎn)科醫(yī)師西藥士/師中藥士/師臨床檢驗(yàn)技師臨床醫(yī)學(xué)理論中醫(yī)理論