一、一般服务器是通过request header中的user-agent来判断访问的是否为非人类,python给我提供的一个方法用于修改user-agent中的类容来试图欺骗服务器
- 使用user.request.Request(url,data=None,headers={})
我们可以通过添加heades中的内容来改变user-agent,python规定header的形式为一个字典,且可以通过两种方式来添加header。
第一种方法在request对象生成前添加header
import urllib.request
import urllib.parse
import json
url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'
print('按quit退出软件!')
while True:
string = input('请如输入你要翻译的内容:')
if string == 'quit':
break
header = {} #request对象生成前添加header
header['User-Agent'] = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36'
data = {}
data['i'] = string
data['from']= 'AUTO'
data['to']= 'AUTO'
data['smartresult']= 'dict'
data['client']= 'fanyideskweb'
data['salt']= '15736230452499'
data['sign']= '2334c19fb0460ae09b873c2c1c9a7a98'
data['ts']='1573623045249'
data['bv']= '75551116684a442e8625ebfc9e5af1ba'
data['doctype']= 'json'
data['version']= '2.1'
data['keyfrom']= 'fanyi.web'
data['action']= 'FY_BY_CLICKBUTTION'
'''
data是来自于网页中Form Data中的数据,它其实为一个字典
data如果为空则默认用get传值否则用post来传值
data传入的格式要为application/x-www-from-urlencoded 形式,我们可以使用 urllib.parse.urlencode()方法转换为该格式
'''
data = urllib.parse.urlencode(data).encode('utf-8')
req = urllib.request.Request(url,data,header)
response = urllib.request.urlopen(req)
html = response.read().decode('utf-8')
target = json.loads(html)['translateResult'][0][0]['tgt']
print(target)
第二种方法在request对象生成后使用方法add_header(key,value)
import urllib.request
import urllib.parse
import json
url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'
print('按quit退出软件!')
while True:
string = input('请如输入你要翻译的内容:')
if string == 'quit':
break
data = {}
data['i'] = string
data['from']= 'AUTO'
data['to']= 'AUTO'
data['smartresult']= 'dict'
data['client']= 'fanyideskweb'
data['salt']= '15736230452499'
data['sign']= '2334c19fb0460ae09b873c2c1c9a7a98'
data['ts']='1573623045249'
data['bv']= '75551116684a442e8625ebfc9e5af1ba'
data['doctype']= 'json'
data['version']= '2.1'
data['keyfrom']= 'fanyi.web'
data['action']= 'FY_BY_CLICKBUTTION'
'''
data是来自于网页中Form Data中的数据,它其实为一个字典
data如果为空则默认用get传值否则用post来传值
data传入的格式要为application/x-www-from-urlencoded 形式,我们可以使用 urllib.parse.urlencode()方法转换为该格式
'''
data = urllib.parse.urlencode(data).encode('utf-8')
req = urllib.request.Request(url,data)
req.add_header('User-Agent','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36')
response = urllib.request.urlopen(req)
html = response.read().decode('utf-8')
target = json.loads(html)['translateResult'][0][0]['tgt']
print(target)
二、即使我们修改了user-agent,我们仍然可以会被屏蔽,因为你在短时间内使用一个IP频繁的访问服务器,这时候服务器就有可能将程序屏蔽掉,而这种情况我们可以使用代理来解决(即使用其他的IP来帮助我们访问)
步骤:
1.参数是一个字典{‘类型(http/ftp等)’:‘代理ip:端口号’}
proxy_support = urllib.request.ProxyHandler({}) #{}内为上述创建的字典
2.定制、创建一个opener
(比如我们在打开一个网页的时候就是在使用一个默认的opener在工作,opener可以设置IP、header等参数)
opener = urllib.request.build_opener(proxy_support)
3.安装opener
urllib.request.install_opener(opener) #此后都会使用这个opener
如果你想使用原来默认的opener代码代码如下
opener.open(url)
代码如下:
import urllib.request
import random
iplist = ['49.51.68.122:1080','52.80.58.248:3128','47.94.89.87:3128']
url = 'http://www.baidu.com'
#设置一个字典
proxy_support = urllib.request.ProxyHandler({'http':random.choice(iplist)})
#定制、创建一个opener
opener = urllib.request.build_opener(proxy_support)
#安装opener
urllib.request.install_opener(opener)
#访问网站
response = urllib.request.urlopen(url)
html = response.read().decode('utf-8')
print(html)