引言

最近在学习Python爬虫,这里推荐一个入门爬虫的博客系列
https://github.com/Ehco1996/Python-crawler
博主写的对新手很友好,很适合入门。

我写这篇文章的目的是记录一下在学习他的
搜狗词库抓取&解析 中遇到的问题。

思路

和原文不同的是,我是采用Scrapy实现,并且考虑到后面对词库关键词的解析不属于爬虫,所有我就只实现了搜狗词库爬取,没有做解析。另外原文中cate表只是作为中转,我就没有存储,所以我只建了一个表detail。

  1. 建表detail,字段url、filename、cate1、cate2、create_time
  2. 从初始url中解析全部一级分类url,再从一级分类url中解析二级分类url
  3. 从二级分类url中解析出每一个二级分类的页数,将二级分类url和每一个二级分类的页数拼接成新的url,再从新的url中解析出下载地址和标题
  4. 将下载地址、标题、一级分类和二级分类一并存入detail表
  5. 从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 搜狗词库爬虫相关推荐

  1. 搜狗词库爬虫(2):基础爬虫框架的运行流程

    系列目录: 搜狗词库爬虫(1):基础爬虫架构和爬取词库分类 项目Github地址:github.com/padluo/sogo- 各模块对应的内容如下: getCategory.py,提取词库分类ID ...

  2. 搜狗词库爬虫(1):基础爬虫架构和爬取词库分类

    基础爬虫架构 基础爬虫框架主要包括五大模块:爬虫调度器.URL管理器.网页下载器.网页解析器.数据存储器. 爬虫调度器:启动.执行.停止爬虫,统筹其他模块的协调工作. URL管理器:管理已爬取的URL ...

  3. visual studio输入法打不了中文_目前比较满意的手机输入法方案:Gboard + 搜狗词库...

    输入法是手机必备的APP了,选择一款好的输入法能提高你的文字输入体验,雷锋哥从最开始用的是「谷歌拼音」简洁 UI 界面,支持 "滑行输入" 方式,用手指滑动键盘打字,比一个一个点击 ...

  4. PHP高性能输出UNICODE正则汉字列表 汉字转拼音多音字解决方案 搜索引擎分词细胞词库更新 搜狗词库提取TXT...

    为什么80%的码农都做不了架构师?>>>    目前现状 汉字转拼音 难度大就大在 多音字!行业上较准确的是基于词语.成语的识别.搜狗有1万多词库 每个词库又很大: 比如: 了 我们 ...

  5. 爬取词库,使用jieba分词库,自定义dict.txt文件+将搜狗词库.scel文件为.txt文件

    一:爬取词库,使用jieba分词库,自定义dict.txt文件 import jiebafrom urllib.request import urlopen from bs4 import Beaut ...

  6. python读取文本两个数字的成语_只要2步!将搜狗词库(scel)转为Python可读的文本...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 将搜狗词库(scel)转化为python可读的文本(text)的方法方法 1. 利用R语言(方法简单) ① 载入词库(R语言) library(Rword ...

  7. Python:文本分析必备—搜狗词库

    全文阅读:Python:文本分析必备-搜狗词库| 连享会主页 目录 1. 引言 2. 词典的妙用 3. 搜狗词库的下载 3.1 抓取12个页面链接 3.2 爬取所有词库名称和下载链接 3.3 下载细胞 ...

  8. ibus添加搜狗词库

    安装方法:http://forum.ubuntu.org.cn/viewtopic.php?f=8&t=252407 词库地址:http://code.google.com/p/hslinux ...

  9. 搜狗词库scel格式转为txt格式(python3版本)

    1.想用搜狗的词库来辅助jieba分词,需要把词库从scel转成txt格式. 在网上找到了大神的python2版本,https://blog.csdn.net/zhangzhenhu/article/ ...

最新文章

  1. r语言 col_R语言代码相关疑问标准提问
  2. 基于百度地图的python开发服务端_python编程之API入门: (一)使用百度地图API查地理坐标...
  3. 初识java_初识java
  4. 引起SQL数据库超时的问题分析及解决办法
  5. Day7 - 面向对象编程进阶及其他相关
  6. NC7-买卖股票的最好时机
  7. systemd管理mysql多实例_使用 systemd 配置多个 MySQL 8.0 实例
  8. 如何使用Visual Studio创建SQL Server数据库项目
  9. SQL COALESCE函数和NULL
  10. python写机器人程序_从Python写入机器人框架控制台
  11. 内存中的fas和lsp
  12. 身份证号码归属地数据库 身份证具体信息查询服务
  13. Unity Shader 一 激光特效Shader
  14. 输入某年某月某日java_java输入某年某月某日
  15. 【小白转型项目经理】实战案例14,总价合同如何向甲方申请其他费用补偿?
  16. UVa 10603 - Fille
  17. 超好看的樱花飘落网络科技官网源码
  18. 042-16 Backup and Recovery备份与恢复(前3种备份方式)
  19. 企业网络信息化建设解决方案
  20. Flutter时间轴-首个

热门文章

  1. PTA 7-2 发奖金
  2. C++JZ83 剪绳子(进阶版)
  3. 如何用FPGA输出正弦波、三角波等
  4. 微信小程序动态获取时间
  5. linux和window时间不一致,linux时间与Windows时间不一致的解决
  6. python函数参数传递的两种方式_Python函数的参数传递方式
  7. python参数传递是值传递还是引用传递
  8. css table表格相关设置和属性
  9. switch接受的参数类型
  10. 懒散的态度就是一剂慢性毒药——《我是一只IT小小鸟》读后感(第四周)