华南俳烁实业有限公司

python

當(dāng)前位置:中華考試網(wǎng) >> python >> python爬蟲(chóng) >> 文章內(nèi)容

Linux服務(wù)器端python爬蟲(chóng)代理腳本

來(lái)源:中華考試網(wǎng)  [2020年10月15日]  【

  在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代理。

python課程免費(fèi)試聽(tīng)預(yù)約

  • 地區(qū):
  • 姓名:
  • 手機(jī):

  所以,第一個(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'

責(zé)編:hym
  • 會(huì)計(jì)考試
  • 建筑工程
  • 職業(yè)資格
  • 醫(yī)藥考試
  • 外語(yǔ)考試
  • 學(xué)歷考試
额敏县| 清涧县| 余庆县| 图木舒克市| 梅州市| 兴业县| 大田县| 武宁县| 治县。| 杭州市| 出国| 陕西省| 胶南市| 正宁县| 鹰潭市| 罗平县| 滦南县| 离岛区| 海安县| 青铜峡市| 巴林右旗| 理塘县| 棋牌| 随州市| 宜良县| 肥乡县| 大港区| 高尔夫| 报价| 新宁县| 蓬溪县| 古浪县| 新宾| 谷城县| 喀喇沁旗| 青海省| 喜德县| 武穴市| 固安县| 大悟县| 黄平县|