利用Python3和Charles爬取有道词典

发表于:2018-6-06 08:52

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:呆瓜真是呆    来源:博客园

  一.用Charles爬取数据
  Charles是一个多平台的抓包工具,可以很方便的抓取http和https数据。
  1.抓取数据
  抓取数据前我们首先要清楚,由于有道词典的翻译使用的是post请求,所以我们要抓取的信息有:url链接、request headers(请求头)、format data(数据表单,也即请求体request body)
  a)打开Charles,选择Proxy选项卡中的macOS Proxy选项。
  b)打开浏览器,输入网址 http://fanyi.youdao.com,然后在左边的输入框输入要翻译的内容。
  c)打开Charles,点击左边的Structure选项卡,依次点击找到箭头指示的内容,可以在右边的Overview选项卡中看到基本的请求信息,这里我们需要的url链接就出现了。
  d)点击右边的content选项卡,再点击Raw选项卡,就可以看到原始的请求数据,红框所示是请求头信息,蓝框所示是请求体信息。
  整理数据
  a)将找到url链接、请求头以及请求体数据复制到sublime编辑器中。
  b)利用sublime的替换功能,将数据整理成我们写程序时想要的python中字典的形式。
  二.代码实现
  闲话不多说,先贴代码
import urllib.parse
import urllib.request
def youdao():
# 构建url链接
# url = 'http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'
# 这里要去掉?号前面的_o,不然会进行加密算法,导致失败
url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'
# 构建请求头
headers = {
"User-Agent" : 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:59.0) Gecko/20100101 Firefox/59.0'
}
words = input("请输入要翻译的内容:")
# 构建请求体
format_data = {
'i': words,
'from':'AUTO',
'to':'AUTO',
'smartresult':'dict',
'client':'fanyideskweb',
'salt':'1526368137702',
'sign':'f0cd13ef1919531ec9a66516ceb261a5',
'doctype':'json',
'version':'2.1',
'keyfrom':'fanyi.web',
'action':'FY_BY_REALTIME',
'typoResult':'false'
}
# 进行url编码
format_data = urllib.parse.urlencode(format_data).encode("utf-8")
# 获取request文件(传入了data参数,就是post请求)
request = urllib.request.Request(url, data = format_data, headers = headers)
# 打开请求文件
response = urllib.request.urlopen(request)
# 读取文件内容
content = response.read()
content = eval(content)
ret = content["translateResult"][0][0]['tgt']
print(ret)
return ret
if __name__ == "__main__":
youdao()
  运行结果:
   
  注意点:
  1.如果使用原始的url进行爬取,会返回erro500的错误,我们需要将原始的请求url里面的"_o"去掉,这样服务器就不会进行验证。
  2.代码第33行对请求体进行了url编码后,还进行了二进制编码,因为http请求用的是二进制,所以要进行编码,才能发送post请求。
  3.请求包体里面的'i',是我们用户输入的翻译内容,所以这是我们要自定义输入的地方。
  三.图形界面
  代码基本实现后,觉得有点无趣,就用python3自带的tkinter写了个小的图形界面出来,代码如下:
from tkinter import *
import urllib.parse
import urllib.request
def youdao(words):
# 构建url
url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'
# 构建请求头
headers = {
"User-Agent" : 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:59.0) Gecko/20100101 Firefox/59.0'
}
# 构建请求体
format_data = {
'i': words,
'from':'AUTO',
'to':'AUTO',
'smartresult':'dict',
'client':'fanyideskweb',
'salt':'1526368137702',
'sign':'f0cd13ef1919531ec9a66516ceb261a5',
'doctype':'json',
'version':'2.1',
'keyfrom':'fanyi.web',
'action':'FY_BY_REALTIME',
'typoResult':'true'
}
# 进行url编码
format_data = urllib.parse.urlencode(format_data).encode("utf-8")
# 获取request文件(传入了data参数,就是post请求)
request = urllib.request.Request(url, data = format_data, headers = headers )
# 打开请求文件
response = urllib.request.urlopen(request)
# 读取文件内容
content = response.read()
content = eval(content)
ret = content["translateResult"][0][0]['tgt']
print(ret)
return ret
# 主程序
root = Tk()
# 设置标题
root.title("呆瓜词典")
# 设置主窗口大小
root.geometry("320x150")
# 可变大小
root.resizable(width=False, height=True)
# 第一排输入框 输入查询的内容
# 左边是一个标签
l1 = Label(root, text = '查询内容', bg = "yellow", font = (12), height = 1, width = 8)
l1.place(x = 20,y = 20)
var1 = StringVar()
input_text = Entry(root, textvariable = var1)
input_text.place(x = 100, y = 20)
# 第二排显示框 显示查询的结果
# 左边是一个标签
l2 = Label(root, text = '查询结果', bg = "yellow", font = (12), height = 1, width = 8)
l2.place(x = 20, y =60)
var2 = StringVar()
output_text = Entry(root, textvariable = var2)
output_text.place(x = 100, y =60)
# 调用youdao函数,传进要翻译的内容
def func():
words = var1.get()
if words:
# print(words)
result = youdao(words)
var2.set(result)
# 添加一个按钮
b = Button(root, text = "查询", command = func)
b.place(x = 170, y = 100)
# 运行主程序
root.mainloop()
  运行效果:
 
  中英文都可以翻译,至此任务就完成了。

上文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理。
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号