前段时间帮同学写了一个爬虫类的工作。这是我第一次对比较大型的网站进行抓取工作。
由于我缺乏经验,上手时直接使用 scrapy + xpath,程序跳转结构不合理,缺乏数据建模,浪费了很多时间。我现在对scrapy的评价是“永远不要用scrapy,除非你已经用它来干了太多活了”。路径依赖,你懂。
事实上,如果不需要进行全站遍历,对于抓取的url 格式结构化的网站(如固定url+整数序列),使用其他非框架会比较灵活。例如 Request + BeautifulSoup。
scrapy 的好处是帮你处理了一些错误和 cookies,但是相对而言你需要让自己适应它的思考方式。
这篇文章对于 Scrapy 和其他工具的介绍就不缵述。不过,我在文末列了比较详细的参考文件,基本上能够让人从全局上对要解决的问题有了解,算是对过去项目的总结吧。
具体用到的工具有:
1. Chrome 开发者模式,可以查看大多数返回信息
2. Redis,用于网站url去重存储
3. Requests,用于抓取、保存,测试页面样本
4. Free-proxy 列表,用于使用代理
5. UA 列表,自动切换UA
6. Re, xpath, css, BeautifulSoup 各种页面选择器,处理文本(lxml 是 scrapy之外的库)
7. Postgresql,用于保存数据 |sqlite, mysql, mangodb等其他数据库国内更常见
8. Sqlalchemy,用于搭建表结构
9. pyweb,用于查看现成数据
1. 安装时遇到的问题:
1.1. scrapy 需要 python 2.7, bs4 需要 python 3 -> scrapy + xpath #bs4支持2.7,谢推油[1]
1.2. postgresql 无法用 pip 在 mac 安装 -> 使用 brew
1.3. brew 和 github 在国内很慢 -> 替换中科大/清华源
2. 运行中遇到的小白问题
2.1. 403错误 - 替换随机UA,使用proxy
2.2. psql 无法启动 - creat user / db
2.3. psql 无法停止 - unload plist
2.4. reds 关闭后端口被占用 - kill bash
2.5. multi-relationship - _id 自动生成为显示项, 1-1键添加uselist = False, multi - multi 关系有维护 secondary 和 新建 Class 两种方式
2.6. 添加relationship 后无法更新原数据项 - 好像是因为默认会制止更新行为,有什么配置,这个问题本来就不该存在,尚未解决
2.7. proxy 太慢 - 不用 proxy
2.8. scrapy 无法控制和暂停 - 通过监测外部文件内容暂停
2.9. sql merge 的时候 duplicate key : rollback - 保存记录
2.10. 特殊字符和中文字符截取 - 避免程序显式使用中文字符串, 采用位数截取 设置编码 utf-8
通过以上痛苦的过程,这里把我总结出来的爬虫正确工作流程写作如下[YOLO]:
1. 节约时间的工作
1.1. 确定抓取目标
1.2. 确定网站是否有现成api可以使用
2. 确定需要抓取的数据
2.1. 确定数据项
2.2. 确定数据的储存模式和格式
2.3. 确定数据的储存内部结构
2.4. 写作数据模型
3. URL和程序结构
3.1. 生成url获取逻辑
3.2. 生成url跳转逻辑
3.3. 维护url去重表和逻辑
4. 预处理
4.1. 确定网站是否需要登陆/保存Cookies
4.2. 确定网站是否具有反爬功能
4.3. 确定是否需要JS等工具
5. 框架-开写
5.1. 写作跳转逻辑和子页面处理程序框架
5.2. 流程按照 跳转结构-去重-抓取-清洗-保存
6. 页面梳理
6.1. 抓取样本页面并保存
6.2. 确定需要抓取的数据可得性,选择选择器
6.3. 写作选择语句,程序主要部分
7. 数据处理
7.1. 对于选择出来的数据,写作过滤和整合语句
7.2. 确定保存数据方式
7.3. 对于保存数据的内部联系进行处理
8. 测试和抓取
8.1. 对页面进行抓取和跳转测试
8.2. 错误和异常处理
8.3. 开始抓取
9. 回测
9.1. 控制抓取频率在安全范围
9.2. 在月黑风高夜完成抓取
9.3. 起床
1. 让mac 发出声音: print ‘\a’
2. 对于item和url错误分别处理
3. drop NoneType (但是一般是其他部分出问题的表现)
4. sql 直接用 foreign 键键名会变成字符串 : isforeign
5. 使用字典传递数据给sql: ItemClass(**dict)
6. 使用数据库比较闲,其实Json csv 什么的很够
7. 其实python的并发我没有很好地学习,欢迎提供参考资料
8. 再也不写爬虫了
$抓取:
Python
[Coursera : Programming for Everybody]
#教材Python for Informatics 很适合新手对采集有初步了解
#非零基础者,课程不一定要上。完全为数据抓取量身定做的教材
https://www.coursera.org/course/pythonlearn/
[正则表达式30分钟入门教程]
#正则经典
http://deerchao.net/tutorials/regex/regex.htm
Scrapy
[scrapy轻松定制网络爬虫]
#爬虫总论 - 此文写于2009年[2] 不过可以一窥scrapy架构
http://blog.pluskid.org/?p=366
[使用python,scrapy写(定制)爬虫的经验,资料,杂。]
#爬虫界的Review
http://my.oschina.net/u/1024140/blog/188154?fromerr=9gGbdN5J
[Scrapy与callback]
#Scrapy异步模式 引文极好
http://www.jianshu.com/p/c78bb4df3a49
[Python的网页爬虫&文本处理&科学计&机器学习&数据挖掘工具集]
#超过爬虫范围的引文
http://www.open-open.com/lib/view/open1406617515640.html
Redis
[使用Redis和SQLAlchemy对Scrapy Item去重并存储]
#copy + paste
http://wuchong.me/blog/2015/05/22/using-redis-and-sqlalchemy-to-checkd-dup-and-store-scrapy-item/
$数据库:
SQLAlchemy
[Relationship]
http://docs.sqlalchemy.org/en/rel_1_0/orm/basic_relationships.html
[模型声明 - CH]
#上文翻译版本
http://docs.jinkan.org/docs/flask-sqlalchemy/models.html
[SQLAlchemy 几种查询方式总结]
#非SQL查询方式的速查手册
http://my.oschina.net/freegeek/blog/222725?fromerr=8TXAqDKJ
psycopg2
[Mac 下 PostgreSQL 的安装与使用]
#基本操作
http://www.cnblogs.com/shineqiujuan/p/4703304.html
[试用PostgreSQL+psycopg2+SQLAlchemy]
#启动如有问题可以参考
http://my.oschina.net/quanpower/blog/203500?fromerr=JgTP0ime
pgweb
[Doc & Installation]
#github
https://github.com/sosedoff/pgweb/wiki/Installation
$其他
JS handler:
[Headless Browser and Scraping]
#JS总论 - 对复杂情况的所有处理模式
http://stackoverflow.com/questions/18539491/headless-browser-and-scraping-solutions
[使用PhantomJS 和Selenium 模拟浏览器行为爬取网页]
http://blog.longc.wang/2015/02/18/using-phantomjs-and-selenium-to-crawl-website/
[ScrapyJS]
#github
https://github.com/scrapinghub/scrapy-splash
[Eloquent JavaScript]
#Javascript 教材
http://eloquentjavascript.net/
git:
[Mac下搭建Git 本地库]
http://ningandjiao.iteye.com/blog/1515599
[如何在mac下远程搭建git服务器]
#zhihu
https://www.zhihu.com/question/21549049
[用Git实现本机文件的版本控制]
#结合Atom文件修改处比较直观
http://blog.sina.com.cn/s/blog_6a70ec030101122n.html
$进阶细节:
[如何让你的scrapy爬虫不再被ban]
#列出了主要的思路
http://www.tuicool.com/articles/VRfQR3U
[Redis配置]
#不能满足非默认配置的同学
http://levi.yii.so/archives/2887
[flask-sqlalchemy分表解决方案]
http://ju.outofmemory.cn/entry/61448
[brew update 慢 解决办法 镜像更新源]
#tsinghua & ustc 我这里ustc不能用,就用了清华的
http://my.oschina.net/hejunbinlan/blog/516845?fromerr=XLnYHBkB
[PostgreSQL 与 MySQL 相比,优势何在]
#zhihu 阵营问题
https://www.zhihu.com/question/20010554/answer/62628256
[开源爬虫框架各有什么优缺点]
#分布式和非分布式爬虫的介绍。
https://www.zhihu.com/question/27042168
[Python 爬虫进阶]
#我记得有一篇更好的中文介绍,很可惜找不到了。在这里为了补充,贴上zhihu 上的一些参考库的说明。
#pytesser, pandas, 布隆过滤器,rabbitmq, schedule
https://www.zhihu.com/question/35461941/answer/63217327
$不重要的细节:
[scrapy在采集网页时使用随机user-agent的方法]
#更正了前引文存在的问题,和scrapy版本有关大概 copy & paste.
http://www.sharejs.com/codes/python/8310
$文档 - Docs
Requests:
[Requests: HTTP for Humans]
http://docs.python-requests.org/en/latest/
Scrapy:
[official - CH]
http://scrapy-chs.readthedocs.org/zh_CN/1.0/intro/overview.html
Xpath:
#不存在逻辑较好的xpath文档,不过可以参考这个
[w3school - CH]
http://www.w3school.com.cn/xpath/
[RUNOOB - CH]
http://www.runoob.com/xpath/xpath-axes.html
BeautifulSoup:
[official]
Beautiful Soup Documentation — Beautiful Soup 4.4.0 documentation
[Python爬虫入门八之Beautiful Soup的用法]
http://cuiqingcai.com/1319.html
Redis:
[official]
http://redis.io/documentation
[CH]
#上文翻译
http://doc.redisfans.com/
[CH]
http://www.runoob.com/redis/redis-tutorial.html
Goose:
#scala 写的选择文档内容的库
https://github.com/GravityLabs/goose
.appendix 1.0+
[1]感谢 @haruki_kirigaya 指出bs4 如今不需要python 3。我虽然也知道bs4 在python 2.7下能工作,但传闻是支持不好,不知是否已经完美支持。
[2]谢谢 @__starrify__, 引文写作时间为scrapy 0.24 beta 发布时,此刻最新版本1.0.4。更可参考官方文档。
文末声明:
由于水平有限+我不在程序员空间中,不参与任何有关python 2 或者 3 版本或者操作系统、编辑器、数据库类型相关的讨论