欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

用python做一个翻译软件,基于简单爬虫和网络编程

程序员文章站 2022-05-28 21:30:59
...

声明:我爬取的是百度翻译,然后利用自己熟悉的领域(网络编程)简易封装了一个C/S模型包装成自己的翻译软件,这只是我个人的小玩具把他分享出来。但如果您拿了这份代码,若做了违法乱纪的事情,博主不承担任何责任。我假定您已经阅读了以上须知!

前言

好朋友要写一份python大作业,300行,做什么小demo都可以。还记的大一的时候刚学C和C++也没见过哈希表(python的字典)那么高级的结构,那会就利用key-value写个翻译软件,不过那会要自己输入一个英文单词在对应一个翻译,写了十个单词,觉得不能做打字员啊,打出来那么多单词岂不是要累死了?那会也不知道C++有那么高级的结构,当时的我还在感叹python牛逼。过了大一的暑假基本上再也没有写过python了。平常基本是不使用python,都是用C++写代码的。朋友找到我之后我在想我应该做什么呢?如果拿python做个QQ那就没有意思了呀,以前已经做过了,那我做点什么好呢?突然想到了很火的爬虫技术,正好也没学过,干脆就现学现卖写个爬虫吧。想到了当年的翻译软件,那咱爬下百度翻译吧!

在B站找的视频差不多学了1个多小时就开始上手写了。我看的B站视频:课程链接

我用到的爬虫应该是皮毛中皮毛,这篇博客是面向小白的,但学习过其他编程语言,且对爬虫技术一无所知(像我这样的)

初识百度翻译爬虫

我用的爬虫很简单,只需要一个url(要获取的资源),一个你要查询的单词,一个headers。
如果要爬取百度翻译,就是这个url,直接复制即可,查询的单词,用下input即可。重点讲下这个headers

	post_url = 'https://fanyi.baidu.com/sug'

首先打开搜狗浏览器这个网页获取自己的User-Agent,进行爬虫的伪装,按住F12出现这个界面,然后刷新下页面
用python做一个翻译软件,基于简单爬虫和网络编程
用python做一个翻译软件,基于简单爬虫和网络编程
获取User-Agent,这个是反爬虫技术,因为一般服务器都会有相应反爬措施,加上这个就相当于真实模拟一个客户了,服务器就不会过滤你了。
知道这些了之后就可以上代码了,如果是VS下写的python,要在VS的命令行中下载requests,在cmd下载也调用不到
用python做一个翻译软件,基于简单爬虫和网络编程
用python做一个翻译软件,基于简单爬虫和网络编程
用python做一个翻译软件,基于简单爬虫和网络编程
然后输入pip install requests

完整代码如下:

import requests
import json


if __name__ == '__main__':
	post_url = 'https://fanyi.baidu.com/sug'
	# User-Agent 伪装
	headers ={
		'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3823.400 QQBrowser/10.7.4307.400'
	}
while 1 :
	word = input('Please enter the word you want to query :')
	if(word == 'q'):
		break
	data = {
		'kw' : word
	}

	response = requests.post(url = post_url, data = data,headers = headers)

	json_data = response.json()
	# 判断一下类型
	# print(type(json_data))
	data_list = json_data.get('data')# 不是上面的data的意思,是request的data
	# print(type(data_list))
	if not data_list:
		print("未找到该单词,建议您重新输入")
	for item in data_list:
		print(item['k'], '---', item['v'])

用python做一个翻译软件,基于简单爬虫和网络编程
还不错哦

基于C/S的模型的爬虫服务器

socket网络编程真不是三言两语能说完的,读这里需要有一些网络编程的知识。python好用、简洁正是因为有前人做好了库,我当然也学学新的技术啦没有再造*,参考官方的文档,这代码真简短python官方文档,把官网的代码扒了下来大概改一改,结合了自己的爬虫,全部代码如***释很详细,毕竟要凑到300行…python真难凑行数。最低下的mask应该是错误的标识,只要有问题那里就报错(这个是我个人猜测的哈)
后面会介绍一下我写python遇到的问题!

import requests
import selectors
import socket
import json

