V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
AX5N
V2EX  ›  Python

问 3 个爬虫问题,框架、并发数和数据清洗

  •  
  •   AX5N · 2018-05-22 18:52:21 +08:00 · 4050 次点击
    这是一个创建于 2361 天前的主题,其中的信息可能已经有所发展或是发生改变。
    1. 使用框架(scrapy pyspider)有什么好处。感觉和自己手写脚本区别也不大,框架的主要优点是开发快吗?有没有哪些一般人不太会注意,但又重要的地方。

    2. 我希望在「不影响」其他用户的程度上尽可能的快,如果以 alexa 排名作为参考的话,一般来说并发数(下载速度)设置在什么程度比较好。

    3. 如何保证清洗完毕后的数据是正确的。现在我是先导入到别的数据库亲眼看一遍,之后才会导入主数据库。但其实也就看了一两页就不管了,有点拼运气的成分包含在内。有没有更专业点的办法

    第 1 条附言  ·  2018-05-22 21:15:45 +08:00
    感谢大家的回答,大概明白了~
    16 条回复    2018-05-23 23:13:18 +08:00
    gouchaoer2
        1
    gouchaoer2  
       2018-05-22 18:57:56 +08:00 via Android
    1,你想法很对,大部分人不需要框架,但是还是用起了框架

    3,建立 ceated_at 为 timestamp,然后 select * from t where created_at >balabala order by rand () limit 20 ;这样采样
    sheep3
        2
    sheep3  
       2018-05-22 18:59:53 +08:00
    1. 是的,我在公司的所有项目,都没有用开源框架
    2. 并发数都是测出来的,每个网站的能力都不一样,建议还是不要太快了
    frank065
        3
    frank065  
       2018-05-22 19:14:37 +08:00 via iPhone
    1. 哪个顺手就用哪个,框架就是个已有的方便更改的模板,你自己总结出来有一套按自己的来没什么错。
    2. 也在琢磨并发数量的问题。大部分是按照待爬数据量,项目进度来调整。
    3. 总会有错误的,原始数据,老数据做好备份。
    ooh
        4
    ooh  
       2018-05-22 19:19:19 +08:00
    3.你清洗数据不 validate 那你的清洗指的是什么?
    bnm965321
        5
    bnm965321  
       2018-05-22 19:32:32 +08:00   ❤️ 2
    scrapy 有异步特性,能够轻松增加并发量,很多人写不错这种快速的程序的。

    清洗数据一是可以用 scrapy 的 contract,二是用一些 schema 库(如 attrs)进行类型的处理,三是加入日志(可以搭建一个 sentry,很好用的一个服务,有爬虫经验的人都知道有时对方页面样式更改后爬虫就失效了,这是就要解析日志了,但是自己解析太麻烦,直接用 sentry 吧)
    Leigg
        6
    Leigg  
       2018-05-22 19:54:20 +08:00 via Android
    新手吧,项目中使用的框架最大好处是开发效率块,特别是大型爬虫,再一个就是工程化管理,比如文件统一存放,日志存储等。框架中谈不上数据清洗这个概念,因为都是对每条记录的简单判断处理,等你爬完数据后,比如是存的 excel,或者数据库
    AX5N
        7
    AX5N  
    OP
       2018-05-22 19:56:56 +08:00
    @ooh
    如果只是日期、数字、网址这种特征性很强的那当然不担心,但是如果抓取的是文本的话就不得不担心了。举个例子,比如某个网站突然调整了页面的结构,导致提取出来的“导演”变成了“编剧”,这种就很难发现。
    有一些奇怪的网站主要部分不用一个 class 和 id,只能靠 div 的相对位置来定位,这种网站在你不知道的时候只要改一下结构,真不一定能发现出问题了。


    @bnm965321
    重点是如何知道“对方页面样式更改”了,这正是我想问的地方。
    ml1344677
        8
    ml1344677  
       2018-05-22 20:04:47 +08:00
    1 我觉得使用框架的话可以把爬虫高度结构化,后期维护也相当方便。
    2 这个在写爬虫原型的时候可以测试下
    ooh
        9
    ooh  
       2018-05-22 20:22:16 +08:00
    @AX5N 如果真的怕出现这种情况你可以在爬取前先检查一下采集的页面结构是否有变化,如果有变化那就不采集入库
    Leigg
        10
    Leigg  
       2018-05-22 20:22:38 +08:00 via Android
    再使用一些科学计算库来对爬到得大量数据进行统一清洗。
    使用框架也是有坏处的,比如它会固化你的思维,使你脱离框架后去爬取可能毫无头绪,或者代码效率低,不停的删改,会使你对线程进程一些技术点愈加生疏 balabala
    q9REUgpVVCU77pWj
        11
    q9REUgpVVCU77pWj  
       2018-05-22 20:23:55 +08:00
    - 一开始用过 scrapy,但现在还是自己写了 request,的确感觉区别不大。
    - 并发偶尔用用,但前期不大用,因为不知道怎么抛出错误。。。加上好几个有反爬限制,速度要求也不很高,就还是单线了。
    - 页面调整最直观的嘛就是报错。比如抓 json 的,没有 key 了。抓网页的,尽量条件写死一点,xpath 找不到,自然也就知道了。入库前稍微处理一下,该转类型的转一下,该整理的整理下,也很容易发现新类型或者错误。还有嘛就是爬完的数据要用,用用总会发现点毛病的。
    bnm965321
        12
    bnm965321  
       2018-05-22 20:28:20 +08:00
    @AX5N 对方样式变更,你的数据就爬取不到了,然后在 schema 或者数据库插入的时候就会报错。你就要收集这个错误
    itsme001
        13
    itsme001  
       2018-05-22 20:40:49 +08:00
    1. 临时任务随意,长久或一定规模用框架.框架的意义可类比成肩膀.我们都站在肩膀之上,谨慎造轮子.
    你提到了 python 相关的一些东西.就这个具体来说.我从 scrapy 只支持 http1.0 就开始使用,scrapy 在定制爬虫方面流行,他提供了相当多脚手架,非常的适用.反观我以前了解的一些用 nodejs 裸写爬虫的,已经不多了.
    优化方面举个例子,scrapy 缓存了 dns.你从 requests 裸写,需要借助 dnsmasqd 这类东西.
    2. scrapy 自带 autothrottle,可配置参数自动调节请求快慢.

    当然 scrapy 也有他的不足,但 scrapy 及其小改,足够适用于绝大多数场景了.对于 scrapy 不足的场景,我考虑 golang.
    congeec
        14
    congeec  
       2018-05-22 20:46:49 +08:00 via iPhone
    1,框架帮处理了好多小问题,比如 throttling,cookies,cache。自己写又要花时间。scrapy 吃 CPU,吃内存。pyspider 和 scrapy 都够 gui 管理工具
    2, 同问
    3,数据漏掉了,只能改代码重爬。脏数据可以用 openrefine,pandas 之类的做数据清晰
    scriptB0y
        15
    scriptB0y  
       2018-05-22 23:33:42 +08:00
    3 脏数据担心的话花点时间自己写点验证吧,爬虫的脏数据问题我觉得很难 100%避免,没必要追求完全正确,有些是可以发现了再补救的,收益其实会更高一些

    2 一般可以看下网站有没有 robots.txt ,不过网站不写的话你也很难知道承受能力,还是尽量不要太快吧

    1 @congeec 说的这些问题其实 requests 全都做了,里面有 ConnectionPool, PoolManager,也有客户端 session 自动管理 cookie。爬虫不是很需要框架,其实一个任务队列,很多 worker,一个 scheduler 就够了。不用框架开发更快一些,限制更小,等你有特定需求、自己实现起来困难的时候再调研一下哪个框架满足你的要求也不迟。
    nine99
        16
    nine99  
       2018-05-23 23:13:18 +08:00
    简单的是不需要的,特别是只要爬一次的。大型的爬虫,都是分布式的,你不用框架就得自己实现一遍。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1441 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 23:51 · PVG 07:51 · LAX 15:51 · JFK 18:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.