對于一般的小型爬蟲,我們爬取某個網站所發出的請求次數少即頻率不是很高時,為避免可能出現的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撥号代理推薦:雲立方