上一篇博客简单的实现了有道词典的功能,这篇博客主要是对其功能进行进一步的优化。
之前的有道词典的小程序中存在着几个问题:
(1)用户无法自定义输入的内容并且也无法多次输入,只能通过修改源代码来实现
(2)每个网站都有一个User-Agent的参数,用来记录访问网站的用户是什么,也就是说用Python和我们用浏览器来访问数据的User-Agent参数是不一样的。为了避免被屏蔽,我们需要手动的来修改User-Agent参数。
(3)当我们实现了User-Agent功能之后,我们可以实现用Python访问因特网而不会由于User-Agent参数而被屏蔽,但是由于程序访问互联网的速度很快,例如我们人浏览一张图片可能需要七八秒,而用Python浏览一张图片可能不到一秒,也就是说速度太快,而每个网站针对此都有一个法治,一旦超过,就会弹出验证码,导致我们抓取失败,我们可以使用两种办法来解决问题,一种是使用代理,一种是手动设置延迟。
现在,我们一个个来解决问题:
(1)实现用户的自定义和多次输入,我们可以这样修改代码:
import urllib.request
import json
url='http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom=dict2.index'
while True:
content=input("请输入你要翻译的内容(q表示退出程序):")
if content == 'q':
break
#建立一个字典
data={}
data['type'] = 'AUTO'
data['i'] = content
data['doctype'] = 'json'
data['xmlVersion'] = '1.8'
data['keyfrom'] = 'fanyi.web'
data['ue'] = 'UTF-8'
data['action'] = ['FY_BY_CLICKBUTTON']
data['typoResult']= 'true'
#在这里还不能直接将data作为参数,需要进行一下数据的解析才可以
#encode是将Unicode的编码转换成utf-8编码
data=urllib.parse.urlencode(data).encode('utf-8')
response=urllib.request.urlopen(url,data)
#decode作用是将其他形式的编码转换成python使用的Unicode编码
html=response.read().decode('utf-8')
target=json.loads(html)
print(target['translateResult'][0][0]['tgt'])
下面再来解决第二个问题,我们有两种方法来解决问题。
如果要解决这个问题,我们还要简单收一下urlopen函数,之前我们给其传递的参数都是url,其实它的参数也可以是Request方法返回的对象,在这里我们要用这种赋值方法来解决问题,那么User-Agent参数修改为什么呢?我们直接将用浏览器访问时的User-Agent参数拷贝下来就可以了。
代码如下:
import urllib.request
import urllib.parse
import json
while(True):
content=input("请输入你要翻译的内容(输入q退出程序):")
if content=='q':
break
url='http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom=dict2.index'
#第一种方法
#head必须是字典类型的参数
head={}
head['User-Agent']='Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883'
data={}
data['type']='AUTO'
data['i']= content
data['doctype']= 'json'
data['xmlVersion']= '1.8'
data['keyfrom']= 'fanyi.web'
data['ue']= 'UTF-8'
data['action']= 'FY_BY_CLICKBUTTON'
data['typoResult']='true'
data=urllib.parse.urlencode(data).encode('utf-8')
req=urllib.request.Request(url,data,head)
response=urllib.request.urlopen(req)
html=response.read().decode('utf-8')
target=json.loads(html)
#print(html)#json格式的数据
print("翻译结果:%s"%(target['translateResult'][0][0]['tgt']))
也可以使用add_header()函数
关于add_header()函数的官方文档给出的用法。
req=urllib.request.Request(url,data)
req.add_header('User-Agent','Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883')
这样便可以实现隐藏了。
最后解决第三个问题
(1)一是手动加上延迟
import time
time.sleep(5)
加上这两行代码就可以了,但是每次输入完成后需要等5秒才能输入,这样显然不能满足用户的要求,下面我们使用代理来解决这个问题。
当我们使用代理的时候,去访问我们要访问的网站时,我们只需要将要访问的网址给代理,代理将把你需要的内容给你
这样去访问网址的就不是自己,而是交给代理去访问
使用代理的步骤:
1.参数是一个字典{‘类型’:’代理ip:端口号’}
proxy_support=urllib.request.ProxyHandler({})
2.定制,创建一个opener(私人定制)
opener=urllib.request.build_opener(proxy_support)
3.安装opener
urllib.request.install_opener(opener)
4.调用opener
opener.open(url)
我们按照步骤来解决添加代理:
我们可以访问http://www.whatismyip.com.tw ,这个网址将把我们访问这个网站的ip反馈给我们,这样我们就能够知道是否是使用代理访问了。
import urllib.request
import random
#打印自己的ip
url="http://www.whatismyip.com.tw"
#我们可以使用一个代理的列表,以免服务器有卡顿
iplist=['123.55.194.43:9999','110.73.1.254:8123']
proxy_support=urllib.request.ProxyHandler({'http':random.choice(iplist)})
opener=urllib.request.build_opener(proxy_support)
#加上头部
opener.addheaders=[('User-Agent','Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883')]
urllib.request.install_opener(opener)
response=urllib.request.urlopen(url)
html=response.read().decode('utf-8')
print(html)
而我本机的ip地址:
到这里我们的代理也就添加成功了,最后将这段代码再加入到有道词典中就可以了。到这里关于爬虫的隐藏和代理到这里就结束了。下一篇将使用爬虫爬取美女图片,一块加油。