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
DingYuanfang
V2EX  ›  Python

初学爬虫,设计一个定向爬虫策略,请大家帮我看看,是否合理?

  •  
  •   DingYuanfang · 2016-06-17 16:30:34 +08:00 · 3585 次点击
    这是一个创建于 3113 天前的主题,其中的信息可能已经有所发展或是发生改变。

    哪些地方需要改进和注意的地方,或更好的爬虫策略。

    下面是伪代码 欢迎批评指正!

    数据模型

    class Obj:
        pass
    

    常量

    Objs = []   对象容器
    IPS = []    代理池
    
    

    函数

    1. 构造代理 ip 池
    def  build_ips():
        ....
        return ips
    
    2. 下载页面
    - 随机选取代理 ip 下载页面,限制 timeout ,超时或异常更换 ip ,最多重试 5 次
    - 基础页下载(含 params 参数),详细页下载不含参数
    def  download_html(url,params=None)
        ....
        return html
    
    3. 构造参数组合(不包含页码)
    - 如:城市+关键字 的组合
    def build_params_lst(citys,kds):
        ....
        return params_lst
    
    4. 解析基础页(带请求参数,不含页码),构造 Obj-->Objs
    - 页码上限设置很大。
    - 参数=原参数+页码。
    - 解析基础信息(至少包含详细页面 url)并 push 到 Objs 列表
    - 该页码下内容为空则 return ,中断页码遍历
    
    def parse_html(params)
        obj = Obj()
        obj.name = ....
        ....
        Objs.append(obj)
        return None
    
    5. 解析详细页面,更新 obj 详细信息。
    def get_detail(obj):
        url = obj.url
        ....
        obj.detail = ...
        return None
    
    

    程序执行

    1. IPS = build_ips()
    2. params_lst = build_params_lst()
    3. 多线程基础下载解析  函数: parse_html 参数迭代器: params_lst
    4. 多线程详细页面下载解析  函数: get_detail 参数迭代器 Objs
    5. 遍历 Objs ,添加 obj 到数据库
    
    
    第 1 条附言  ·  2016-06-17 17:36:21 +08:00

    场景

    我的想法是爬取主要的所有的招聘网站做一个It垂直搜索引擎。

    已经看到挖工作网实现这个想法。职友网的搜索做的很差。

    想实现一个高效的爬虫,能每天实时更新数据库。

    现使用

    requests+lxml+Mysql+redis

    准备学习分布式爬虫,用阿里云弹性伸缩服务器,自动晚上开机爬取。

    已解决:

    访问速度,通过代理ip,可以解决。 内容提取,网页结构化,xpath比较容易提取。 网站不需要登录

    现在:

    希望实现一个爬虫策略 效率高,结构清晰,代码简洁好读,便于自己理解和维护。

    第 2 条附言  ·  2016-06-17 17:50:52 +08:00
    补充:上面常量改为变量
    另外: windows 下经常开启多线程,超过 10 个就经常把 wifi 爬掉线是什么原因?
    使用校园网(12M) ,爬虫宽带高峰才 4M 内存 cpu 也错错有余, TCP 连接最高 500 。
    9 条回复    2016-08-29 16:26:53 +08:00
    murmur
        1
    murmur  
       2016-06-17 16:43:02 +08:00
    代码我就不看了
    总结一下:
    ( 1 )如果是真的用的爬虫,而不是出于练习目的,那么任何一个开源爬虫都比你的好,无论是 nutch 还是 scrapy 还是其他的
    ( 2 )即便是练习,重点也要放在内容提取,就是定向爬虫部分,而不是仅仅收录就可以,比如你去比价,去抓评价,所以可以基于一个现有的爬虫开发,去做垂直抓取那部分
    ( 3 )爬虫的异常处理永远是难点,尤其是有随机插入白色字符的、需要注册的、访问太快就 ban 的、要验证码的等
    practicer
        2
    practicer  
       2016-06-17 16:53:50 +08:00
    @murmur 题主目前在学习阶段,经过自己构思策略后,再对学 scrapy 等框架百宜而无一害。

    我提一个想法,第三步改成让爬虫递归按当前路径向下钻,设置一个递归层次的参数,限制无限递归。例如这个参数设为 3 ,那么爬 abc.com/beijing/这个路径的时候,自动抓链接抓到 abc.com/beijing/1st-layer/2nd-layer/3rd-layer
    murmur
        3
    murmur  
       2016-06-17 16:55:16 +08:00
    @practicer 看我写的,建议一开始研究一个模块,当然就是内容提取这部分,这里会遇到各种真实的问题,会看到别的公司高薪聘请的程序员是怎么恶心你的,然后这里写好了 python 相关掌握差不多再来搞架构不更好
    chendajun
        4
    chendajun  
       2016-06-17 16:55:30 +08:00
    定向爬虫的话还是用开源爬虫吧。在用 Scrapy ,目前大概 400 个爬虫任务,基本稳定。
    DingYuanfang
        5
    DingYuanfang  
    OP
       2016-06-17 17:43:08 +08:00
    @murmur @practicer 嗯,你们说的大概能明白,非常感谢,关于使用框架会考虑的。补充了一点场景。
    @chendajun 谢谢回复,安装过 Scrapy 失败了... 会接触 Scarpy 的。
    qdk0901
        6
    qdk0901  
       2016-06-17 21:30:21 +08:00
    并发数 10 个就掉 wifi ?
    我用 nodejs 爬 tumblr 图片,并发数 1000 都没什么问题。
    slysly759
        7
    slysly759  
       2016-06-18 16:20:32 +08:00
    感觉写的不错呀
    可以交流一下喵 好像在站上没有找到私信功能
    @DingYuanfang
    DingYuanfang
        8
    DingYuanfang  
    OP
       2016-06-18 19:40:18 +08:00
    @slysly759 qq 574985696
    sosozzzx
        9
    sosozzzx  
       2016-08-29 16:26:53 +08:00
    关注这个博客很久了,写的爬虫教程很多,关键是教程好细致,特色适合初学者
    推荐给你看看

    youmumzcs 的专栏
    http://blog.csdn.net/youmumzcs?viewmode=contents
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1386 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 17:33 · PVG 01:33 · LAX 09:33 · JFK 12:33
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.