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是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 其可以应用在数据挖掘,信息处理或存储历史数据等一系列的程序中.其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的 ...
随机推荐
- office2016各个版本 以及 解决visio搜索任何都提示无匹配项问题
http://tieba.baidu.com/p/4089747196 版本:Office 2016 Visio 专业版 32位版文件名:SW_DVD5_Visio_Pro_2016_W32_ChnS ...
- react native中的欢迎页(解决首加载白屏)
参照网页: http://blog.csdn.net/fengyuzhengfan/article/details/52712829 首先是在原生中写一些方法,然后通过react native中js去 ...
- Silverlight:针式打印机文字模糊的改善办法
SL的打印功能,如果使用针式打印机,打出来的字很模糊,网上有一些文章介绍应该使用"Arial,SimSun"(即:宋体),但实际测试的结果,宋体依然很模糊. 下面是各种字体的测试: ...
- stm32调试记录一
..\..\SYSTEM\usart\usart.c(1): error: #5: cannot open source input file "sys.h": No such ...
- Incorrect string value异常解决
mysql数据库的一个问题 1366-Incorrect string value:'\xE5\x8D\xA1\xE5......' for column 'filename' at row 1 问题 ...
- JavaScript中sort方法的一个坑(leetcode 179. Largest Number)
在做 Largest Number 这道题之前,我对 sort 方法的用法是非常自信的.我很清楚不传比较因子的排序会根据元素字典序(字符串的UNICODE码位点)来排,如果要根据大小排序,需要传入一个 ...
- Jquery和JS获取ul中li标签(转)
js 获取元素下面所有的li var content=document.getElementById("content"); var items=content.getElemen ...
- Vue学习笔记-2
前言 本文非vue教程,仅为学习vue过程中的个人理解与笔记,有说的不正确的地方欢迎指正讨论 1.computed计算属性函数中不能使用vm变量 在计算属性的函数中,不能使用Vue构造函数返回的vm变 ...
- centos7 安装nginx和php5.6.25遇到 无法访问php页面 报错file not found 问题解决
php-fpm安装完成,nginx安装完成 netstap -ntl| 发下端口正常开启 iptables -L 返现9000端口已经开放 ps -aux|grep nginx 发下nginx进程正常 ...
- 【翻译】Windows 10 中为不同设备加载不同页面的3种方法
在以前,为PC和手机做App是两个工程,PC和手机各一个.在Windows 10中会发现只有一个了,对于简单的页面变化可以使用VisualState来解决,但是比如网易云音乐这种PC版和手机版差异巨大 ...