Scrapy 搜狗词库爬虫
引言
最近在学习Python爬虫,这里推荐一个入门爬虫的博客系列
https://github.com/Ehco1996/Python-crawler
博主写的对新手很友好,很适合入门。
我写这篇文章的目的是记录一下在学习他的
搜狗词库抓取&解析 中遇到的问题。
思路
和原文不同的是,我是采用Scrapy实现,并且考虑到后面对词库关键词的解析不属于爬虫,所有我就只实现了搜狗词库爬取,没有做解析。另外原文中cate表只是作为中转,我就没有存储,所以我只建了一个表detail。
- 建表detail,字段url、filename、cate1、cate2、create_time
- 从初始url中解析全部一级分类url,再从一级分类url中解析二级分类url
- 从二级分类url中解析出每一个二级分类的页数,将二级分类url和每一个二级分类的页数拼接成新的url,再从新的url中解析出下载地址和标题
- 将下载地址、标题、一级分类和二级分类一并存入detail表
- 从detail表中取出所有下载地址,下载文件到本地
问题
1. 一级分类标题文字为图片形式,获取不到
分析搜狗词库发现,它的一级分类里的文字是图片中的文字,爬取不到。没办法,只能写成固定的常量列表了,还好一级分类应该不会变动。
2. 下载地址太长,写不进数据库
下载地址保存到Mysql时报错 1406, “Data too long for column ‘url’ at row 1”
参考如下文章解决
mysql报错:1406, "Data too long for column
3. 文件下载
项目里还涉及到文件下载,查资料了解到scrapy的文件下载是通过FilesPipeline实现的
下载及处理文件和图片
官方文档说的很详细,需要注意的有三点
(1) get_media_requests()在不重写的情况下,处理的url固定为item[‘file_urls’],且要求传递过来的为一系列url列表。所以没有其他要求的话,直接在item中定义该字段,pipeline中创建类继承下FilesPipeline即可。
本项目中传递的url为单个string,不是列表,所以重写了该方法
(2) 下载的默认文件名为文件的SHA1值,需要重命名。查看文档发现file_path()返回文件的绝对路径,需要在这里将文件重命名,但是这个方法里并没有item参数,如何拿到filename呢?
仔细看file_path()参数里有一个request,这个request就是get_media_requests()里返回的,只需要将filename给request的meta即可
(3) 注意setting里的FILES_STORE为绝对路径。这是文件的下载目录,需要设为绝对路径
具体代码如下:
class SogouWordFilePipeline(FilesPipeline): # 下载文件def get_media_requests(self, item, info):# 该方法不重写的话为:# for file_url in item['file_urls']:# yield scrapy.Request(file_url)# 即如果item中定义了file_urls字段,且有使用FilesPipeline的类,该字段自动进入FilesPipeline中处理# 但是要求item['file_urls']为列表,我这里的下载url不是列表而且需要处理文件名问题,所以就重写了一下yield scrapy.Request(item['url'], meta={'filename': item['filename']})def item_completed(self, results, item, info): # 下载完成时调用file_paths = [x['path'] for ok, x in results if ok]if not file_paths:print('下载失败')raise DropItem("Item contains no files")# item['file_paths'] = file_pathsprint('下载成功')return itemdef file_path(self, request, response=None, info=None): # 文件名filename = request.meta['filename'] # 这里request的meta来自get_media_requests()basedir = os.getcwd()download_dir = os.path.join(basedir, 'download')path = os.path.join(download_dir, filename + '.scel')return path
总结
利用scrapy框架的好处就是不用自己考虑多线程的问题了,而且也有专门的日志记录,所以框架是挺方便的。
下篇文章讲讲python里的多线程问题。
项目地址
https://github.com/AmazingUU/Scrapy-sogou_spider
上面是项目地址,觉得还可以的话,给个star哦
Scrapy 搜狗词库爬虫相关推荐
- 搜狗词库爬虫(2):基础爬虫框架的运行流程
系列目录: 搜狗词库爬虫(1):基础爬虫架构和爬取词库分类 项目Github地址:github.com/padluo/sogo- 各模块对应的内容如下: getCategory.py,提取词库分类ID ...
- 搜狗词库爬虫(1):基础爬虫架构和爬取词库分类
基础爬虫架构 基础爬虫框架主要包括五大模块:爬虫调度器.URL管理器.网页下载器.网页解析器.数据存储器. 爬虫调度器:启动.执行.停止爬虫,统筹其他模块的协调工作. URL管理器:管理已爬取的URL ...
- visual studio输入法打不了中文_目前比较满意的手机输入法方案:Gboard + 搜狗词库...
输入法是手机必备的APP了,选择一款好的输入法能提高你的文字输入体验,雷锋哥从最开始用的是「谷歌拼音」简洁 UI 界面,支持 "滑行输入" 方式,用手指滑动键盘打字,比一个一个点击 ...
- PHP高性能输出UNICODE正则汉字列表 汉字转拼音多音字解决方案 搜索引擎分词细胞词库更新 搜狗词库提取TXT...
为什么80%的码农都做不了架构师?>>> 目前现状 汉字转拼音 难度大就大在 多音字!行业上较准确的是基于词语.成语的识别.搜狗有1万多词库 每个词库又很大: 比如: 了 我们 ...
- 爬取词库,使用jieba分词库,自定义dict.txt文件+将搜狗词库.scel文件为.txt文件
一:爬取词库,使用jieba分词库,自定义dict.txt文件 import jiebafrom urllib.request import urlopen from bs4 import Beaut ...
- python读取文本两个数字的成语_只要2步!将搜狗词库(scel)转为Python可读的文本...
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 将搜狗词库(scel)转化为python可读的文本(text)的方法方法 1. 利用R语言(方法简单) ① 载入词库(R语言) library(Rword ...
- Python:文本分析必备—搜狗词库
全文阅读:Python:文本分析必备-搜狗词库| 连享会主页 目录 1. 引言 2. 词典的妙用 3. 搜狗词库的下载 3.1 抓取12个页面链接 3.2 爬取所有词库名称和下载链接 3.3 下载细胞 ...
- ibus添加搜狗词库
安装方法:http://forum.ubuntu.org.cn/viewtopic.php?f=8&t=252407 词库地址:http://code.google.com/p/hslinux ...
- 搜狗词库scel格式转为txt格式(python3版本)
1.想用搜狗的词库来辅助jieba分词,需要把词库从scel转成txt格式. 在网上找到了大神的python2版本,https://blog.csdn.net/zhangzhenhu/article/ ...
最新文章
- r语言 col_R语言代码相关疑问标准提问
- 基于百度地图的python开发服务端_python编程之API入门: (一)使用百度地图API查地理坐标...
- 初识java_初识java
- 引起SQL数据库超时的问题分析及解决办法
- Day7 - 面向对象编程进阶及其他相关
- NC7-买卖股票的最好时机
- systemd管理mysql多实例_使用 systemd 配置多个 MySQL 8.0 实例
- 如何使用Visual Studio创建SQL Server数据库项目
- SQL COALESCE函数和NULL
- python写机器人程序_从Python写入机器人框架控制台
- 内存中的fas和lsp
- 身份证号码归属地数据库 身份证具体信息查询服务
- Unity Shader 一 激光特效Shader
- 输入某年某月某日java_java输入某年某月某日
- 【小白转型项目经理】实战案例14,总价合同如何向甲方申请其他费用补偿?
- UVa 10603 - Fille
- 超好看的樱花飘落网络科技官网源码
- 042-16 Backup and Recovery备份与恢复(前3种备份方式)
- 企业网络信息化建设解决方案
- Flutter时间轴-首个