#為什么要設置代理IP和隨機請求頭?
#爬蟲默認的User-Agent(python-urllib/python版本)
#1.服務器會判斷一個頻繁的請求是不是來自於同一個User-Agent標識,或者判斷User-Agent是不是以python開頭。如果是,則會限制訪問。
#解決方案:隨機切換User-Agent的值
#2.服務器會判斷一個頻繁的請求是不是來自於同一個IP地址發出的,如果是,則會對IP進行限制訪問。
#解決方案:使用代理IP,隨機切換IP地址,不使用真實的IP來發起請求。
1.設置隨機請求頭
# #定義一個要訪問的網址: url='http://httpbin.org/get' # #設置一個瀏覽器標識的列表 user_agent_list=['Mozilla/5.0(Windows;U;WindowsNT6.1;en-us)AppleWebKit/534.50(KHTML,likeGecko)Version/5.1Safari/534.50','Mozilla/5.0(Macintosh;IntelMacOSX10.6;rv:2.0.1)Gecko/20100101Firefox/4.0.1','Mozilla/5.0(Macintosh;IntelMacOSX10_7_0)AppleWebKit/535.11(KHTML,likeGecko)Chrome/17.0.963.56Safari/535.11'] #設置一個請求頭 headers={ 'User-Agent':random.choice(user_agent_list) } request=urllib.request.Request(url,headers=headers,method='GET') response=urllib.request.urlopen(request).read().decode('utf-8') print(response)
2.動態的添加請求頭
import urllib.request import random result=urllib.request.Request(url,method='GET') result.add_header('User-Agent','Mozilla/5.0(Windows;U;WindowsNT6.1;en-us)AppleWebKit/534.50(KHTML,likeGecko)Version/5.1Safari/534.50') response=urllib.request.urlopen(result) print(response.read().decode('utf-8'))
3.設置代理隨機IP
import urllib.request import random from urllib.request import ProxyHandler,build_opener #設置一個代理IP列表 ip_list=[{'http':'http://61.135.217.7:80'},{'https':'https://111.231.223.236:808'},{'http':'http://111.155.116.236:8123'}] #創建一個IP代理對象 proxy_handler=ProxyHandler(random.choice(ip_list)) #根據IP代理對象,創建用於發送請求的opener對象 opener=build_opener(proxy_handler) opener.addheaders=[('User-Agent','Mozilla/5.0(Windows;U;WindowsNT6.1;en-us)AppleWebKit/534.50(KHTML,likeGecko)Version/5.1Safari/534.50')] #再使用opener這個對象發起請求 response=opener.open('http://httpbin.org/get') print(response.read().decode('utf-8'))
4.代理IP+隨機請求頭
import urllib.request import random from urllib.request import ProxyHandler,build_opener # url='http://httpbin.org/get' # #設置一個瀏覽器標識的列表 user_agent_list=['Mozilla/5.0(Windows;U;WindowsNT6.1;en-us)AppleWebKit/534.50(KHTML,likeGecko)Version/5.1Safari/534.50','Mozilla/5.0(Macintosh;IntelMacOSX10.6;rv:2.0.1)Gecko/20100101Firefox/4.0.1','Mozilla/5.0(Macintosh;IntelMacOSX10_7_0)AppleWebKit/535.11(KHTML,likeGecko)Chrome/17.0.963.56Safari/535.11'] ip_list=[{'http':'http://61.135.217.7:80'},{'https':'https://111.231.223.236:808'},{'http':'http://111.155.116.236:8123'}] #設置一個請求頭 headers={ 'User-Agent':random.choice(user_agent_list) } request=urllib.request.Request(url,headers=headers,method='GET') #創建一個IP代理對象 proxy_handler=ProxyHandler(random.choice(ip_list)) #根據IP代理對象,創建用於發送請求的opener對象 opener=build_opener(proxy_handler) #使用install_opener方法之后,會將程序中默認的urlopen方法替換掉,也就是說使用install_opener之后,在該文件中,再次調用urlopern會使用以及創建好的operner對象。如果不想替換,只是想臨時用一下,可以使用opener.open()這樣就不會對程序默認的urlopen有影響。 # urllib.request.install_opener(opener) #再使用opener這個對象發起請求 response=opener.open(request) print(response.read().decode('utf-8'))
