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是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 其可以应用在数据挖掘,信息处理或存储历史数据等一系列的程序中.其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的 ...
随机推荐
- hadoop 2.6伪分布安装
hadoop 2.6的“伪”分式安装与“全”分式安装相比,大部分操作是相同的,主要区别在于不用配置slaves文件,而且其它xxx-core.xml里的参数很多也可以省略,下面是几个关键的配置: (安 ...
- 【java】企业级分布式搜索平台Solr视频教程
课程背景为了满足高可用.可扩展并容错的分布式搜索引擎.Solr是一个高性能,采用Java5开发, 基于Lucene的全文搜索服务器.同时对其进行了扩展,提供了比Lucene更为丰富的查询语言,同时实现 ...
- lecture11-hopfiled网络与玻尔兹曼机
Hinton课程第11课 这部分的课程算是个知识背景,讲述RBM的来源吧,毕竟是按照hopfield--BM-RBM的路线过来的. 因为水平有限,都是直译,如果纠结某句话,肯定看不懂,所以这些课程只需 ...
- SQL基础之GROUPING
1.grouping sets 记得前几天第一次接触grouping sets时,笔者的感觉是一脸懵逼. 后来一不小心看到msdn上对grouping sets的说明,顿时豁然开朗,其实groupin ...
- .net异步编程
现在电脑大部分都是多核心,在处理多线程方便有很大优势,异步调用方法的时候可以立即返回执行其他程序,进行异步编程会让程序运行效率更高. 我也是刚刚关注异步编程方面知识,也有很多不是很理解,所以想向大神请 ...
- 用 canvas 做个好玩的网站背景
不知不觉又好久没更过博客了,老调新弹一下,之前做的一个小效果,觉得蛮有意思的,也有朋友问是怎么做的,就分享一下,写个博文吧. 先上demo吧:http://whxaxes.github.io/canv ...
- SqlServer导入数据到MySql
1.下载MySql ODBC Driver并进行安装.例如我下载的这个安装包是mysql-connector-odbc-5.1.6-win32.msi. 2.装完后,添加odbc数据源: 3.在sql ...
- C#读书雷达
大家都知道,ThoughtWorks的技术雷达每年都会发布两到三次,它不但是业界技术趋势的标杆,更提供了一种卓有成效的方法论,即打造自己的技术雷达.在这种思想的驱动下,我们诞生了自己的读书雷达(目前已 ...
- LINUX 配置SVN
1. 安装SVN yum -y install subversion 2. 创建版本库目录 mkdir /root/svn/ svnserve -d -r /root/svn/ 3. 创建版本库 ...
- 最短的可通过编译的C语言程序
要求:写一个最短的,能通过编译的C语言程序,但不要求能正确运行. 一般人首先想到的是除0.即 int main() { /; } 除0会引发SIGFPE信号(浮点异常). 我们也可以删掉return, ...