Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

蜘蛛

2,305 views

Published on

Published in: Technology, Design
  • Be the first to comment

蜘蛛

  1. 1. 蜘蛛的进化 作者 : 轩痕
  2. 2. 关于我 <ul><li>所属单位 : 足球事业部 </li></ul><ul><li>兴趣爱好 : 骑行 , 旅游 , 金融 </li></ul><ul><li>研究方向 : linux django twisted sqlalchemy </li></ul><ul><li>邮箱 : [email_address] </li></ul>
  3. 3. 关于虎扑 <ul><li>虎扑体育网 (hoopchina.com )是一个垂直综合体育社区, 04 年在美国成立以 NBA 篮球为主,经过几次改版,目前由 </li></ul><ul><li>篮球 NBA(hoopchina.com) </li></ul><ul><li>欧洲足球 (goalhi.com) </li></ul><ul><li>F1(hellof1.com) </li></ul><ul><li>等社区构成,是国内人气最旺的体育综合社区。 </li></ul><ul><li>日访问量 千万 pv 级 </li></ul><ul><li>alexa.cn 排名 100 左右 </li></ul>
  4. 4. 什么是蜘蛛 <ul><li>蜘蛛 , 平时也会被大家称为 &quot; 爬虫 &quot;. </li></ul><ul><li>主要分为 : </li></ul><ul><li>1 通用爬虫 </li></ul><ul><li>2 聚焦爬虫 </li></ul><ul><li>聚焦爬虫通常需要解决的问题: </li></ul><ul><li>(1) 对抓取目标的描述或定义; </li></ul><ul><li>(2) 对网页或数据的分析与过滤; </li></ul><ul><li>(3) 对 URL 的搜索策略。 </li></ul>
  5. 5. 为什么要有蜘蛛 <ul><li>搜索引擎 ( 通用爬虫 ) </li></ul><ul><li>自身业务需要 ( 去哪儿 , 豆瓣 ) </li></ul><ul><li>监控竞争对手 ( 当当 , 亚马逊 , 京东 ) </li></ul>
  6. 6. 豆瓣 : <ul><li>豆瓣用来抓 </li></ul><ul><li>取书的价格 </li></ul><ul><li>制作购书单 </li></ul>
  7. 7. 去哪儿 <ul><li>自身业务 </li></ul><ul><li>需要抓取 </li></ul><ul><li>机票 , 酒店 </li></ul><ul><li>等价格 </li></ul>
  8. 10. 亦歌
  9. 11. <ul><li>当当 , 京东 , 亚马逊产品价格 </li></ul>
  10. 12. 选择 ? <ul><li>我也想写个蜘蛛哇 , 如何开始 ? </li></ul><ul><ul><li>选一个能下载网页 + 能处理字符串的语言就行 . 比如 c, c++, python, ruby, perl, php, java 之类的语言都是可以的 . </li></ul></ul><ul><ul><li>这么多语言 , 我们如何选择 ? 为什么做这个选择 ? </li></ul></ul>
  11. 13. 蜘蛛的进化 <ul><li>1 单线程的蜘蛛 </li></ul><ul><li>2 简单的多线程蜘蛛 ( 根据需要来产生线程 ) </li></ul><ul><li>3 具有线程池的蜘蛛 ( 通过死循环来实现固定线程数目 ) </li></ul><ul><li>4 使用队列来初步实现异步的蜘蛛 ( 这里省略一万字 ..) </li></ul><ul><li>5 完全异步的蜘蛛 </li></ul><ul><li>6 scrapy ( 一个异步的蜘蛛框架 ) </li></ul><ul><li>7 twisted 自己手工制造 ( 水太深 , 不讲了 ..) </li></ul>
  12. 14. 最简单的蜘蛛代码 <ul><li>1 #/usr/bin/env python </li></ul><ul><li>2 #encoding:utf-8 </li></ul><ul><li>3 import urllib2 </li></ul><ul><li>4 from BeautifulSoup import BeautifulSoup </li></ul><ul><li># 下载部分 </li></ul><ul><li>5 website = urllib2.urlopen('http://www.douban.com') </li></ul><ul><li>6 html = website.read() </li></ul><ul><li># 解析部分 </li></ul><ul><li>7 soup = BeautifulSoup(html) </li></ul><ul><li>8 title = soup.find('h1').text </li></ul><ul><li># 处理结果 , 打印 </li></ul><ul><li>9 print title </li></ul>
  13. 15. 最简单的蜘蛛 <ul><li>这样的蜘蛛有什么利弊呢 ? </li></ul><ul><li>如果我们有很多页面需要爬取 , 怎么办 ? </li></ul><ul><li>如何让蜘蛛能够更快地行动 , 提高爬取页面的速度 ? </li></ul>
  14. 16. 多线程 + 队列 ( 锁 ) <ul><li>蜘蛛最重要的部分就是 队列 </li></ul><ul><li>根据队列使用程度的不同 , 我们可以得到如下的流程 </li></ul>
  15. 21. 为什么要处理异常 , 要如何做 ? <ul><li>整个程序都要被异常处理的手段所包裹,因为代码要一直跑,不能因为一个小的异常就崩溃了 </li></ul><ul><li>try except 里面的代码要尽量少, 而 try except 要尽量多。下面有我写的第一个脚本跟最后一个脚本的截图对比 : </li></ul>
  16. 22. 异常处理方式对比
  17. 23. <ul><li>3 尽量在发生异常的代码附近捕获异常,而不要交给更高一级的异常处理代码来做这个事情,这样有利于定位异常发生的位置,加速调试。 </li></ul><ul><li>4 异常多的时候,程序在各种情况下进入的分支都要处理妥当。这个在逻辑简单的时候不会是问题,但是一旦在一个页面抓取的数据点多的时候就需要特别小心。 </li></ul>
  18. 24. 测试 !!!! <ul><li>先浏览页面 , 保证看到足够数量的页面情况 , 对每种情况作出记录 </li></ul><ul><li>先写功能部分 , 比如解析 , 数据插入部分 , 保证单线程的稳定 </li></ul><ul><li>测试 !! 测试 !! 每一个函数都要单独 , 长时间的测试 , 要非常健壮 , </li></ul><ul><li>迭代 !! 迭代 !! 根据单个函数运行的过程中发现的异常 , 修改代码 , 然后继续测试 , 继续修改代码 , 一直迭代 .... 直到感觉差不多了再往下 </li></ul><ul><li>这 </li></ul><ul><ul><ul><ul><ul><li>里 </li></ul></ul></ul></ul></ul><ul><ul><ul><ul><ul><li>要 </li></ul></ul></ul></ul></ul><ul><ul><ul><ul><ul><li>留 </li></ul></ul></ul></ul></ul><ul><ul><ul><ul><ul><li>出 </li></ul></ul></ul></ul></ul><ul><ul><ul><ul><ul><li>足 </li></ul></ul></ul></ul></ul><ul><ul><ul><ul><ul><li>够 </li></ul></ul></ul></ul></ul><ul><ul><ul><ul><ul><li>的 </li></ul></ul></ul></ul></ul><ul><ul><ul><ul><ul><li>时间 </li></ul></ul></ul></ul></ul><ul><li>最最后才是把各部分组合起来的时候 , 这时候加入多线程控制和地址生成部分 . </li></ul>
  19. 25. 碰到的问题 , 希望和大家探讨的地方 <ul><li>有没有其他的方式可以让这个爬虫更好维护呢 ? </li></ul><ul><li>线程无法退出的问题以及目前的解决办法 </li></ul><ul><li>入库的时候有没有其他更高效的解决办法 ? </li></ul>
  20. 26. 木牛啦 .. 谢谢大家

×