admin管理员组文章数量:1583045
Python 搜狗词库的批量下载
简介
搜狗的细胞词库是一个开放共享的词库,其中集结了众多网友提交的词语信息,从搜狗细胞词库的首页的最新数据来看,有 19520 个网友创建了 27695 个词库共 48482247 个词条。当然我下载过来后也没有去统计是否有这么多个词条。有兴趣的朋友可以试试。接下来简单的讲解一下如何批量的下载搜狗词库。(看了一下,下载来的好像没有那么多),本文为分析我的思路,完整程序请去:https://download.csdn/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" + 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" + 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" + 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" + 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 = repile(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 = repile(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/download/q_quanting/10666339
希望对大家有所帮助!:-)
值得一提的是,从搜狗下载的文件格式为.scel,如果要需要转化为txt格式还需要自行转化。不过我也提供了转化函数,下载链接如下:
https://download.csdn/download/q_quanting/10622066
版权声明:本文标题:Python 搜狗词库的批量下载 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/dianzi/1727910073a1137764.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论