jtyoui.sogou 源代码

#!/usr/bin/python3.7
# -*- coding: utf-8 -*-
# @Time : 2019/1/24 0024
# @Email : jtyoui@qq.com
# @Software : PyCharm
import requests
from jtyoui.web import random
from urllib.parse import quote
import re
import struct

"""
    爬取搜狗只需要三步:
    第一步:搜索关键字。爬取关键字的下载链接
    第二步:筛选下载链接,进行下载
    第三步:将下载的搜狗文件转化为UTF-8格式
"""


[文档]class SoGou: def __init__(self, search): """初始化,也就是模糊搜索的第一步 :param search: 关键字 """ self.header = {'User-Agent': random()} # 设置UA # 将中文字转化为URL链接。注意搜狗将中文字进行的GBK编码。而不是UTF-8 url_word = quote(search.encode('GBK')) url = 'https://pinyin.sogou.com/dict/search/search_list/%s/normal/' % url_word # 搜索链接 response = requests.get(url=url, headers=self.header) match = re.findall(url[24:] + '(.{1,3})">', response.text) # 匹配下载页数 max_page = max(map(lambda x: int(x), match)) if match else 1 # 选取最大的页数,如果没有页数返回1 m = [] # 将匹配到下载链接 for page in range(1, max_page + 1): response = requests.get(url=url + str(page), headers=self.header) match = re.findall(r'id=(.+)&name=(.+)"', response.text) # 匹配下载链接 m.extend(match) # 将匹配到的下载链接装到链表中 load_url = 'https://pinyin.sogou.com/d/dict/download_cell.php?id={0}&name={1}' # 下载链接的格式 # 将匹配到的,名字和ID映射到下载链接格式中 self.load_url = map(lambda x: load_url.format(x[0], x[1]), m)
[文档] def load_word(self, url_word=None): """下载搜狗文件 :param url_word: 下载链接 :return: 转化好的搜狗文件。返回格式的链表 """ load_ls = dict() # 字典的键是下载词库的名字。字典的值是词库的内容 if not url_word: for u in self.load_url: name = u[u.rfind('=') + 1:] # 获取词库的名字 response = requests.get(url=u, headers=self.header) ls = to_txt(response.content) # 将其转化为UTF-8格式 load_ls[name] = ls else: name = url_word[url_word.rfind('=') + 1:] response = requests.get(url=url_word, headers=self.header) load_ls[name] = to_txt(response.content) return load_ls # 返回字典
[文档]def to_txt(data): """转写搜狗文件格式""" ls_word = [] # 转化搜狗为UTF-8格式内容 w = '' # 每一个词条 for i in range(0, len(data), 2): x = data[i:i + 2] # 搜狗的UTF-8编码是两个字节 t = struct.unpack('H', x)[0] # 将其转化为无符号的短整形 if 19968 < t < 40959 or t == 10: # 判断是否是中文字符。10表示的是换行 if t != 10: # 不换行放在单个词条 w += chr(t) elif t == 10 and len(w): # 换行且不等于空 ls_word.append(w) w = '' return ls_word[1:] # 第一行是注释。不需要,去除第一行
if __name__ == '__main__': sg = SoGou('动物词汇大全【官方推荐】') # 获取搜索关键字下的词库 for s in sg.load_url: # 遍历关键字下的URL txt = sg.load_word(s) # 下载 print(txt) # 打印