用python做一个翻译软件,基于简单爬虫和网络编程
声明:我爬取的是百度翻译,然后利用自己熟悉的领域(网络编程)简易封装了一个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出现这个界面,然后刷新下页面
获取User-Agent,这个是反爬虫技术,因为一般服务器都会有相应反爬措施,加上这个就相当于真实模拟一个客户了,服务器就不会过滤你了。
知道这些了之后就可以上代码了,如果是VS下写的python,要在VS的命令行中下载requests,在cmd下载也调用不到
然后输入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'])
还不错哦
基于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的demo遇见的问题
1、字符串的比较
python的网编编程是要从byte转成字符串,是’\r\n’结尾。我一开始也不知道啊。结果爬虫一直失败,感觉是转换转的有问题,后来比较一下字符串,客户端传来的是hello,在服务端这边我自己人工手动输值判断值是否相等,发现怎么都不相等,百度一下,竟然有人说是编码格式不统一,我第一个想法就是,我靠?英文都讲究编码格式了?我一直想不明白这是为啥,因为一个是输入端输入的,一直是解码解出来的,输出的值都是hello并无肉眼上的差异,这个问题困扰了我一个多小时。后来查阅博客,抱着试一试的心态使用strip这个函数,奇迹发生了,好使了哈哈哈哈哈。
下面模拟一下场景吧,不加strip的情况,果然不相等
加上之后,果然相等了。
2、不知道变量名的类型
这个我是真佩服写python的大佬们,这个类型真的是要一个一个type()来查看类型,不然根本看不懂啊
3、真的要控制好缩进
写python缩进不控制好真是要你的命啊