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是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 其可以应用在数据挖掘,信息处理或存储历史数据等一系列的程序中.其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的 ...
随机推荐
- NET WebApi OWIN 实现 OAuth 2.0
NET WebApi OWIN 实现 OAuth 2.0 OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和 ...
- vbs keys
其使用格式为: object.SendKeys string "object":表示WshShell对象 "string":表示要发送的按键指令字符串,需要放在 ...
- Java7并发编程实战(一) 线程的管理
1:线程的创建 1:继承Thread类,并且覆盖run()方法 2:创建一个实现Runnable接口的类.使用带参数的Thread构造器来构造 2:example-->计算打印乘法表 首先 ...
- 小记sql server临时表与表变量的区别
临时表与表变量都可以起到“临时”的作用,那么两者主要的区别是什么呢? 这里不讨论创建方式,以及全局临时表.会话临时表这些,主要记录一下个人对两者的主要区别以及适用情况的看法,有什么不对或补充的地方,欢 ...
- 还记得高中的向量吗?leetcode 335. Self Crossing(判断线段相交)
传统解法 题目来自 leetcode 335. Self Crossing. 题意非常简单,有一个点,一开始位于 (0, 0) 位置,然后有规律地往上,左,下,右方向移动一定的距离,判断是否会相交(s ...
- HTML5+JS 《五子飞》游戏实现(一)规则
很久没写文章了,这个游戏其实已经写了有段时间了,一直没有完善,赶在新年之际,分享给大家. 该<五子飞>游戏,不是平常大家所说的<五子棋>,这个玩法简单,是我们老家儿时常玩的一种 ...
- 从Nodejs脚本到vue首页看开源始末的DemoHouse
最近上Github看见了大漠的DemoHouse项目,看到Issues说准备做一个首页,于是我的第一想法就是做一个md列表页面,md文件可以很容易的生成一个html文件.刚刚做好脚本文件,可以生成li ...
- 如何快速从一个Storage Account拷贝到另一个账号
当您有两个Storage Account的时候,怎样快速做到从一个账号拷贝到另一个账号呢.当拷贝的文件比较,例如100多G(VHD文件). http://code.msdn.microsoft.com ...
- SDRAM读写一字(下)
SDRAM读写一字 SDRAM控制模块 上电后进行初始化状态,初始化完成后进入空闲状态,在此进行判断如下判断: 如果自刷新时间到,则进行自刷新操作,操作完成后重新进入空闲状态: 如果读使能有效则进行读 ...
- mysql找回密码
1.打开任务管理器,关闭mysqld.exe 2.win+r运行cmd打开控制台,输入mysqld --skip-grant-tables启动服务器 3.win+r重新运行cmd打开控制台,输入mys ...