Python零基础入门二十一之有道词典的优化

上一篇博客简单的实现了有道词典的功能,这篇博客主要是对其功能进行进一步的优化。
之前的有道词典的小程序中存在着几个问题:
(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地址:

这里写图片描述

到这里我们的代理也就添加成功了,最后将这段代码再加入到有道词典中就可以了。到这里关于爬虫的隐藏和代理到这里就结束了。下一篇将使用爬虫爬取美女图片,一块加油。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值