欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python3爬蟲里關(guān)于代理的設(shè)置總結(jié)

 更新時(shí)間:2020年07月30日 15:20:29   作者:愛喝馬黛茶的安東尼  
在本篇文章里小編給大家整理的是一篇關(guān)于Python3爬蟲里關(guān)于代理的設(shè)置總結(jié),需要的朋友們可以參考下。

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

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

1. 獲取代理

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

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

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

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

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

2. Urllib

首先我們以最基礎(chǔ)的 Urllib 為例,來看一下代理的設(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)我們請求的鏈接是 http 協(xié)議的時(shí)候,它會調(diào)用 http 代理,當(dāng)請求的鏈接是 https 協(xié)議的時(shí)候,它會調(diào)用https代理,所以此處生效的代理是:http://127.0.0.1:9743。

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

運(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 模塊,可以通過如下命令安裝:

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

對于 Requests 來說,代理設(shè)置更加簡單,我們只需要傳入 proxies 參數(shù)即可。

還是以上例中的代理為例,我們來看下 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 簡單很多,只需要構(gòu)造代理字典即可,然后通過 proxies 參數(shù)即可設(shè)置代理,不需要重新構(gòu)建 Opener。

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

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

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)
    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 模塊,也需要像上文一樣安裝該庫,設(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 為例介紹,另一種是無界面瀏覽器,以 PhantomJS 為例介紹。

Chrome

對于 Chrome 來說,用 Selenium 設(shè)置代理的方法也非常簡單,設(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')

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

這樣在運(yùn)行之后便會彈出一個(gè) Chrome 瀏覽器,訪問目標(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è)置方法相對比較麻煩,方法如下:

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",
        "<all_urls>",
        "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: ["<all_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 腳本來設(shè)置認(rèn)證代理,運(yùn)行之后本地會生成一個(gè) proxy_auth_plugin.zip 文件保存配置。

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

PhantomJS

對于 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。

6. 結(jié)語

本節(jié)介紹了前文所介紹的請求庫的代理設(shè)置方法,稍作了解即可,后面我們會使用這些方法來搭建代理池和爬取網(wǎng)站,進(jìn)一步加深印象。

相關(guān)文章

  • Python爬取肯德基官網(wǎng)ajax的post請求實(shí)現(xiàn)過程

    Python爬取肯德基官網(wǎng)ajax的post請求實(shí)現(xiàn)過程

    這篇文章主要介紹了Python爬取肯德基官網(wǎng)ajax的post請求實(shí)現(xiàn)過程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家學(xué)有所得,多多進(jìn)步
    2021-10-10
  • Django視圖函數(shù)的具體使用

    Django視圖函數(shù)的具體使用

    這篇文章主要介紹了Django視圖函數(shù)的具體使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • Python pass詳細(xì)介紹及實(shí)例代碼

    Python pass詳細(xì)介紹及實(shí)例代碼

    這篇文章主要介紹了Python pass詳細(xì)介紹及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下
    2016-11-11
  • Pycharm安裝scrapy及初始化爬蟲項(xiàng)目的完整步驟

    Pycharm安裝scrapy及初始化爬蟲項(xiàng)目的完整步驟

    因?yàn)槿腴Tpython以來一直使用pycharm,所以對著黑白的DOS不習(xí)慣,所以此次來實(shí)現(xiàn)使用pycharm進(jìn)行實(shí)現(xiàn)使用scrapy框架,下面這篇文章主要給大家介紹了關(guān)于Pycharm安裝scrapy及初始化爬蟲項(xiàng)目的完整步驟,需要的朋友可以參考下
    2022-08-08
  • 解決python訪問報(bào)錯(cuò):jinja2.exceptions.TemplateNotFound:index.html

    解決python訪問報(bào)錯(cuò):jinja2.exceptions.TemplateNotFound:index.html

    這篇文章主要介紹了解決python訪問報(bào)錯(cuò):jinja2.exceptions.TemplateNotFound:index.html,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • 對Python捕獲控制臺輸出流的方法詳解

    對Python捕獲控制臺輸出流的方法詳解

    今天小編就為大家分享一篇對Python捕獲控制臺輸出流的方法詳解,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01
  • Python實(shí)現(xiàn)語音識別vosk的示例代碼

    Python實(shí)現(xiàn)語音識別vosk的示例代碼

    Vosk是一個(gè)功能強(qiáng)大且易于使用的語音識別工具包,它提供了Python綁定,使得在Python中使用Vosk變得非常方便,本文主要介紹了Python實(shí)現(xiàn)語音識別vosk的示例代碼,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-12-12
  • Python操作Sql Server 2008數(shù)據(jù)庫的方法詳解

    Python操作Sql Server 2008數(shù)據(jù)庫的方法詳解

    這篇文章主要介紹了Python操作Sql Server 2008數(shù)據(jù)庫的方法,結(jié)合實(shí)例形式分析了Python使用pyodbc庫操作Sql Server 2008數(shù)據(jù)庫的連接、執(zhí)行sql語句、關(guān)閉連接等相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下
    2018-05-05
  • 基于Pytorch版yolov5的滑塊驗(yàn)證碼破解思路詳解

    基于Pytorch版yolov5的滑塊驗(yàn)證碼破解思路詳解

    這篇文章主要介紹了基于Pytorch版yolov5的滑塊驗(yàn)證碼破解思路詳解,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-02-02
  • Python數(shù)據(jù)可視化Pyecharts庫的使用教程

    Python數(shù)據(jù)可視化Pyecharts庫的使用教程

    pyecharts是一個(gè)用于生成echarts圖表的類庫。echarts是百度開源的一個(gè)數(shù)據(jù)可視化庫,用echarts生成的圖可視化效果非常棒。使用pyechart庫可以在python中生成echarts數(shù)據(jù)圖。本文將詳細(xì)介紹一下Pyecharts庫的使用,需要的可以參考一下
    2022-02-02

最新評論