.Net5 WebApi使用日志Logger

3.C语言选择排序

  返回  

python爬虫实践记录-基于requests访问翻译网页爬取结果

2021/8/21 22:30:47 浏览:

前言

       目前主流的翻译网站反爬虫都挺严格的,某度有sign算法,谷歌自带技能冷却....

查了一下发现一个反爬虫没用那么苛刻的翻译网站:译典通。

        第一次听说这个网站,界面挺老,爬来的源代码注释可以追溯到2011年,翻译的效果可以说是不尽人意Σ(っ °Д °;)っ,但是也没办

法,谁让大厂家的翻译网页反爬这么严呢

成品展示

 

 

 我的配置:

        系统:win10 19042 专业版

        浏览器: Edge

        PythonIED : Pycharm2021

        python : python3.9.6

 第一步:分析网页

        打开翻译网站,随便输入一个词翻译,并用f12(开发者工具)

在开发者工具中,打开顶部任务栏的网络 

 点击第一个trans/,就可以看到发送请求的url地址,以及发送请求连带的数据 

发送的数据:

请求的url:

 包括请求标头里的Cookie和User-Agent都需要记录下来(常识了)

 

接着在trans\的任务栏中找到响应可以看到服务器发回的网页源代码,翻译的结果和其他需要的数据都在里面

 分析完毕,总结:

        1.使用requests得到返回的网页源代码

        2.使用正则表达式re模块筛选有价值的数据

开始制作:

   首先引入两个会用到的库

import requests     #request库
import re           #re模块

 变量url储存网页的request url

使用一个字典存储User-agent 和Cookie

url = "https://www.dreye.com.cn/trans/"
head = {
    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36 Edg/92.0.902.67",
    "Cookie":"dreye[sys_lang]=gb; phpbb3_jb4z2_u=1; phpbb3_jb4z2_k=; phpbb3_jb4z2_sid=05e7f02ea96bb4513874e06033c06885; PHPSESSID=hgsargck54cmtepq06cb39ahm0"
}

再使用一个字典存放发送过去数据,在上面的分析可以得出

t_value是翻译的内容,from、to的意思是从一种语言翻译到另一种语言

sbt发送的是翻译,我这也不是很明白,暂且定义它为发送的操作吧

    data = {
        "t_value":test.get(),
        "from": "zh-CHS",
        "to": "en",
        "sbt": "翻译",
        "t_r": ""
    }

发送接收数据:

 #1.使用变量res接收接受并且整理出来的数据

 #2.while判断res是否接受成功,网站有技能冷却,有时候需要多两三次重新发送爬取

 #3.response 使用requests.post方法封装发送到请求url

 #4,变量text记录response接受回的内容(响应),并使用utf-8重新编码

 #5.转string格式

 #6.res搜索符合正则表达式的内容,因为符合表达式的有两个内容,一个是原文,一个是翻译后的结果,原文在结果上方所以会首先记录到原文,所以下标1就是翻译结果,而下标0是原文内容

    Findresult = re.compile(r'class="transtext">(.*?)</textarea><br />')    #7

    res = ""        #1.
    while len(res) == 0:    #2
        response = requests.post(url, data=data, headers=head)    #3
        text = response.content.decode("utf-8")    #4
        text = str(text)        #5
        res = re.findall(Findresult,text)[1]        #6

等到跳出循环,既可以得出结果

此时已经完成软件的基本功能,后续使用tk模块进行窗口化等进行美化和加强即可

源代码: 

 在上面的基础功能上做了图形化还增加了一些功能和选择

# -*- codeing = utf-8 -*-
# @Time : 2021/8/20 16:22
# @File : translate.py
# @Software : PyCharm

import requests
import re

import tkinter as tk
from tkinter import ttk
from tkinter import *

Findresult = re.compile(r'class="transtext">(.*?)</textarea><br />')
head = {
    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36 Edg/92.0.902.67",
    "Cookie":"dreye[sys_lang]=gb; phpbb3_jb4z2_u=1; phpbb3_jb4z2_k=; phpbb3_jb4z2_sid=05e7f02ea96bb4513874e06033c06885; PHPSESSID=hgsargck54cmtepq06cb39ahm0"
}

def TransLate():
    url = "https://www.dreye.com.cn/trans/"
    d_after.insert('0.0',"")
    data = {
        "t_value":test.get(),
        "from": "zh-CHS",
        "to": "en",
        "sbt": "翻译",
        "t_r": ""
    }
    if d_com.get() == "英译中":
        data['from'] = "en"
        data['to'] = "zh-CHS"
    print(data['to'])

    res = ""
    while len(res) == 0:
        response = requests.post(url, data=data, headers=head)
        text = response.content.decode("utf-8")
        text = str(text)
        res = re.findall(Findresult,text)[1]

    d_after.insert('0.0',res)



root = tk.Tk()
root.minsize(430,200)
root.maxsize(430,200)
root.title('千度翻译')
root.attributes("-alpha",0.8)


l_befor = tk.Label(root,text='翻译前',font=10,width=10)
l_befor.grid(row=0,column=0)

d_com = ttk.Combobox(root,font=23,width=7)
d_com['value'] = ("中译英","英译中","待定..")
d_com.grid(row=0,column=1)
d_com.current(0)

test = tk.Entry(root,font=100,width=50)
test.grid(row=1,columnspan=2)

l_after = tk.Label(root,text='翻译后',font=20,width=10)
l_after.grid(row=2,column=0)

d_after = tk.Text(root,width=50,height=3,font=100)
d_after.grid(row=3,columnspan=2)


d_button = tk.Button(root,text='翻译',font=25,height=2,width=11,command=TransLate)
d_button.grid(row=4,column=0)


def Call_C_B():
    if v.get()==1:
        root.wm_attributes('-topmost', 1)
    else:
        root.wm_attributes('-topmost', 0)
        v.set(0)

v = IntVar()
d_selet = tk.Checkbutton(root,text="窗口置项",font=20,variable=v,command=Call_C_B)
d_selet.grid(row=4,columnspan=2)







root.mainloop()

感谢观看

联系我们

如果您对我们的服务有兴趣,请及时和我们联系!

服务热线:18288888888
座机:18288888888
传真:
邮箱:888888@qq.com
地址:郑州市文化路红专路93号