蜘蛛

2,146
-1

Published on

Published in: Technology, Design
0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
2,146
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
29
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

蜘蛛

  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. 木牛啦 .. 谢谢大家

×