华南俳烁实业有限公司

python

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

Python3爬蟲(chóng):代理的設(shè)置

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

  在前面我們介紹了多種請(qǐng)求庫(kù),如 Requests、Urllib、Selenium 等。我們接下來(lái)首先貼近實(shí)戰(zhàn),了解一下代理怎么使用,為后面了解代理池、ADSL 撥號(hào)代理的使用打下基礎(chǔ)。

  下面我們來(lái)梳理一下這些庫(kù)的代理的設(shè)置方法。

  1. 獲取代理

  在做測(cè)試之前,我們需要先獲取一個(gè)可用代理,搜索引擎搜索“代理”關(guān)鍵字,就可以看到有許多代理服務(wù)網(wǎng)站,在網(wǎng)站上會(huì)有很多免費(fèi)代理,比如西刺:http://www.xicidaili.com/,這里列出了很多免費(fèi)代理,但是這些免費(fèi)代理大多數(shù)情況下都是不好用的,所以比較靠譜的方法是購(gòu)買付費(fèi)代理,很多網(wǎng)站都有售賣,數(shù)量不用多,買一個(gè)穩(wěn)定可用的即可,可以自行選購(gòu)。

  或者如果我們本機(jī)有相關(guān)代理軟件的話,軟件一般會(huì)在本機(jī)創(chuàng)建 HTTP 或 SOCKS 代理服務(wù),直接使用此代理也可以。

  在這里我的本機(jī)安裝了一部代理軟件,它會(huì)在本地 9743 端口上創(chuàng)建 HTTP 代理服務(wù),也就是代理為 127.0.0.1:9743,另外還會(huì)在 9742 端口創(chuàng)建 SOCKS 代理服務(wù),也就是代理為 127.0.0.1:9742,我只要設(shè)置了這個(gè)代理就可以成功將本機(jī) IP 切換到代理軟件連接的服務(wù)器的 IP了。

  所以本節(jié)下面的示例里我使用上述代理來(lái)演示其設(shè)置方法,你可以自行替換成自己的可用代理,設(shè)置代理后測(cè)試的網(wǎng)址是:http://httpbin.org/get,訪問(wèn)該站點(diǎn)可以得到請(qǐng)求的一些相關(guān)信息,其中 origin 字段就是客戶端的 IP,我們可以根據(jù)它來(lái)判斷代理是否設(shè)置成功,也就是是否成功偽裝了IP。

  下面我們來(lái)看下各個(gè)庫(kù)的代理設(shè)置方式。

  2. Urllib

  首先我們以最基礎(chǔ)的 Urllib 為例,來(lái)看一下代理的設(shè)置方法,代碼如下:

  from urllib.error import URLError

  from urllib.request import ProxyHandler, build_opener

  proxy = '127.0.0.1:9743'

  proxy_handler = ProxyHandler({

  'http': 'http://' + proxy,

  'https': 'https://' + proxy

  })

  opener = build_opener(proxy_handler)

  try:

  response = opener.open('http://httpbin.org/get')

  print(response.read().decode('utf-8'))

  except URLError as e:

  print(e.reason)

  運(yùn)行結(jié)果如下:

  {

  "args": {},

  "headers": {

  "Accept-Encoding": "identity",

  "Connection": "close",

  "Host": "httpbin.org",

  "User-Agent": "Python-urllib/3.6"

  },

  "origin": "106.185.45.153",

  "url": "http://httpbin.org/get"

  }

  在這里我們需要借助于 ProxyHandler 設(shè)置代理,參數(shù)是字典類型,鍵名為協(xié)議類型,鍵值是代理,注意此處代理前面需要加上協(xié)議,即 http 或者 https,此處設(shè)置了 http 和 https 兩種代理,當(dāng)我們請(qǐng)求的鏈接是 http 協(xié)議的時(shí)候,它會(huì)調(diào)用 http 代理,當(dāng)請(qǐng)求的鏈接是 https 協(xié)議的時(shí)候,它會(huì)調(diào)用https代理,所以此處生效的代理是:http://127.0.0.1:9743。

  創(chuàng)建完 ProxyHandler 對(duì)象之后,我們需要利用 build_opener() 方法傳入該對(duì)象來(lái)創(chuàng)建一個(gè) Opener,這樣就相當(dāng)于此 Opener 已經(jīng)設(shè)置好代理了,接下來(lái)直接調(diào)用它的 open() 方法即可使用此代理訪問(wèn)我們所想要的鏈接。

  運(yùn)行輸出結(jié)果是一個(gè) Json,它有一個(gè)字段 origin,標(biāo)明了客戶端的 IP,此處的 IP 驗(yàn)證一下,確實(shí)為代理的 IP,而并不是我們真實(shí)的 IP,所以這樣我們就成功設(shè)置好代理,并可以隱藏真實(shí) IP 了。

  如果遇到需要認(rèn)證的代理,我們可以用如下的方法設(shè)置:

  from urllib.error import URLError

  from urllib.request import ProxyHandler, build_opener

  proxy = 'username:password@127.0.0.1:9743'

  proxy_handler = ProxyHandler({

  'http': 'http://' + proxy,

  'https': 'https://' + proxy

  })

  opener = build_opener(proxy_handler)

  try:

  response = opener.open('http://httpbin.org/get')

  print(response.read().decode('utf-8'))

  except URLError as e:

  print(e.reason)

  這里改變的只是 proxy 變量,只需要在代理前面加入代理認(rèn)證的用戶名密碼即可,其中 username 就是用戶名,password 為密碼,例如 username 為foo,密碼為 bar,那么代理就是 foo:bar@127.0.0.1:9743。

  如果代理是 SOCKS5 類型,那么可以用如下方式設(shè)置代理:

  import socks

  import socket

  from urllib import request

  from urllib.error import URLError

  socks.set_default_proxy(socks.SOCKS5, '127.0.0.1', 9742)

  socket.socket = socks.socksocket

  try:

  response = request.urlopen('http://httpbin.org/get')

  print(response.read().decode('utf-8'))

  except URLError as e:

  print(e.reason)

  此處需要一個(gè) Socks 模塊,可以通過(guò)如下命令安裝:

  pip3 install PySocks

  本地我有一個(gè) SOCKS5 代理,運(yùn)行在 9742 端口,運(yùn)行成功之后和上文 HTTP 代理輸出結(jié)果是一樣的:

  {

  "args": {},

  "headers": {

  "Accept-Encoding": "identity",

  "Connection": "close",

  "Host": "httpbin.org",

  "User-Agent": "Python-urllib/3.6"

  },

  "origin": "106.185.45.153",

  "url": "http://httpbin.org/get"

  }

  結(jié)果的 origin 字段同樣為代理的 IP,設(shè)置代理成功。

  3. Requests

  對(duì)于 Requests 來(lái)說(shuō),代理設(shè)置更加簡(jiǎn)單,我們只需要傳入 proxies 參數(shù)即可。

  還是以上例中的代理為例,我們來(lái)看下 Requests 的代理的設(shè)置:

  import requests

  proxy = '127.0.0.1:9743'

  proxies = {

  'http': 'http://' + proxy,

  'https': 'https://' + proxy,

  }

  try:

  response = requests.get('http://httpbin.org/get', proxies=proxies)

  print(response.text)

  except requests.exceptions.ConnectionError as e:

  print('Error', e.args)

  運(yùn)行結(jié)果:

  {

  "args": {},

  "headers": {

  "Accept": "*/*",

  "Accept-Encoding": "gzip, deflate",

  "Connection": "close",

  "Host": "httpbin.org",

  "User-Agent": "python-requests/2.18.1"

  },

  "origin": "106.185.45.153",

  "url": "http://httpbin.org/get"

  }

  可以發(fā)現(xiàn) Requests 的代理設(shè)置比 Urllib 簡(jiǎn)單很多,只需要構(gòu)造代理字典即可,然后通過(guò) proxies 參數(shù)即可設(shè)置代理,不需要重新構(gòu)建 Opener。

  可以發(fā)現(xiàn)其運(yùn)行結(jié)果的 origin 也是代理的 IP,證明代理已經(jīng)設(shè)置成功。

  如果代理需要認(rèn)證,同樣在代理的前面加上用戶名密碼即可,代理的寫(xiě)法就變成:

  proxy = 'username:password@127.0.0.1:9743'

  和 Urllib 一樣,只需要將 username 和 password 替換即可。

  如果需要使用 SOCKS5 代理,則可以使用如下方式:

  import requests

  proxy = '127.0.0.1:9742'

  proxies = {

  'http': 'socks5://' + proxy,

  'https': 'socks5://' + proxy

  }

  try:

  response = requests.get('http://httpbin.org/get', proxies=proxies)

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

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

  print(response.text)

  except requests.exceptions.ConnectionError as e:

  print('Error', e.args)

  在這里需要額外安裝一個(gè) Socks 模塊,命令如下:

  pip3 install "requests[socks]"

  運(yùn)行結(jié)果是完全相同的:

  {

  "args": {},

  "headers": {

  "Accept": "*/*",

  "Accept-Encoding": "gzip, deflate",

  "Connection": "close",

  "Host": "httpbin.org",

  "User-Agent": "python-requests/2.18.1"

  },

  "origin": "106.185.45.153",

  "url": "http://httpbin.org/get"

  }

  另外還有一種設(shè)置方式,和 Urllib 中的方法相同,使用 socks 模塊,也需要像上文一樣安裝該庫(kù),設(shè)置方法如下:

  import requests

  import socks

  import socket

  socks.set_default_proxy(socks.SOCKS5, '127.0.0.1', 9742)

  socket.socket = socks.socksocket

  try:

  response = requests.get('http://httpbin.org/get')

  print(response.text)

  except requests.exceptions.ConnectionError as e:

  print('Error', e.args)

  這樣也可以設(shè)置 SOCKS5 代理,運(yùn)行結(jié)果完全相同,相比第一種方法,此方法是全局設(shè)置,不同情況可以選用不同的方法。

  4. Selenium

  Selenium 同樣也可以設(shè)置代理,在這里分兩種介紹,一個(gè)是有界面瀏覽器,以 Chrome 為例介紹,另一種是無(wú)界面瀏覽器,以 PhantomJS 為例介紹。

  Chrome

  對(duì)于 Chrome 來(lái)說(shuō),用 Selenium 設(shè)置代理的方法也非常簡(jiǎn)單,設(shè)置方法如下:

  from selenium import webdriver

  proxy = '127.0.0.1:9743'

  chrome_options = webdriver.ChromeOptions()

  chrome_options.add_argument('--proxy-server=http://' + proxy)

  browser = webdriver.Chrome(chrome_options=chrome_options)

  browser.get('http://httpbin.org/get')

  在這里我們通過(guò) ChromeOptions 來(lái)設(shè)置代理,在創(chuàng)建 Chrome 對(duì)象的時(shí)候通過(guò) chrome_options 參數(shù)傳遞即可。

  這樣在運(yùn)行之后便會(huì)彈出一個(gè) Chrome 瀏覽器,訪問(wèn)目標(biāo)鏈接之后輸出結(jié)果如下:

  {

  "args": {},

  "headers": {

  "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",

  "Accept-Encoding": "gzip, deflate",

  "Accept-Language": "zh-CN,zh;q=0.8",

  "Connection": "close",

  "Host": "httpbin.org",

  "Upgrade-Insecure-Requests": "1",

  "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML,like Gecko)

  Chrome/59.0.3071.115 Safari/537.36"

  },

  "origin": "106.185.45.153",

  "url": "http://httpbin.org/get"

  }

  可以看到 origin 同樣為代理 IP 的地址,代理設(shè)置成功。

  如果代理是認(rèn)證代理,則設(shè)置方法相對(duì)比較麻煩,方法如下:

  from selenium import webdriver

  from selenium.webdriver.chrome.options import Options

  import zipfile

  ip = '127.0.0.1'

  port = 9743

  username = 'foo'

  password = 'bar'

  manifest_json = """

  {

  "version": "1.0.0",

  "manifest_version": 2,

  "name": "Chrome Proxy",

  "permissions": [

  "proxy",

  "tabs",

  "unlimitedStorage",

  "storage",

  "",

  "webRequest",

  "webRequestBlocking"

  ],

  "background": {

  "scripts": ["background.js"]

  }

  }

  """

  background_js = """

  var config = {

  mode: "fixed_servers",

  rules: {

  singleProxy: {

  scheme: "http",

  host: "%(ip)s",

  port: %(port)s

  }

  }

  }

  chrome.proxy.settings.set({value: config, scope: "regular"}, function() {});

  function callbackFn(details) {

  return {

  authCredentials: {

  username: "%(username)s",

  password: "%(password)s"

  }

  }

  }

  chrome.webRequest.onAuthRequired.addListener(

  callbackFn,

  {urls: [""]},

  ['blocking']

  )

  """ % {'ip': ip, 'port': port, 'username': username, 'password': password}

  plugin_file = 'proxy_auth_plugin.zip'

  with zipfile.ZipFile(plugin_file, 'w') as zp:

  zp.writestr("manifest.json", manifest_json)

  zp.writestr("background.js", background_js)

  chrome_options = Options()

  chrome_options.add_argument("--start-maximized")

  chrome_options.add_extension(plugin_file)

  browser = webdriver.Chrome(chrome_options=chrome_options)

  browser.get('http://httpbin.org/get')

  在這里需要在本地創(chuàng)建一個(gè) manifest.json 配置文件和 background.js 腳本來(lái)設(shè)置認(rèn)證代理,運(yùn)行之后本地會(huì)生成一個(gè) proxy_auth_plugin.zip 文件保存配置。

  運(yùn)行結(jié)果和上例一致,origin 同樣為代理 IP。

  PhantomJS

  對(duì)于 PhantomJS,代理設(shè)置方法可以借助于 service_args 參數(shù),也就是命令行參數(shù),代理設(shè)置方法如下:

  from selenium import webdriver

  service_args = [

  '--proxy=127.0.0.1:9743',

  '--proxy-type=http'

  ]

  browser = webdriver.PhantomJS(service_args=service_args)

  browser.get('http://httpbin.org/get')

  print(browser.page_source)

  在這里我們只需要使用 service_args 參數(shù),將命令行的一些參數(shù)定義為列表,在初始化的時(shí)候傳遞即可。

  運(yùn)行結(jié)果:

  {

  "args": {},

  "headers": {

  "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",

  "Accept-Encoding": "gzip, deflate",

  "Accept-Language": "zh-CN,en,*",

  "Connection": "close",

  "Host": "httpbin.org",

  "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X) AppleWebKit/538.1 (KHTML, like Gecko)

  PhantomJS/2.1.0

  Safari/538.1"

  },

  "origin": "106.185.45.153",

  "url": "http://httpbin.org/get"

  }

  運(yùn)行結(jié)果的 origin 同樣為代理的 IP,設(shè)置代理成功。

  如果需要認(rèn)證,那么只需要再加入 –proxy-auth 選項(xiàng)即可,這樣參數(shù)就改為:

  service_args = [

  '--proxy=127.0.0.1:9743',

  '--proxy-type=http',

  '--proxy-auth=username:password'

  ]

  將 username 和 password 替換為認(rèn)證所需的用戶名和密碼即可。

  5. 本節(jié)代碼

  本節(jié)代碼地址為:https://github.com/Python3WebSpider/ProxySettings。

責(zé)編:fushihao
  • 會(huì)計(jì)考試
  • 建筑工程
  • 職業(yè)資格
  • 醫(yī)藥考試
  • 外語(yǔ)考試
  • 學(xué)歷考試
禹州市| 射阳县| 翼城县| 上蔡县| 南陵县| 长沙市| 闸北区| 麻栗坡县| 平利县| 湖北省| 鄂托克旗| 宝鸡市| 望江县| 贵德县| 奉化市| 宜宾市| 丰宁| 贵溪市| 聂荣县| 乡宁县| 响水县| 鄢陵县| 蛟河市| 阿巴嘎旗| 新建县| 桦南县| 牙克石市| 蚌埠市| 富川| 西峡县| 绥芬河市| 宁晋县| 洛扎县| 上蔡县| 哈密市| 邵东县| 阿巴嘎旗| 张家界市| 西乌珠穆沁旗| 建平县| 陆丰市|