长长的论文,我想要一键快速翻译!反正我自己翻译是不得行的,那就……
嘿嘿~~~~ Python整活可真行!
今天来学学如何运用网络爬虫,制作一款翻译工具,并在一分钟以内翻译完一篇百页论文
HTML,全称为超文本标记语言,是一种标记语言,通过标记式的指令,将影像、声音、图片、文字动画、影视等内容显示出来。
当浏览器接收到 HTML 页面,并“翻译”成可以识别的信息,即可呈现你所见到这个网页。
HTTP请求
当浏览器向服务器发送一个 HTTP 请求时,包含请求行、请求头、请求体三个部分。
请求行:包含请求方法、请求URL 、HTTP版本。
请求头:服务器辨析请求头获取浏览器的信息。
请求体:承载请求参数的数据。
常见的请求方法有两种:GET 和 POST。
GET - 从指定的服务器请求数据。
POST - 向指定的服务器提交要被处理的数据
HTTP响应
服务器接收并处理浏览器发过来的请求后,会返回 HTTP 响应,也由三个部分组成,分别是:响应行、响应头、响应正文。
响应行:包含协议版本、状态码。
响应头:包含服务器名称、响应正文类型、响应正文编码等信息。
响应正文:服务器返回浏览器的数据信息。
HTTP状态码
HTTP 状态码(Status)是服务器告诉浏览器当前请求响应的状态,也就是服务器告诉浏览器:发生了什么事。
HTTP状态码由 3 位数字构成的,以下是常见状态码:
200 - 请求成功
301 - 请求的网页被分配了新的URL
404 - 请求的网页不存在
500 - 服务器错误
通过代码pip install requests 安装 requests 模块
pip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple/
什么是API
API 是 Application Programming Interface (应用 编程 接口)三个单词的缩写。
通俗易懂的说,API 也就是别人写好的代码,或者编译好的程序,提供给大家使用。
爬虫毕竟是在模拟浏览器发送请求,如果我们频繁请求,或者爬取内容过多,很容易被网站识别出是爬虫,从而拒绝请求,掉进网站的反爬虫机制。
别着急,在今天的课程中,给你介绍一个反反爬虫策略——设置User-Agent
设置UA
设置 User-Agent 以字典的格式添加进 requests.post() 函数中。
在本例中,新加一个字典 header,键为User-Agent,对应的值为
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36
在课程中,你可以使用这个 User-Agent👆;在本地练习时,你可以获取自己电脑中的浏览器的 User-Agent。
很多网站都会用到 JSON 格式来进行数据的传输和交换,例如XX云音乐接口,它们返回的数据都是 JSON 格式的。
当我们获取到 JSON 数据后,可以进行解码,转换成字典数据类型,从而提取出指定数据。
完整的代码如下
# 使用import导入requests模块
import requests
# 使用import导入json模块
import json
# 使用import导入docx模块
import docx
# 使用import导入time模块
import time
# 将Word文档路径赋值给变量path
path = "/yequ/论文.docx"
# 读取Word文档赋值给变量docxFile
docxFile = docx.Document(path)
# 获取全部段落赋值给变量paragraphs
paragraphs = docxFile.paragraphs
# TODO 新建Word文档赋值给变量docxNew
docxNew = docx.Document()
# 将API链接赋值给url
url = "https://fanyi.youdao.com/translate"
# 将User-Agent以字典键对形式赋值给header
header = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36"}
# for循环遍历paragraphs,并赋值给par
for par in paragraphs:
# 使用.text获取段落文本并赋值给par_text
par_text = par.text
# 如果段落文本不为空
if par_text != "":
# 构建一个字典word,添加键值为"i"其值为par_text
# 添加键值为"doctype"其值为"json"。
word = {"i":par_text, "doctype":"json"}
# 停顿0.1秒
time.sleep(0.1)
# 使用requests.post(),赋值给变量response
# 传入url
# 传入参数data,值为字典word
# 传入参数headers,值为字典header
response = requests.post(url, data=word, headers=header)
# 使用.text获取内容并赋值给res_text
res_text = response.text
# 使用json.loads()将str转换成dict,赋值给data
data = json.loads(res_text)
# 通过字典层层索引,找到翻译后的内容,并赋值给translate
translate = data["translateResult"][0][0]["tgt"]
# TODO 使用add_paragraph()向文档中添加translate
docxNew.add_paragraph(translate)
# TODO 保存并命名文档至指定路径
docxNew.save("/yequ/翻译论文.docx")