最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • Linux服务器端Python爬虫代理脚本设置

    正文概述    2020-07-23   274

    在linux端的网络爬虫有时需要利用代理,而且有些网站碰到一些IE才有的bug时候不得不换浏览,还要开虚拟机进去搞IE6、IE8、360、搜狗这些浏览器。建议搞个bat脚本来做这些。

    Linux服务器端Python爬虫代理脚本设置

    具体实现步骤如下:

    安装pywin32、WMI支持。具体下载地址Google一下,因为我的是32位python2.7系列,下载到的文件名分别为(pywin32-218.win32-py2.7.exe、WMI-1.4.7.win32.exe)

    首先,我们查资料知道,IE浏览器的代理内容在注册表中『HKEYCURRENTUSER\Software\Microsoft\Windows\CurrentVersion\Internet Settings』这里存着,所以我们理论上只要修改这里相关的键值就可以切换IE代理。

    所以,第一个函数就是修改注册表键值:

    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的的东西,所以在文件最开头需要做import win32api, win32con,引入相关的class

    修改系统注册表的函数其实就这么几行…当然,因为我厂必须通过代理服务器上网,所以修改系统注册表的键值类型我只用到了REG_SZ这一种,实际其他情况还会有REG_DWORD啊等等类型。

    然后咱需要一个配置文件,来保存各种场景『QA啊开发环境啊』的不同的配置信息,这时候我使用的配置文件为ini格式,用Python自带的ConfigParser就可以解析此种文件格式。

    没有采用以往我最熟悉的XML或者json纯粹为了装x,xml和json总觉着是web上用的东西,ini看起来比较像一个.exe比较常用的配置文件格式。

    也因为以前没用过ini格式的配置文件,这次权当又学会一种Python的玩法而已。

    所以读取ini配置文件的代码为:

    config = ConfigParser.ConfigParser()
     
    config.read('config.ini')
     
    if config.has_section(_section):
     
      _ProxyServer = config.get(_section, 'ProxyServer')
     
      _ProxyOverride = config.get(_section, 'ProxyOverride')

    同样,因为用到了ConfigParser,需要在文件最开头也import ConfigParser一下。

    细心的小伙伴会注意到这段代码中有一个_section的变量实际是没有定义的,而这个变量俺给它的含义是前边所写的『场景』,比如_section=='dev'表示开发环境,_section=='qa'表示QA环境,而咱们这次既然做的是一个类似exe的程序,所以_section需要在执行exe时候当作参数传进来。

    这时候咱们就要用到Python的sys模块了,同样import sys,然后在程序中通过:

    _section = sys.argv[1] if len(sys.argv) > 1 else 'dev'

    这样的方式来获取『场景』这个参数,这一段代码就会变成:

    _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')

    既然已经读取到配置文件中的ProxyServer和ProxyOverride,写入到注册表理论上就能完成咱们的修改IE代理配置的大业了:

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

    因为注册表内容虽然已经修改了,但实际上IE浏览器并没有生效,让IE浏览器生效需要关闭重新打开。

    这时候就用到前边安装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)

    当然,这段代码是有一点点问题的,只关闭了IE没有重新打开

    综上所述:

    完整的代码为:

    #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()
     
        #开发环境
     
        cfg.add_section('dev')
     
        cfg.set('dev', 'ProxyServer', '192.168.0.6:3128')
     
        cfg.set('dev', 'ProxyOverride', 'localhost;127.0.0.1')
     
        #预上线
     
        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'

    起源地下载网 » Linux服务器端Python爬虫代理脚本设置

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元