#为什么要设置代理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'))