crawler: 爬虫的基本结构
目前我所知道的爬虫在获取页面信息上,分为静态爬虫和动态爬虫;静态爬虫主要用于获取静态页面,获取速度一般也比较快;但是现在很多网站的页面都是采用动态页面,当我们用爬虫去获取信息的时候,页面的信息可能还没有完全生成,所以我们很难获取完整的网页内容信息。
所以我们需要构建动态爬虫,目前比较好用的几个工具是PhantomJS, Selenium等:
PhantomJs类似于浏览器内置的webkit,支持各种Web标准: DOM 处理, CSS 选择器, JSON, Canvas, 和 SVG;可以理解成一个浏览器。
Selenium是现在使用最为广泛的一款开源自动化测试工具,我们可以用它进行对获取的页面内容进行解析,通常采用xpath,jsoup等等。
1.构建一个基本的爬虫:
1)Jsoup 与 HttpClient就可以构建一个简单的静态爬虫
2) PhantomJs 与 selenium可以构建一个动态爬虫
动态爬虫的原理:
当我们将一个请求发送出去后,为了获取完整的页面信息,我们需要等待Js完全加载后才能获取;所以我们可以将这个过程交给类似浏览器的工具去完成,等到页面完全加载完成后我们在获取完整的页面内容进行解析。
这是一段网络上selenium应用的代码:
File pathToBinary = new File("D:\\Program Files (x86)\\Mozilla Firefox\\firefox.exe");
FirefoxBinary ffBinary = new FirefoxBinary(pathToBinary);
FirefoxProfile firefoxProfile = new FirefoxProfile();
FirefoxDriver driver = new FirefoxDriver(ffBinary,firefoxProfile);
driver.get("http://cq.qq.com/baoliao/detail.htm?294064");
ArrayList list = new ArrayList();
list.add("http://www.sina.com.cn");
list.add("http://www.sohu.com");
list.add("http://www.163.com");
list.add("http://www.qq.com");
long start,end;
for(int i=0;i<list.size();i++){
start = System.currentTimeMillis();
driver.get(list.get(i).toString());
end = System.currentTimeMillis();
System.out.println(list.get(i).toString() + ":" + (end - start));
}
driver.close();
我们可以通过设置去除一些我们不需要的内容如图片,css元素,广告,flash等等
例:firefoxProfile.setPreference("permissions.default.image")
不足的地方是每次我们获取页面都要启动driver,这非常耗时,对于大量的请求页面获取这种操作处理的性能不是太好。
可取的一些想法是:
把这些操作做成分布式的
我们可以写一个自己的客户端程序提供一些页面或者浏览器能访问的地址,我们将获取信息的响应转发到浏览器中执行(实际将响应的内容发送到某个页面给浏览器加载),然后在通过某些操作将结果返回给浏览器处理。
这里的关键问题在于页面加载完成的时间我们怎样确定?
· 我们可以通过设置相应的抓取目标然后开多个客户端异步线程进行页面抓取(这里的关键在于爬虫队列的设计,以及内容的存储方式)
· 抓取页面的过程中我们可能会由于网络问题导致页面延时,下载失败,解析失败等等问题
· 页面的加载可以通过定时来解决,但是定时策略不是一个很好的办法,因为我们仍然没法确定在一定的时间页面是否能加载完成
· 还有一种解决方法是将响应的内容用某个js函数执行,然后我们可以通过js回调来确定获取通过ajax请求某个内容然后通过回调函数来确定
当然我们可以设计的更好一点:
2.爬虫设计的一些问题
crawler: 爬虫的基本结构的更多相关文章
- 使用Node.js搭建数据爬虫crawler
0. 通用爬虫框架包括: (1) 将爬取url加入队列,并获取指定url的前端资源(crawler爬虫框架主要使用Crawler类进行抓取网页) (2)解析前端资源,获取指定所需字段的值,即获取有价值 ...
- python scrapy 入门,10分钟完成一个爬虫
在TensorFlow热起来之前,很多人学习python的原因是因为想写爬虫.的确,有着丰富第三方库的python很适合干这种工作. Scrapy是一个易学易用的爬虫框架,尽管因为互联网多变的复杂性仍 ...
- 爬虫相关-scrapy框架介绍
性能相关-进程.线程.协程 在编写爬虫时,性能的消耗主要在IO请求中,当单进程单线程模式下请求URL时必然会引起等待,从而使得请求整体变慢. 串行执行 import requests def fetc ...
- 风变编程笔记(二)-Python爬虫精进
第0关 认识爬虫 1. 浏览器的工作原理首先,我们在浏览器输入网址(也可以叫URL),然后浏览器向服务器传达了我们想访问某个网页的需求,这个过程就叫做[请求]紧接着,服务器把你想要的网站数据发送给浏 ...
- python爬虫的一些心得
爬虫用于从网上得到目标数据,根据需要对其予以利用,加以分析,得到想要的实验成果.现在讲一讲我这两天学到的东西. 第一,爬虫的算法结构,包括以下几个方面: (1)读取网络数据 (2)将获取的数据解析为目 ...
- Python爬虫从入门到放弃(十三)之 Scrapy框架的命令行详解
这篇文章主要是对的scrapy命令行使用的一个介绍 创建爬虫项目 scrapy startproject 项目名例子如下: localhost:spider zhaofan$ scrapy start ...
- Python网络爬虫精要
目的 学习如何从互联网上获取数据.数据科学必须掌握的技能之一. 本文所用到的第三方库如下: requests, parsel, selenium requests负责向网页发送HTTP请求并得到响应, ...
- TinScrapy-简化的Scrapy原码-查看爬虫的执行流程
学习了自定义的TinyScrapy框架,整理出以下定注释的代码 from twisted.web.client import getPage,defer from twisted.internet i ...
- 爬虫之scrapy入门
1.介绍 Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 其可以应用在数据挖掘,信息处理或存储历史数据等一系列的程序中.其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的 ...
随机推荐
- Wabpack系列:在webpack+vue开发环境中使用echarts导致编译文件过大怎么办?
现象,在一个webpack+vue的开发环境中,npm install echarts --save了echarts,然后在vue文件中直接使用 import echarts from 'echart ...
- swift-sharesdk集成微信、Facebook第三方登录
好久没有写博客了.最近忙得没有时间更新博客,很忙很忙. 今天就把自己做过的第三方集成和大家分享一下,请大家多多指教. 第一步: 一.获取AppKey(去官方平台注册) 二.下载SDK 三.快速集成 第 ...
- 一次莽撞的行为:在phpmyadmin中修改MySQL root密码后无法操作数据库
一.手贱行为(✿◡‿◡) 在一次开发中通过xampp方式安装了PHP环境,需要操作数据库时通过phpmyadmin访问MySQL,在一次数据库操作时想起没有设置密码,于是直接在mysql数据库中的us ...
- 几张图弄明白ios布局中的尺寸问题
背景 先说说逆向那事.各种曲折..各种技术过时,老老实实在啃看雪的帖子..更新会有的. 回正题,这里讨论的是在Masnory框架下的布局问题.像我这种游击队没师傅带,什么都得自己琢磨,一直没闹明白下面 ...
- C#链接阿里云KVStore
KVStore的简单介绍 阿里云KVStore兼容Redis.因为KVStore就相当于Redis的服务器端,我们代码只是当作客户端,链接上服务器端就行了,阿里云的KVStore详情文档见,https ...
- 木耳听歌记---Clip+安装Rockbox
黑五嫌着无聊,在什么值得买的诱惑下从美国亚马逊买了一个Clip+ 8GB版本,不为别的,就为了一直听别人说可以装Rockbox,谁让咱的魅族MX2无法安装这听歌神器来. 转运过程就不说了, 历时一个多 ...
- background-size对background-position的影响
CSS3中提出了background-size属性,该属性可以设置背景图片的大小,该属性的值设置为绝对数值或者百分比时对background-position没有任何影响,当设置为contain/co ...
- 十天冲刺---Day5
站立式会议 站立式会议内容总结: 燃尽图 照片 PM确实不应该交给组内编码最强的人来做. 编码的过程还要考虑整个项目的流程压力较大. 需要队友的支持和沟通.
- Mysql存储引擎之TokuDB以及它的数据结构Fractal tree(分形树)
在目前的Mysql数据库中,使用最广泛的是innodb存储引擎.innodb确实是个很不错的存储引擎,就连高性能Mysql里都说了,如果不是有什么很特别的要求,innodb就是最好的选择.当然,这偏文 ...
- 选项卡js
趁着公司不忙,抓紧充充电,开始可能会写的不好,但是每写一个都是一点进步,哈哈,加油 用js实现选项卡切换 1.获取元素 2.初始状态 3.通过循环清空元素状态 4.点击操作以及对应的内容切换 5.自定 ...