天天看點

Python爬蟲學習筆記(使用代理及代理池——解決傳回狀态碼302即IP被封的問題)

對于一般的小型爬蟲,我們爬取某個網站所發出的請求次數少即頻率不是很高時,為避免可能出現的IP被封的問題,我們可以設定爬取延時或者規定爬取時長來解決。

1.requests庫

import requests

#如果代理需要認證,可以使用proxy='username:[email protected]:port'

proxyHttps = '121.33.220.158' #端口:808

proxyHttp = '110.73.8.171' #端口:8123

url = 'http://httpbin.org/get'

proxies={

    'http':'http://'+proxyHttp+':8123',

    'https':'https://'+proxyHttps+'808'

}

'''

    socks5代理使用,首先使用pip安裝requests[socks]子產品

    proxies={

        'http':'socks5://'+proxy+':port'

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

    }

'''

try:

    re = requests.get(url,proxies)

    print(re.text)

except requests.exceptions.ConnectionError as e:

    print('ERROR',e.args)

2.selenium+Headless

from selenium import webdriver

from selenium.webdriver.chrome.options import Options

url = 'http://httpbin.org/get'

service_args=[

    '--proxy=110.73.8.171:8123',

    '--proxy-type=http'

]

# 聲明谷歌浏覽器對象

#driver = webdriver.Chrome()

#設定浏覽器無頭模式

option = webdriver.ChromeOptions()

option.add_argument('--headless')

option.add_argument('--disable-gpu') #禁用 GPU 硬體加速,防止出現bug

driver = webdriver.Chrome(options=option,service_args=service_args)

driver.get(url)

print(driver.page_source)

3.代理池的使用

網絡上有很多已經封裝好的代理池工程可以使用,這裡使用此代理池工程,此代理池爬取免費代理網站中的代理IP和端口(擷取子產品),動态判斷其有效性(檢測子產品)并将有效的代理儲存到本地的Redis資料庫(存儲子產品,注意修改自己的端口和密碼,具體參見這篇部落格),最後建立接口以webAPI的形式暴露可用代理(接口子產品),通過接口程式可以動态擷取可用代理。使用時首先保持本地redis資料庫開啟并連接配接,然後運作代理池工程,最後 運作爬蟲工程即可

import requests

PROXY_POOL_URL = 'http://localhost:5555/random' #擷取代理IP及端口的URL,此URL暴露随機的可用代理IP

def get_proxy():
    try:
        respo = requests.get(PROXY_POOL_URL) #擷取代理IP及端口
        if respo.status_code == 200:
            return respo.text
    except ConnectionError:
        return None

def use_proxy(getProxy):
    proxy = getProxy
    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('Erroe',e.args)

def main():
    getProxy = get_proxy()
    use_proxy(getProxy)

main()           

4.付費代理推薦:阿布雲代理(動态版),提供各種爬蟲庫的接入方式

5.ADSL撥号代理推薦:雲立方

繼續閱讀