sel = selectors.DefaultSelector()
def selectWord(word):
    post_url = 'https://fanyi.baidu.com/sug'
	# 爬虫头部的 User-Agent 伪装
    headers ={
		'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3823.400 QQBrowser/10.7.4307.400'
    }
    # queryWord = word.decode() 
    # print(type(queryWord))
    
    # 这一步要消除多余的空格,花费了2个小时排查

    # queryWord = queryWord.strip()

    # word2 = input('input word euqals word:')
    word = word.strip()
    """
    if queryWord == word2:
        print('equals')
    else:
        print('no euqals')
        return 
    """
    data = {
		'kw' : word
	}
    #print(word % "word type " % type(word))
    response = requests.post(url = post_url, data = data,headers = headers)

    json_data = response.json()
    data_list = json_data.get('data')# 不是上面的data的意思,是request的data
    if not data_list:
        print("未找到该单词,建议您重新输入")
        return 
    #for item in data_list:
       # print(item['k'], '---', item['v'])
    return data_list




def accept(serverSock, mask):
    print('有新的连接加入!')
    conn, addr = serverSock.accept()  # Should be ready
    
    conn.setblocking(False)

    # 把新添加的客户端的套接字加进来,read为回调函数
    sel.register(conn, selectors.EVENT_READ, read)



def read(conn, mask):
    
    # data通过print(type(data))可以知道是bytes类型,需要解码
    # decode来变成python中的str类型

    data = conn.recv(1000)  
    if data:
         queryWord = data.decode()
         if queryWord == '\r\n':
            # print("检测到换行")
             return
         # 把单词传进去

         data_list = selectWord(word = queryWord)
         if not data_list:
                clientMsg = '未找到该单词,建议您重新输入'
                conn.send(clientMsg.encode('utf-8'))
                return 
         print(queryWord)


         for item in data_list:
             clientMsg = item['k'] + '---' + item['v']
             conn.send(clientMsg.encode('utf-8'))
             
         #print(clientMsg)
    # data为0,说明没有数据,关闭套接字即可
    
    else:
        print('closing', conn)

        # 该连接直接踢掉

        sel.unregister(conn)


        conn.close()


if __name__=="__main__":


    serverSock = socket.socket()

    # 设置为非阻塞套接字
    serverSock.setblocking(False)

    serverSock.bind(('192.168.8.112', 9996))

    # 监听的个数,内核有一个队列来维持,TCP三次握手之后进入该队列
    # 等待服务器的处理,一般不用设置很大的值,因为会处理的很快
    serverSock.listen(64)

    sel.register(serverSock, selectors.EVENT_READ, accept)

    print("服务器启动成功")
    while True:
        events = sel.select()
    
        # print(type(mask)) mask 是 int类型

        for key, mask in events:
            callback = key.data
            callback(key.fileobj, mask)

用python做一个翻译软件,基于简单爬虫和网络编程

写这个python的demo遇见的问题

1、字符串的比较

python的网编编程是要从byte转成字符串,是’\r\n’结尾。我一开始也不知道啊。结果爬虫一直失败,感觉是转换转的有问题,后来比较一下字符串,客户端传来的是hello,在服务端这边我自己人工手动输值判断值是否相等,发现怎么都不相等,百度一下,竟然有人说是编码格式不统一,我第一个想法就是,我靠?英文都讲究编码格式了?我一直想不明白这是为啥,因为一个是输入端输入的,一直是解码解出来的,输出的值都是hello并无肉眼上的差异,这个问题困扰了我一个多小时。后来查阅博客,抱着试一试的心态使用strip这个函数,奇迹发生了,好使了哈哈哈哈哈。
下面模拟一下场景吧,不加strip的情况,果然不相等
用python做一个翻译软件,基于简单爬虫和网络编程
加上之后,果然相等了。
用python做一个翻译软件,基于简单爬虫和网络编程

2、不知道变量名的类型

这个我是真佩服写python的大佬们,这个类型真的是要一个一个type()来查看类型,不然根本看不懂啊

3、真的要控制好缩进

写python缩进不控制好真是要你的命啊