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是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 其可以应用在数据挖掘,信息处理或存储历史数据等一系列的程序中.其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的 ...
随机推荐
- consumer group
Kafka消费组(consumer group)一直以来都想写一点关于kafka consumer的东西,特别是关于新版consumer的中文资料很少.最近Kafka社区邮件组已经在讨论是否应该正式使 ...
- ZooKeeper 笔记(2) 监听数据变化
ZK中的每个节点都可以存储一些轻量级的数据,这些数据的变化会同步到集群中的其它机器.在应用中程序员可以添加watcher来监听这些数据的变化,watcher只会触发一次,所以触发过后想要继续监听,必须 ...
- vbs外部调用
一.QTP调用外部VBS的方法 加到QTP的Resource中 在QTP菜单中设置, 菜单FileàSettingsàResource,将要加载的VB脚本添加进来. 举例: 步骤1:在D盘下新建一个V ...
- 在windows下安装配置Ulipad
在windows下安装配置Ulipad 今天推荐一款轻便的文本编辑器Ulipad,用来写一些小的Python脚本非常方便. Ulipad下载地址: https://github.com/limodou ...
- github开源:企业级应用快速开发框架CIIP WEB+WIN+移动端
简介 CIIP是基于XAF开发的开源信息系统框架.CIIP最常见的应用场景是基于数据库的企业级应用程序,例如供应链系统,ERP系统,MRP系统,CRM系统等. CIIP支持WEB版本.Windows桌 ...
- windows部署React-Native的开发环境实践(技术细节)
前情摘要 众所周知,有人说.net可以用Xamrian,呵呵,不习惯收费的好么?搞.Net的人设置一次java的环境变量,可能都觉得实在太麻烦了,可能是因为这些年微软确实把我们给带坏了,所有东西一键安 ...
- JS 页面加载触发事件 document.ready和window.onload的区别
document.ready和onload的区别——JavaScript文档加载完成事件页面加载完成有两种事件: 一是ready,表示文档结构已经加载完成(不包含图片等非文字媒体文件): 二是onlo ...
- JS 获取上一层目录
派生到我的代码片 <script type="text/javascript"> //返回当前工作目录 function GetCurrDir(){ var pathN ...
- Visual Studio 2013启用AnkSVN
1. 官网下载AnkSVN https://ankhsvn.open.collab.net/ 2. 安装 3. 启用 When you enable AnkhSVN as a VS.NET sour ...
- [转]制作png格式透明图片的简易方法
原文地址:http://blog.csdn.net/zhouyingge1104/article/details/24460743 photoshp之类的专业软件太复杂,其实,制作透明图标有比较简易的 ...