初学者简单的Python爬取翻译网站功能

首先感谢浪子文三少提供的没有反爬手段的翻译网站:http://fy.iciba.com/

浪子文三少原文:https://blog.youkuaiyun.com/weixin_43808690/article/details/87886075

话不多说,直接开始讲过程

基本思路

打开网站->给网站传递信息->接收网站返回的信息->输出接收的信息

1.第一步,打开IDLE,或者别的编辑软件

2.利用浏览器打开http://fy.iciba.com/,鼠标右键检索元素,展开如下图所示界面,选取Network

3.随便输入什么内容,点选翻译,找到Preview

在name那里可能会有很多东西,或者不用这个翻译网站的朋友可以翻找一下,当在Preview那里看到翻译过后的文本,说明我们找对了地方,点开Headers

4.找到Request URL(我们利用代码实际打开的网址)、User-Agent(伪装用的数据)、From Data(代码提交数据的表单)

5.开始写代码

​content = input('请输入需要翻译的内容(输入"q!"退出程序):')

​
#第一步,获取url,注意是实际我们要用的网址,不是这个翻译网址

url = 'http://fy.iciba.com/ajax.php?a=fy'

#第二步,打包好我们要用的数据

data = {'f':'auto','t','auto','w':content}

​

​

封装好所有的我们需要给网站的提供的数据之后,我们开始根据基本思路,编写代码

5.1)打开网站,传入我们需要的值


# 在Python中,Unicode类型是作为编码的基础类型,因此,我们的data数据要进行编码,然后传值
#       encode                 decode
# str ---------> str(Unicode) ---------> str
# 同样的,我们从网页获取的数据同样是Unicode形式,需要解码

data = urllib.parse.urlencode(data).encode('utf-8')

# 打开网页,并传值,同时伪装我们的User-Agent,如果不进行伪装,网站会知道我们是利用代码进行访问

req = urllib.request.Request(url,data)
req.add_header('User-Agent','从之前步骤中你自己复制的User-Agent值')
response = urllib.request.urlopen(req)

​

5.2)接收网站传回来的信息

html = response.read().decode('utf-8')

这里直接打印print(html)

发现打印出来的文件为

{"status":1,"content":{"from":"zh-CN","to":"en-US","out":"I love you","vendor":"ciba","err_no":0}}

很明显,虽然我们获取了传过来的值,并且可以看出"I love you"确实得到了翻译

但这个数据是不够美观,返回来的值是一个str类型的json数据,在Python中显示为字典嵌套字典的形式

因此我们的输出可以改为

# 对html的数据进行json数据解码,转换成字典形式

target = json.loads(html)

print("翻译结果为:%s"%(target['content']['out']))

完整代码



import urllib.request
import urllib.parse
import json

while True:

    content = input('请输入需要翻译的内容(输入"q!"退出程序):')
    if content == 'q!':
        break
    
    url = 'http://fy.iciba.com/ajax.php?a=fy'  
    data = {'f':'auto','t':'auto','w':content}


    data = urllib.parse.urlencode(data).encode('utf-8')
    req = urllib.request.Request(url,data)
    req.add_header('User-Agent','自己复制的User-Agent')
    response = urllib.request.urlopen(req)

    html = response.read().decode('utf-8')
    target = json.loads(html)

    if target['status'] == 1:
        print("翻译结果为:%s"%(target['content']['out']))
    else:
        print("翻译结果为:")
        for eachTrans in target['content']['word_mean']:
            print(eachTrans)



​

优化

完整代码进行了优化,经过测试,返回数据当中的status数据,是对提交数据的一个判断,如果返回的是一个单词或短语,网站会返回一个新的内容,要提取翻译的内容需要修改部分数据

如果不进行该项优化,再提交部分翻译的时候,会发生错误,错误名NameErrors

同时进行了循环操作,可以不断进行试验

该代码有待进一步的优化

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值