Python 搜狗词库的批量下载

版权声明:转载请声明原作者并请附带本文链接,谢谢合作! https://blog.csdn.net/Q_QuanTing/article/details/82698229

Python 搜狗词库的批量下载


简介

搜狗的细胞词库是一个开放共享的词库,其中集结了众多网友提交的词语信息,从搜狗细胞词库的首页的最新数据来看,有 19520 个网友创建了 27695 个词库共 48482247 个词条。当然我下载过来后也没有去统计是否有这么多个词条。有兴趣的朋友可以试试。接下来简单的讲解一下如何批量的下载搜狗词库。(看了一下,下载来的好像没有那么多),本文为分析我的思路,完整程序请去:https://download.csdn.net/download/q_quanting/10570293

Python实现思路

1. 获取大分类列表

首先,我们先去观察搜狗细胞词库的网站,如下图所示:

在首页中就有词库的分类,这么一来,问题就转化为下载每个分类下的词库了。随便选择一个词库,点击进入观察(我选第一个),如下图所示:

在这里我们发现来搜狗细胞词库的十二个大分类:

‘城市信息’, ‘自然科学’, ‘社会科学’, ‘工程应用’, ‘农林渔畜’, ‘医学医药’,’电子游戏’, ‘艺术设计’, ‘生活百科’, ‘运动休闲’, ‘人文科学’, ‘娱乐休闲’

编写一个函数:

    def get_cate_1_list(res_html):
    # 获取大分类链接
        dict_cate_1_urls = []
        soup = BeautifulSoup(res_html, "html.parser")
        dict_nav = soup.find("div", id="dict_nav_list")
        dict_nav_lists = dict_nav.find_all("a")
        for dict_nav_list in dict_nav_lists:
            dict_nav_url = "https://pinyin.sogou.com" + dict_nav_list['href']
            dict_cate_1_urls.append(dict_nav_url)
        return dict_cate_1_urls

向该函数传入上面页面的源码,我们能够解析出十二个大分类的对应的链接地址。

2. 获取小分类字典

通过分析观察,我们能够发现“城市信息”分类下的小分类和其他十一个分类下的小分类是有点不一样的,如下图所示:

因此,在这里我们要写两种解析获取小分类的方法:

 def get_cate_2_1_list(res_html):
    # 获取第一种小分类链接
    dict_cate_2_1_dict = {}
    soup = BeautifulSoup(res_html, "html.parser")
    dict_td_lists = soup.find_all("div", class_="cate_no_child citylistcate no_select")
    for dict_td_list in dict_td_lists:
        dict_td_url = "https://pinyin.sogou.com" + dict_td_list.a['href']
        dict_cate_2_1_dict[dict_td_list.get_text().replace("\n", "")] = dict_td_url
    return dict_cate_2_1_dict

def get_cate_2_2_list(res_html):
    # 获取第二种小分类链接
    dict_cate_2_2_dict = {}
    soup = BeautifulSoup(res_html, "html.parser")
    dict_td_lists = soup.find_all("div", class_="cate_no_child no_select")
    # 类型1解析
    for dict_td_list in dict_td_lists:
        dict_td_url = "https://pinyin.sogou.com" + dict_td_list.a['href']
        dict_cate_2_2_dict[dict_td_list.get_text().replace("\n", "")] = dict_td_url
    # 类型2解析
    dict_td_lists = soup.find_all("div", class_="cate_has_child no_select")
    for dict_td_list in dict_td_lists:
        dict_td_url = "https://pinyin.sogou.com" + dict_td_list.a['href']
        dict_cate_2_2_dict[dict_td_list.get_text().replace("\n", "")] = dict_td_url
    return dict_cate_2_2_dict

其中,你会发现为啥在第二个函数中还有两个类型呢?这里的原因是,有部分小分类还有自己的小小分类。有些有,有些没有,这就导致了存在两种类型的小分类,需要分别解析。

3. 获取小分类下页码数

当我们获取小分类的页面后,会观察到不同的分类有不同的页数,因此,为了能够让我们的爬虫知道有多少个页面需要爬取。在此,我们需要获取小分类的页码数。

具体实现如下:

    def get_page(res_html):
        # 页数
        soup = BeautifulSoup(res_html, "html.parser")
        dict_div_lists = soup.find("div", id="dict_page_list")
        dict_td_lists = dict_div_lists.find_all("a")
        page = dict_td_lists[-2].string
        return int(page)

4. 获取下载链接

对每个页面进行爬取的时候,需要去获取页面中的所有的下载链接,用于后期的下载。

具体实现如下:

    def get_download_list(res_html):
    # 获取当前页面的下载链接
        dict_dl_dict = {}
        pattern = re.compile(r'name=(.*)')
        soup = BeautifulSoup(res_html, "html.parser")
        dict_dl_lists = soup.find_all("div", class_="dict_dl_btn")
        for dict_dl_list in dict_dl_lists:
            dict_dl_url = dict_dl_list.a['href']
            dict_name = pattern.findall(dict_dl_url)[0]
            dict_ch_name = unquote(dict_name, 'utf-8').replace("/", "-").replace(",", "-").replace("|", "-")\
                .replace("\\", "-").replace("'", "-")
            dict_dl_dict[dict_ch_name] = dict_dl_url
        return dict_dl_dict

5. 下载词库

这个就函数就没什么好说的了,就是对上面那个函数获取的下载链接进行下载,并保存到相应的路径下。

def download_dict(dl_url, path):
    # 下载
    res = requests.get(dl_url, headers=headers, timeout=5)
    with open(path, "wb") as fw:
        fw.write(res.content)

6. 获取页面函数

在上面的函数去都是页面解析函数,这里我贴上一个我的获取页面函数:

def get_html(self, open_proxy=False, ip_proxies=None):
    try:
        pattern = re.compile(r'//(.*?)/')
        host_url = pattern.findall(self.url)[0]
        SougouSpider.headers["Host"] = host_url
        if open_proxy:  # 判断是否开启代理
            proxies = {"http": "http://" + ip_proxies, }  # 设置代理,例如{"http": "http://103.109.58.242:8080", }
            SougouSpider.res = requests.get(self.url, headers=SougouSpider.headers, proxies=proxies, timeout=5)
        else:
            SougouSpider.res = requests.get(self.url, headers=SougouSpider.headers, timeout=5)
        SougouSpider.res.encoding = SougouSpider.res.apparent_encoding  # 自动确定html编码
        print("Html页面获取成功 " + self.url)
        return SougouSpider.res      # 只返回页面的源码
    except Exception as e:
        print("Html页面获取失败 " + self.url)
        print(e)

当然这个函数是我从一个类里直接拖出来的。你们也可以用自己的页面获取函数。

最后

实现效果:

本文主要提供思路介绍和页面解析。

完整程序,欢迎下载

我的csdn资源:https://download.csdn.net/download/q_quanting/10666339

希望对大家有所帮助!:-)

值得一提的是,从搜狗下载的文件格式为.scel,如果要需要转化为txt格式还需要自行转化。不过我也提供了转化函数,下载链接如下:

https://download.csdn.net/download/q_quanting/10622066

猜你喜欢

转载自blog.csdn.net/Q_QuanTing/article/details/82698229