初学爬虫,设计一个定向爬虫策略,请大家帮我看看,是否合理? - V2EX
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 3911 次点击
    这是一个创建于 3408 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    数据模型

    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     Solana     5642 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 32ms UTC 03:33 PVG 11:33 LAX 20:33 JFK 23:33
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86