必应桌面壁纸自动更新爬虫多长时间更新

干货|一个简单粗暴的爬虫 - 必应今日美图 - 科技 - 科技头条
干货|一个简单粗暴的爬虫 - 必应今日美图
干货|一个简单粗暴的爬虫 - 必应今日美图
1. 必应今日美图
2. 开始编码 1. 必应今日美图 当使用bing搜索时,每天都会出现一副美图。
搜索找到bing今日美图 http://bing.plmeizi.com/(这里收集了一年多的今日美图) 收集者: http://leil.plmeizi.com/
目前共47页
url格式按 http://bing.plmeizi.com/?page=*
点进去就是我们要的名称和名称
2. 开始编码
使用简单的Jsoup进行爬虫,很简单,很好理解。 HrmlUtil
这个编码主要需要先分析html属性,按照属性取到我们需要的元素,元素值。 我是先拿到每个图的page页面url 然后到详情页面拿到图的url,图的名字截取。 然后将图保存到本地。
采用多线程,开启多个线程同时爬取图片
耗时76.962s 完成图片下载到本地。
效果:很高清吧 返回搜狐,查看更多
责任编辑:
&科技讯版权所有
京ICP备号-1
京公网安备 19号java爬虫抓取网页数据-Bing导出数据与Bingbot网站抓取设置
java爬虫抓取网页数据-Bing导出数据与Bingbot网站抓取设置
一 : Bing导出数据与Bingbot网站抓取设置
  7 月,微软 Bing 团队发布了全新的 Bing Webmaster Tools(即 Bing 站长工具)。今天,Bing Webmaster Tools 根据站长用户的反馈,增加了 CSV 文件导出功能和 Bingbot 网站抓取参数设置。   数据导出为 CSV 文件   Bing Webmaster Tools 已经允许站长将自己的站点的数据导出为可下载的 CSV 文件,支持导出的数据有抓取、索引和流量统计、搜索量、抓取细节、Sitemaps、已阻止的 URL、查询参数、已注册站点。点击右侧的导出按钮,即可下载 CSV 文件,之后再用 Excel 打开查看编辑。
  Bingbot 网站抓取参数设置   这次 Bing Webmaster Tools 增加了供站长控制 Bing 机器人抓取的设置页面,其中的第一个已经推出的设置项就是&查询参数&。添加完参数后,Bing 机器人会自动忽略 URL 中带有该参数的部分,防止因不同参数但页面内容相同,而对 SEO 造成的不利影响。
  老样子,Bing 团队在接下来的几个月里还会陆续推出更多 Bing Webmaster Tools 的功能。虽说 Yahoo! 美国、加拿大英文搜索已经开始由 Bing 驱动,但是在全球范围的过渡仍还需要 2 年。在此期间,Yahoo! Site Explorer 站长工具也不能说完全没用,但迟早还是会由 Bing Webmaster Tools 全全接管。 二 : Node.js的学习--使用cheerio抓取网页数据打算要写一个公开课网站,缺少数据,就决定去网易公开课去抓取一些数据。前一阵子看过一段时间的Node.js,而且Node.js也比较适合做这个事情,就打算用Node.js去抓取数据。关键是抓取到网页之后如何获取到想要的数据呢?然后就发现了cheerio,用来解析html非常方便,就像在浏览器中使用jquery一样。使用如下命令安装cheerionpm install cheerioCheerio安装完成, 我们就可以开始工作了。 首先让我们来看一段javascript代码 这段代码可以下载任意一个网页的内容。将其放入到curl.js中,并导出。复制代码var http = require("http");// Utility function that downloads a URL and invokes// callback with the data.function download(url, callback) {http.get(url, function(res) {var data = "";res.on('data', function (chunk) {data +=});res.on("end", function() {callback(data);});}).on("error", function() {callback(null);});}exports.download =复制代码然后是使用cheerio解析html,找到想要的数据。我们先来自己分析一下页面。我们要抓取这个页面中的视频,视频的地址都在下载的按钮里。其中一个下载按钮的html的代码如下:&a href="http://mov.bn.netease.com/mobilev/2013/1/F/G/S8KTEF7FG.mp4" id="M8KTEKR84" target="_blank"&&/a&我们取到其中的href属性,只需要进行如下选择即可$("a.downbtn").attr("href");在是现实,我们可以在index.js中写入如下代码复制代码var cheerio = require("cheerio");var server = require("./curl");var url = ""server.download(url, function(data) {if (data) {//console.log(data);var $ = cheerio.load(data);$("a.downbtn").each(function(i, e) {console.log($(e).attr("href"));});console.log("done");} else {console.log("error");}});复制代码然后执行node index.js这样就可以在命令框里面打印出页面上所有的视频地址。如下图cheerio中文API [参考]我们将用到的标记示例&ul id="fruits"&&li&Apple&/li&&li&Orange&/li&&li&Pear&/li&&/ul&这是我们将会在所有的API例子中用到的HTML标记Loading首先你需要加载HTML。这一步对jQuery来说是必须的,since jQuery operates on the one, baked-in DOM。通过Cheerio,我们需要把HTML document 传进去。这是首选:var cheerio =require('cheerio'),$ = cheerio.load('&ul id="fruits"&...&/ul&');或者通过传递字符串作为内容来加载HTML:$ =require('cheerio');$('ul','&ul id="fruits"&...&/ul&');Or as the root:$ =require('cheerio');$('li','ul','&ul id="fruits"&...&/ul&');你也可以传递一个额外的对象给.load()如果你需要更改任何的默认解析选项的话:$ = cheerio.load('&ul id="fruits"&...&/ul&',{ignoreWhitespace:true,xmlMode:true});这些解析选项都是直接来自htmlparser ,因此任何在htmlparser里有效的选项在Chreeio里也是行得通的。默认的选项如下:{ignoreWhitespace:false,xmlMode:false,lowerCaseTags:false}SelectorsCheerio的选择器用起来几乎和jQuery一样,所以API也很相似。$(selectior,[context],[root])选择器在 Context 范围内搜索,Context又在Root范围内搜索。selector 和context可是是一个字符串表达式,DOM元素,和DOM元素的数组,或者chreeio对象。root 是通常是HTML 文档字符串。复制代码$('.apple','#fruits').text()//=& Apple$('ul .pear').attr('class')//=& pear$('li[class=orange]').html()//=& &li&Orange&/li&复制代码Attributes获得和修改属性.attr(name,value)获得和修改属性。在匹配的元素中只能获得第一元素的属性。如果设置一个属性的值为null,则移除这个属性。你也可以传递一对键值,或者一个函数。$('ul').attr('id')//=& fruits$('.apple').attr('id','favorite').html()//=& &li id="favorite"&Apple&/li&.val([value])获得和修改input,select,textarea的value.注意: 对于传递键值和函数的支持还没有被加进去。$('input[type="text"]').val()//=& input_text$('input[type="text"]').val('test').html()//=&&input type="text" value="test"/&.removeAttr(name)通过name删除属性$('.pear').removeAttr('class').html()//=& &li&Pear&/li&.hasClass( className )检查匹配的元素是否有给出的类名扩展:nodejs 抓取网页 / nodejs 抓取网页内容 / node 抓取网页复制代码$('.pear').hasClass('pear')//=& true$('apple').hasClass('fruit')//=& false$('li').hasClass('pear')//=& true复制代码.addClass(className)增加class(es)给所有匹配的elements.也可以传函数。$('.pear').addClass('fruit').html()//=& &li&Pear&/li&$('.apple').addClass('fruit red').html()//=& &li&Apple&/li&.removeClass([className])从选择的elements里去除一个或多个有空格分开的class。如果className 没有定义,所有的classes将会被去除,也可以传函数。$('.pear').removeClass('pear').html()//=& &li&Pear&/li&$('.apple').addClass('red').removeClass().html()//=& &li&Apple&/li&.toggleClass( className, [switch] )添加或删除class,依赖于当前是否有该class.$('.apple.green').toggleClass('fruit green red').html()//=& &li&Apple&/li&$('.apple.green').toggleClass('fruit green red', true).html()//=& &li&Apple&/li&.is( selector ).is( element ).is( selection ).is( function(index) )有任何元素匹配selector就返回true。如果使用判定函数,判定函数在选中的元素中执行,所以this指向当前的元素。Traversing.find(selector)获得一个在匹配的元素中由选择器滤过的后代。$('#fruits').find('li').length//=& 3.parent([selector])获得每个匹配元素的parent,可选择性的通过selector筛选。$('.pear').parent().attr('id')//=& fruits.parents([selector])获得通过选择器筛选匹配的元素的parent集合。$('.orange').parents().length// =& 2$('.orange').parents('#fruits').length// =& 1.closest([selector])对于每个集合内的元素,通过测试这个元素和DOM层级关系上的祖先元素,获得第一个匹配的元素$('.orange').closest()// =& []$('.orange').closest('.apple')// =& []$('.orange').closest('li')// =& [&li&Orange&/li&]$('.orange').closest('#fruits')// =& [&ul id="fruits"& ... &/ul&].next()获得第一个本元素之后的同级元素$('.apple').next().hasClass('orange')//=& true.nextAll()获得本元素之后的所有同级元素$('.apple').nextAll()//=& [&li&Orange&/li&, &li&Pear&/li&].prev()获得本元素之前的第一个同级元素$('.orange').prev().hasClass('apple')//=& true.preAll()$('.pear').prevAll()//=& [&li&Orange&/li&, &li&Apple&/li&]获得本元素前的所有同级元素.slice(start,[end])获得选定范围内的元素$('li').slice(1).eq(0).text()//=& 'Orange'$('li').slice(1,2).length//=& 1.siblings(selector)获得被选择的同级元素,不包括本身$('.pear').siblings().length//=& 2$('.pear').siblings('.orange').length//=& 1.children(selector)获被选择元素的子元素$('#fruits').children().length//=& 3$('#fruits').children('.pear').text()//=& Pear.each(function(index,element))迭代一个cheerio对象,为每个匹配元素执行一个函数。When the callback is fired, the function is fired in the context of the DOM element, so this refers to the current element, which is equivalent to the function parameter element.要提早跳出循环,返回false.复制代码var fruits =[];$('li').each(function(i, elem){fruits[i]= $(this).text();});fruits.join(', ');//=& Apple, Orange, Pear复制代码.map(function(index,element))迭代一个cheerio对象,为每个匹配元素执行一个函数。Map会返回一个迭代结果的数组。the function is fired in the context of the DOM element, so this refers to the current element, which is equivalent to the function parameter element$('li').map(function(i, el){// this === elreturn $(this).attr('class');}).join(', ');//=& apple, orange, pear.filter(selector).filter(function(index))迭代一个cheerio对象,滤出匹配选择器或者是传进去的函数的元素。如果使用函数方法,这个函数在被选择的元素中执行,所以this指向的手势当前元素。扩展:nodejs 抓取网页 / nodejs 抓取网页内容 / node 抓取网页Selector:$('li').filter('.orange').attr('class');//=& orangeFunction:$('li').filter(function(i, el){// this === elreturn $(this).attr('class')==='orange';}).attr('class')//=& orange.first()会选择chreeio对象的第一个元素$('#fruits').children().first().text()//=& Apple.last()$('#fruits').children().last().text()//=& Pear会选择chreeio对象的最后一个元素.eq(i)通过索引筛选匹配的元素。使用.eq(-i)就从最后一个元素向前数。$('li').eq(0).text()//=& Apple$('li').eq(-1).text()//=& PearManipulation改变DOM结构的方法.append(content,[content...])在每个元素最后插入一个子元素复制代码$('ul').append('&li&Plum&/li&')$.html()//=& &ul id="fruits"&// &li&Apple&/li&// &li&Orange&/li&// &li&Pear&/li&// &li&Plum&/li&// &/ul&复制代码.prepend(content,[content,...])在每个元素最前插入一个子元素复制代码$('ul').prepend('&li&Plum&/li&')$.html()//=& &ul id="fruits"&// &li&Plum&/li&// &li&Apple&/li&// &li&Orange&/li&// &li&Pear&/li&// &/ul&复制代码.after(content,[content,...])在每个匹配元素之后插入一个元素复制代码$('.apple').after('&li&Plum&/li&')$.html()//=& &ul id="fruits"&// &li&Apple&/li&// &li&Plum&/li&// &li&Orange&/li&// &li&Pear&/li&// &/ul&复制代码.before(content,[content,...])在每个匹配的元素之前插入一个元素复制代码$('.apple').before('&li&Plum&/li&')$.html()//=& &ul id="fruits"&// &li&Plum&/li&// &li&Apple&/li&// &li&Orange&/li&// &li&Pear&/li&// &/ul&复制代码.remove( [selector] )从DOM中去除匹配的元素和它们的子元素。选择器用来筛选要删除的元素。$('.pear').remove()$.html()//=& &ul id="fruits"&// &li&Apple&/li&// &li&Orange&/li&// &/ul&.replaceWith( content )替换匹配的的元素复制代码var plum = $('&li&Plum&/li&')$('.pear').replaceWith(plum)$.html()//=& &ul id="fruits"&// &li&Apple&/li&// &li&Orange&/li&// &li&Plum&/li&// &/ul&复制代码.empty()清空一个元素,移除所有的子元素$('ul').empty()$.html()//=& &ul id="fruits"&&/ul&.html( [htmlString] )获得元素的HTML字符串。如果htmlString有内容的话,将会替代原来的HTML$('.orange').html()//=& Orange$('#fruits').html('&li&Mango&/li&').html()//=& &li&Mango&/li&.text( [textString] )获得元素的text内容,包括子元素。如果textString被指定的话,每个元素的text内容都会被替换。复制代码$('.orange').text()//=& Orange$('ul').text()//=& Apple// Orange// Pear复制代码Rendering如果你想呈送document,你能使用html多效用函数。$.html()//=& &ul id="fruits"&// &li&Apple&/li&// &li&Orange&/li&// &li&Pear&/li&// &/ul&如果你想呈送outerHTML,你可以使用 $.html(selector)$.html('.pear')//=& &li&Pear&/li&By default, html will leave some tags open. Sometimes you may instead want to render a valid XML document. For example, you might parse the following XML snippet:$ = cheerio.load('&media:thumbnail url="http://www.foo.com/keyframe.jpg" width="75" height="50" time="12:05:01.123"/&');... and later want to render to XML. To do this, you can use the 'xml' utility function:$.xml()//=& &media:thumbnail url="http://www.foo.com/keyframe.jpg" width="75" height="50" time="12:05:01.123"/&扩展:nodejs 抓取网页 / nodejs 抓取网页内容 / node 抓取网页Miscellaneous不属于其它地方的DOM 元素方法.toArray()取得所有的在DOM元素,转化为数组、$('li').toArray()//=& [ {...}, {...}, {...} ].clone()克隆cheerio对象var moreFruit = $('#fruits').clone()Utilities$.rootSometimes you need to work with the top-level root element. To query it, you can use $.root().$.root().append('&ul id="vegetables"&&/ul&').html();//=& &ul id="fruits"&...&/ul&&ul id="vegetables"&&/ul&$.contains( container, contained )查看cotained元素是否是container元素的子元素$.parseHTML( data [, context ] [, keepScripts ] )将字符串解析为DOM节点数组。context参数对chreeio没有意义,但是用来维护APi的兼容性。扩展:nodejs 抓取网页 / nodejs 抓取网页内容 / node 抓取网页三 : 33款可用来抓数据的开源爬虫软件工具要玩大数据,没有数据怎么玩?这里推荐一些33款开源爬虫软件给大家。爬虫,即网络爬虫,是一种自动获取网页内容的程序。是搜索引擎的重要组成部分,因此搜索引擎优化很大程度上就是针对爬虫而做出的优化。网络爬虫是一个自动提取网页的程序,它为搜索引擎从万维网上下载网页,是搜索引擎的重要组成。传统爬虫从一个或若干初始网页的URL开始,获得初始网页上的URL,在抓取网页的过程中,不断从当前页面上抽取新的URL放入队列,直到满足系统的一定停止条件。聚焦爬虫的工作流程较为复杂,需要根据一定的网页分析算法过滤与主题无关的链接,保留有用的链接并将其放入等待抓取的URL队列。然后,它将根据一定的搜索策略从队列中选择下一步要抓取的网页URL,并重复上述过程,直到达到系统的某一条件时停止。另外,所有被爬虫抓取的网页将会被系统存贮,进行一定的分析、过滤,并建立索引,以便之后的查询和检索;对于聚焦爬虫来说,这一过程所得到的分析结果还可能对以后的抓取过程给出反馈和指导。世界上已经成型的爬虫软件多达上百种,本文对较为知名及常见的开源爬虫软件进行梳理,按开发语言进行汇总。虽然搜索引擎也有爬虫,但本次我汇总的只是爬虫软件,而非大型、复杂的搜索引擎,因为很多兄弟只是想爬取数据,而非运营一个搜索引擎。Java爬虫1. ArachnidArachnid是一个基于Java的web spider框架.它包含一个简单的HTML剖析器能够分析包含HTML内容的输入流.通过实现Arachnid的子类就能够开发一个简单的Web spiders并能够在Web站上的每个页面被解析之后增加几行代码调用。 Arachnid的下载包中包含两个spider应用程序例子用于演示如何使用该框架。特点:微型爬虫框架,含有一个小型HTML解析器许可证:GPL2、crawlzillacrawlzilla 是一个帮你轻松建立搜索引擎的自由软件,有了它,你就不用依靠商业公司的搜索引擎,也不用再烦恼公司內部网站资料索引的问题。由 nutch 专案为核心,并整合更多相关套件,并卡发设计安装与管理UI,让使用者更方便上手。crawlzilla 除了爬取基本的 html 外,还能分析网页上的文件,如( doc、pdf、ppt、ooo、rss )等多种文件格式,让你的搜索引擎不只是网页搜索引擎,而是网站的完整资料索引库。拥有中文分词能力,让你的搜索更精准。crawlzilla的特色与目标,最主要就是提供使用者一个方便好用易安裝的搜索平台。授权协议: Apache License 2开发语言: Java JavaScript SHELL操作系统: Linux项目主页:https://github.com/shunfa/crawlzilla下载地址:http://sourceforge.net/projects/crawlzilla/特点:安装简易,拥有中文分词功能3、Ex-CrawlerEx-Crawler 是一个网页爬虫,采用 Java 开发,该项目分成两部分,一个是守护进程,另外一个是灵活可配置的 Web 爬虫。使用数据库存储网页信息。授权协议: GPLv3开发语言: Java操作系统: 跨平台特点:由守护进程执行,使用数据库存储网页信息4、HeritrixHeritrix 是一个由 java 开发的、开源的网络爬虫,用户可以使用它来从网上抓取想要的资源。其最出色之处在于它良好的可扩展性,方便用户实现自己的抓取逻辑。Heritrix采用的是模块化的设计,各个模块由一个控制器类(CrawlController类)来协调,控制器是整体的核心。代码托管:https://github.com/internetarchive/heritrix3授权协议: Apache开发语言: Java操作系统:跨平台特点:严格遵照robots文件的排除指示和META robots标签5、heyDrheyDr是一款基于java的轻量级开源多线程垂直检索爬虫框架,遵循GNU GPL V3协议。用户可以通过heyDr构建自己的垂直资源爬虫,用于搭建垂直搜索引擎前期的数据准备。授权协议: GPLv3开发语言: Java操作系统: 跨平台特点:轻量级开源多线程垂直检索爬虫框架6、ItSucksItSucks是一个java web spider(web机器人,爬虫)开源项目。支持通过下载模板和正则表达式来定义下载规则。提供一个swing GUI操作界面。特点:提供swing GUI操作界面7、jcrawljcrawl是一款小巧性能优良的的web爬虫,它可以从网页抓取各种类型的文件,基于用户定义的符号,比如email,qq.授权协议: Apache开发语言: Java操作系统: 跨平台特点:轻量、性能优良,可以从网页抓取各种类型的文件8、JSpiderJSpider是一个用Java实现的WebSpider,JSpider的执行格式如下:jspider [URL] [ConfigName]URL一定要加上协议名称,如:http://,否则会报错。如果省掉ConfigName,则采用默认配置。JSpider 的行为是由配置文件具体配置的,比如采用什么插件,结果存储方式等等都在conf\[ConfigName]\目录下设置。JSpider默认的配置种类 很少,用途也不大。但是JSpider非常容易扩展,可以利用它开发强大的网页抓取与数据分析工具。要做到这些,需要对JSpider的原理有深入的了 解,然后根据自己的需求开发插件,撰写配置文件。授权协议: LGPL开发语言: Java操作系统: 跨平台特点:功能强大,容易扩展9、Leopdo用JAVA编写的web 搜索和爬虫,包括全文和分类垂直搜索,以及分词系统授权协议: Apache开发语言: Java操作系统: 跨平台特点:包括全文和分类垂直搜索,以及分词系统10、MetaSeeker是一套完整的网页内容抓取、格式化、数据集成、存储管理和搜索解决方案。网络爬虫有多种实现方法,如果按照部署在哪里分,可以分成:服务器侧:一般是一个多线程程序,同时下载多个目标HTML,可以用PHP, Java, Python(当前很流行)等做,可以速度做得很快,一般综合搜索引擎的爬虫这样做。但是,如果对方讨厌爬虫,很可能封掉你的IP,服务器IP又不容易 改,另外耗用的带宽也是挺贵的。建议看一下Beautiful soap。客户端:一般实现定题爬虫,或者是聚焦爬虫,做综合搜索引擎不容易成功,而垂直搜诉或者比价服务或者推荐引擎,相对容易很多,这类爬虫不是什么页面都 取的,而是只取你关系的页面,而且只取页面上关心的内容,例如提取黄页信息,商品价格信息,还有提取竞争对手广告信息的,搜一下Spyfu,很有趣。这类 爬虫可以部署很多,而且可以很有侵略性,对方很难封锁。MetaSeeker中的网络爬虫就属于后者。MetaSeeker工具包利用Mozilla平台的能力,只要是Firefox看到的东西,它都能提取。MetaSeeker工具包是免费使用的,下载地址:www.gooseeker.com/cn/node/download/front特点:网页抓取、信息提取、数据抽取工具包,操作简单11、Playfishplayfish是一个采用java技术,综合应用多个开源java组件实现的网页抓取工具,通过XML配置文件实现高度可定制性与可扩展性的网页抓取工具应用开源jar包包括httpclient(内容读取),dom4j(配置文件解析),jericho(html解析),已经在 war包的lib下。这个项目目前还很不成熟,但是功能基本都完成了。要求使用者熟悉XML,熟悉正则表达式。目前通过这个工具可以抓取各类论坛,贴吧,以及各类CMS系统。像Discuz!,phpbb,论坛跟博客的文章,通过本工具都可以轻松抓取。抓取定义完全采用XML,适合Java开发人员使用。使用方法:下载右边的.war包导入到eclipse中,使用WebContent/sql下的wcc.sql文件建立一个范例数据库,修改src包下wcc.core的dbConfig.txt,将用户名与密码设置成你自己的mysql用户名密码。然后运行SystemCore,运行时候会在控制台,无参数会执行默认的example.xml的配置文件,带参数时候名称为配置文件名。系统自带了3个例子,分别为baidu.xml抓取百度知道,example.xml抓取我的javaeye的博客,bbs.xml抓取一个采用 discuz论坛的内容。授权协议: MIT开发语言: Java操作系统: 跨平台特点:通过XML配置文件实现高度可定制性与可扩展性12、SpidermanSpiderman 是一个基于微内核+插件式架构的网络蜘蛛,它的目标是通过简单的方法就能将复杂的目标网页信息抓取并解析为自己所需要的业务数据。怎么使用?首先,确定好你的目标网站以及目标网页(即某一类你想要获取数据的网页,例如网易新闻的新闻页面)然后,打开目标页面,分析页面的HTML结构,得到你想要数据的XPath,具体XPath怎么获取请看下文。最后,在一个xml配置文件里填写好参数,运行Spiderman吧!授权协议: Apache开发语言: Java操作系统: 跨平台特点:灵活、扩展性强,微内核+插件式架构,通过简单的配置就可以完成数据抓取,无需编写一句代码13、webmagicwebmagic的是一个无须配置、便于二次开发的爬虫框架,它提供简单灵活的API,只需少量代码即可实现一个爬虫。webmagic采用完全模块化的设计,功能覆盖整个爬虫的生命周期(链接提取、页面下载、内容抽取、持久化),支持多线程抓取,分布式抓取,并支持自动重试、自定义UA/cookie等功能。webmagic包含强大的页面抽取功能,开发者可以便捷的使用css selector、xpath和正则表达式进行链接和内容的提取,支持多个选择器链式调用。webmagic的使用文档:http://webmagic.io/docs/查看源代码:http://git.oschina.net/flashsword20/webmagic授权协议: Apache开发语言: Java操作系统: 跨平台特点:功能覆盖整个爬虫生命周期,使用Xpath和正则表达式进行链接和内容的提取。备注:这是一款国产开源软件,由 黄亿华贡献14、Web-HarvestWeb-Harvest是一个Java开源Web数据抽取工具。它能够收集指定的Web页面并从这些页面中提取有用的数据。Web-Harvest主要是运用了像XSLT,XQuery,正则表达式等这些技术来实现对text/xml的操作。其实现原理是,根据预先定义的配置文件用httpclient获取页面的全部内容(关于httpclient的内容,本博有些文章已介绍),然后运用XPath、XQuery、正则表达式等这些技术来实现对text/xml的内容筛选操作,选取精确的数据。前两年比较火的垂直搜索(比如:酷讯等)也是采用类似的原理实现的。Web-Harvest应用,关键就是理解和定义配置文件,其他的就是考虑怎么处理数据的Java代码。当然在爬虫开始前,也可以把Java变量填充到配置文件中,实现动态的配置。授权协议: BSD开发语言: Java特点:运用XSLT、XQuery、正则表达式等技术来实现对Text或XML的操作,具有可视化的界面15、WebSPHINXWebSPHINX是一个Java类包和Web爬虫的交互式开发环境。Web爬虫(也叫作机器人或蜘蛛)是可以自动浏览与处理Web页面的程序。WebSPHINX由两部分组成:爬虫工作平台和WebSPHINX类包。授权协议:Apache开发语言:Java特点:由两部分组成:爬虫工作平台和WebSPHINX类包16、YaCyYaCy基于p2p的分布式Web搜索引擎.同时也是一个Http缓存代理服务器.这个项目是构建基于p2p Web索引网络的一个新方法.它可以搜索你自己的或全局的索引,也可以Crawl自己的网页或启动分布式Crawling等.授权协议: GPL开发语言: Java Perl操作系统: 跨平台特点:基于P2P的分布式Web搜索引擎Python爬虫17、QuickReconQuickRecon是一个简单的信息收集工具,它可以帮助你查找子域名名称、perform zone transfe、收集电子邮件地址和使用microformats寻找人际关系等。QuickRecon使用python编写,支持linux和 windows操作系统。授权协议: GPLv3开发语言: Python操作系统: Windows Linux特点:具有查找子域名名称、收集电子邮件地址并寻找人际关系等功能18、PyRailgun这是一个非常简单易用的抓取工具。支持抓取javascript渲染的页面的简单实用高效的python网页爬虫抓取模块授权协议: MIT开发语言: Python操作系统: 跨平台 Windows Linux OS X特点:简洁、轻量、高效的网页抓取框架备注:此软件也是由国人开放github下载:https://github.com/princehaku/pyrailgun#readme19、ScrapyScrapy 是一套基于基于Twisted的异步处理框架,纯python实现的爬虫框架,用户只需要定制开发几个模块就可以轻松的实现一个爬虫,用来抓取网页内容以及各种图片,非常之方便~授权协议: BSD开发语言: Python操作系统: 跨平台github源代码:https://github.com/scrapy/scrapy特点:基于Twisted的异步处理框架,文档齐全C++爬虫20、hispiderHiSpider is a fast and high performance spider with high speed严格说只能是一个spider系统的框架, 没有细化需求, 目前只是能提取URL, URL排重, 异步DNS解析, 队列化任务, 支持N机分布式下载, 支持网站定向下载(需要配置hispiderd.ini whitelist).特征和用法:基于unix/linux系统的开发异步DNS解析URL排重支持HTTP 压缩编码传输 gzip/deflate字符集判断自动转换成UTF-8编码文档压缩存储支持多下载节点分布式下载支持网站定向下载(需要配置 hispiderd.ini whitelist )可通过 http://127.0.0.1:3721/ 查看下载情况统计,下载任务控制(可停止和恢复任务)依赖基本通信库libevbase 和 libsbase (安装的时候需要先安装这个两个库)、工作流程:从中心节点取URL(包括URL对应的任务号, IP和port,也可能需要自己解析)连接服务器发送请求等待数据头判断是否需要的数据(目前主要取text类型的数据)等待完成数据(有length头的直接等待说明长度的数据否则等待比较大的数字然后设置超时)数据完成或者超时, zlib压缩数据返回给中心服务器,数据可能包括自己解析DNS信息, 压缩后数据长度+压缩后数据, 如果出错就直接返回任务号以及相关信息中心服务器收到带有任务号的数据, 查看是否包括数据, 如果没有数据直接置任务号对应的状态为错误, 如果有数据提取数据种link 然后存储数据到文档文件.完成后返回一个新的任务.授权协议: BSD开发语言: C/C++操作系统: Linux特点:支持多机分布式下载, 支持网站定向下载21、larbinlarbin是一种开源的网络爬虫/网络蜘蛛,由法国的年轻人 Sébastien Ailleret独立开发。larbin目的是能够跟踪页面的url进行扩展的抓取,最后为搜索引擎提供广泛的数据来源。Larbin只是一个爬虫,也就 是说larbin只抓取网页,至于如何parse的事情则由用户自己完成。另外,如何存储到数据库以及建立索引的事情 larbin也不提供。一个简单的larbin的爬虫可以每天获取500万的网页。利用larbin,我们可以轻易的获取/确定单个网站的所有链接,甚至可以镜像一个网站;也可以用它建立url 列表群,例如针对所有的网页进行 url retrive后,进行xml的联结的获取。或者是 mp3,或者定制larbin,可以作为搜索引擎的信息的来源。授权协议: GPL开发语言: C/C++操作系统: Linux特点:高性能的爬虫软件,只负责抓取不负责解析22、MethabotMethabot 是一个经过速度优化的高可配置的 WEB、FTP、本地文件系统的爬虫软件。授权协议: 未知开发语言: C/C++操作系统: Windows Linux特点:过速度优化、可抓取WEB、FTP及本地文件系统源代码:http://www.oschina.net/code/tag/methabotC#爬虫23、NWebCrawlerNWebCrawler是一款开源,C#开发网络爬虫程序。特性:可配置:线程数,等待时间,连接超时,允许MIME类型和优先级,下载文件夹。统计信息:URL数量,总下载文件,总下载字节数,CPU利用率和可用内存。Preferential crawler:用户可以设置优先级的MIME类型。Robust: 10+ URL normalization rules, crawler trap avoiding rules.授权协议: GPLv2开发语言: C#操作系统: Windows项目主页:http://www.open-open.com/lib/view/home/8特点:统计信息、执行过程可视化24、Sinawler国内第一个针对微博数据的爬虫程序!原名“新浪微博爬虫”。登录后,可以指定用户为起点,以该用户的关注人、粉丝为线索,延人脉关系搜集用户基本信息、微博数据、评论数据。该应用获取的数据可作为科研、与新浪微博相关的研发等的数据支持,但请勿用于商业用途。该应用基于.NET2.0框架,需SQL SERVER作为后台数据库,并提供了针对SQL Server的数据库脚本文件。另外,由于新浪微博API的限制,爬取的数据可能不够完整(如获取粉丝数量的限制、获取微博数量的限制等)本程序版权归作者所有。你可以免费: 拷贝、分发、呈现和表演当前作品,制作派生作品。 你不可将当前作品用于商业目的。5.x版本已经发布! 该版本共有6个后台工作线程:爬取用户基本信息的机器人、爬取用户关系的机器人、爬取用户标签的机器人、爬取微博内容的机器人、爬取微博评论的机器人,以及调节请求频率的机器人。更高的性能!最大限度挖掘爬虫潜力! 以现在测试的结果看,已经能够满足自用。本程序的特点:6个后台工作线程,最大限度挖掘爬虫性能潜力!界面上提供参数设置,灵活方便抛弃app.config配置文件,自己实现配置信息的加密存储,保护数据库帐号信息自动调整请求频率,防止超限,也避免过慢,降低效率任意对爬虫控制,可随时暂停、继续、停止爬虫良好的用户体验授权协议: GPLv3开发语言: C# .NET操作系统: Windows25、spidernetspidernet是一个以递归树为模型的多线程web爬虫程序, 支持text/html资源的获取. 可以设定爬行深度, 最大下载字节数限制, 支持gzip解码, 支持以gbk(gb2312)和utf8编码的资源; 存储于sqlite数据文件.源码中TODO:标记描述了未完成功能, 希望提交你的代码.授权协议: MIT开发语言: C#操作系统: Windowsgithub源代码:https://github.com/nsnail/spidernet特点:以递归树为模型的多线程web爬虫程序,支持以GBK (gb2312)和utf8编码的资源,使用sqlite存储数据26、Web Crawlermart and Simple Web Crawler是一个Web爬虫框架。集成Lucene支持。该爬虫可以从单个链接或一个链接数组开始,提供两种遍历模式:最大迭代和最大深度。可以设置 过滤器限制爬回来的链接,默认提供三个过滤器ServerFilter、BeginningPathFilter和 RegularExpressionFilter,这三个过滤器可用AND、OR和NOT联合。在解析过程或页面加载前后都可以加监听器。介绍内容来自Open-Open开发语言: Java操作系统: 跨平台授权协议: LGPL特点:多线程,支持抓取PDF/DOC/EXCEL等文档来源27、网络矿工网站数据采集软件 网络矿工采集器(原soukey采摘)Soukey采摘网站数据采集软件是一款基于.Net平台的开源软件,也是网站数据采集软件类型中唯一一款开源软件。尽管Soukey采摘开源,但并不会影响软件功能的提供,甚至要比一些商用软件的功能还要丰富。授权协议: BSD开发语言: C# .NET操作系统: Windows特点:功能丰富,毫不逊色于商业软件PH[www.loach.net.cn]P爬虫28、OpenWebSpiderOpenWebSpider是一个开源多线程Web Spider(robot:机器人,crawler:爬虫)和包含许多有趣功能的搜索引擎。授权协议: 未知开发语言: PHP操作系统: 跨平台特点:开源多线程网络爬虫,有许多有趣的功能29、PhpDigPhpDig是一个采用PHP开发的Web爬虫和搜索引擎。通过对动态和静态页面进行索引建立一个词汇表。当搜索查询时,它将按一定的排序规则显示包含关 键字的搜索结果页面。PhpDig包含一个模板系统并能够索引PDF,Word,Excel,和PowerPoint文档。PHPdig适用于专业化更 强、层次更深的个性化搜索引擎,利用它打造针对某一领域的垂直搜索引擎是最好的选择。演示:http://www.phpdig.net/navigation.php?action=demo授权协议: GPL开发语言: PHP操作系统: 跨平台特点:具有采集网页内容、提交表单功能30、ThinkUpThinkUp 是一个可以采集推特,facebook等社交网络数据的社会媒体视角引擎。通过采集个人的社交网络账号中的数据,对其存档以及处理的交互分析工具,并将数据图形化以便更直观的查看。授权协议: GPL开发语言: PHP操作系统: 跨平台github源码:https://github.com/ThinkUpLLC/ThinkUp特点:采集推特、脸谱等社交网络数据的社会媒体视角引擎,可进行交互分析并将结果以可视化形式展现31、微购微购社会化购物系统是一款基于ThinkPHP框架开发的开源的购物分享系统,同时它也是一套针对站长、开源的的淘宝客网站程序,它整合了淘宝、天猫、淘宝客等300多家商品数据采集接口,为广大的淘宝客站长提供傻瓜式淘客建站服务,会HTML就会做程序模板,免费开放下载,是广大淘客站长的首选。演示网址:http://tlx.wego360.com授权协议: GPL开发语言: PHP操作系统: 跨平台ErLang爬虫32、EbotEbot 是一个用 ErLang 语言开发的可伸缩的分布式网页爬虫,URLs 被保存在数据库中可通过 RESTful 的 HTTP 请求来查询。授权协议: GPLv3开发语言: ErLang操作系统: 跨平台github源代码:https://github.com/matteoredaelli/ebot项目主页: http://www.redaelli.org/matteo/blog/projects/ebot特点:可伸缩的分布式网页爬虫Ruby爬虫33、SpidrSpidr 是一个Ruby 的网页爬虫库,可以将整个网站、多个网站、某个链接完全抓取到本地。开发语言: Ruby授权协议:MIT特点:可将一个或多个网站、某个链接完全抓取到本地本文由36大数据收集整理原文地址:http://www.36dsj.com/archives/34383四 : 利用SAS抓取网页数据总结及案例故事来由本人以前有一小站www.daaata.com刊登几篇关于利用SAS抓取网页数据的小文,然后挂了个链接在人大论坛。后因懒惰,此站挂掉,相继有人询问。在从新有此博后打算把其中一篇简单易懂的补上,另外几篇译文已被@统计网收录,文章末尾会贴上链接。适用性下面的此案例相同方式理论都可以进去获取。P.S. @AJAX数据库实例|| @AJAX数据库实例讲解正文前戏有时我们常常需要保存备份某些网上的数据,如银行利率,股票行情,抑或统计局、各种金融机构或其他类型网站的数据。有时这些网站会提供历史数据,有的则不会。但是我们可以通过SAS每天跑下程序获取累积历史数据作为后来的分析之用。现在我拿获取http://www.shibor.org/主页,上海银行间同业拆放利率,作为案例进行演示。以下为主页上我们想要的数据当我们打开此网页,并进到网页源码中时,我们会惊讶的发现。什么情况,在主页上看到的数据在源码里找不到,难道使用了别的技术。我们大概浏览一下源码所表示的网页布局。按网页布局来说,一大坨文字的后面就应该放最新Shibor数据的源码,而他放了一句。&iframe scrolling="no" src ="/shibor/web/html/shibor.html" width="377" height="473" frameborder="0" name="shibordata"&&/iframe&这是html内联框架结构,就是说他把数据放另一个网页上了,然后把这个网页嵌在主页里。好,那我们就打开此网页并查看源码,发现数据就存在此网页中,那我们就开始用SAS抓它一下。高潮首先介绍下Filename,利用它加上infile语句就可以把网页当成文件导入SAS数据集。 TheFILENAME Statement (URL Access Method) in BaseSAS, enables users to access the source code from a web site andread it into a data set. The syntax for this statement is:FILENAME fileref URL 'external-file'&url-options&;把Shibor数据网页导入SAS数据集。我们知道网页数据是标记语言,服从一定规范,所有属性设置都被&&包含。所以我们利用dlm="&"把它分隔导入到一个变量中,因为数据(www.loach.net.cn)太乱,我们没法分清使之导入到不同变量。FILENAME SOURCE URL "%STR()" DEBUG;DATA Zhaocl01; FORMAT WEBPAGE $1000.; INFILE SOURCE LRECL=32767 DELIMITER="&"; INPUT WEBPAGE $ @@;RUN;因为我们利用了dlm="&"进行了分隔,所以我们清楚收集到的观测值只要以&开头就说明这条观测只有设置语言,没有我们想要的数据。而我们真正要要的数据肯定都在&标识符的前面。因为在网页源码中会用&nbsp代表空格,&amp代表连字符,所以把他们进行替换。DATA Zhaocl02; SET Zhaocl01; WHERE WEBPAGE LIKE "_%&%"; TEXT=SUBSTRN(WEBPAGE,1,FIND(WEBPAGE,"&")-1); TEXT=TRANWRD(TEXT,"%NRSTR()"," "); TEXT=TRANWRD(TEXT,"%NRSTR(&)","&"); IF ANYALPHA(TEXT) + ANYDIGIT(TEXT) LT 1 THEN DELETE; KEEP TEXT;RUN;结局拿到了清理后的数据集,打开看下已经很清楚了。我们只要再做下最后简单的加工就好了。注意,由于网页布局的变动这段程序也可能要随之稍加修改。data Zhaocl03; set Zhaocl02; set Zhaocl02(firstobs=2 rename=(text=next1)); set Zhaocl02(firstobs=3 rename=(text=next2)); if text in ("O/N","1W","2W","1M","3M","6M","9M","1Y"); label text='期限' next1='Shibor(%)' next2='涨跌(BP)';其他正则表达式在处理网页数据时,有一个利器就是正则表达式,威力巨大。比如:prxchange("s/&.+?&//",-1,WEBPAGE ); 就可以去除所有&&包含的内容。但是一定要在对自己获取数据悉十分透彻的情况下使用,以防遗漏重要信息。相关资源A Guide to Crawling the Web with SAS? http://www.sascommunity.org/wiki/Simple_Web_Crawler_with_SAS_Macro_and_SAS_Data_Stephttp://support.sas.com/resources/papers/proceedings10/053-2010.pdf被收录的译文,网络爬虫—利用SAS抓取网页方法 转载自:备注:配合fiddler一起使用,基本上所有的页面内容(静态的,动态的,异步加载的等)都可以抓的到了!五 : 网页分页数据抓取的几种方式网页分页数据抓取的几种方式&相信所有个人网站的站长都有抓取别人数据的经历吧,目前抓取别人网站数据的方式无非两种方式:&&一、使用第三方工具,其中最著名的是火车头采集器,在此不做介绍。(www.loach.net.cn)&二、自己写程序抓取,这种方式要求站长自己写程序,可能对对站长的开发能力有所要求了。&本人起初也曾试着用第三方的工具抓取我所需要的数据,由于网上的流行的第三方工具不是不符合我的要求,就是过于复杂,我一时没有搞明白怎么用,后来索性决定自己写吧,现在本人基本上半天可以搞定一个网站(只是程序开发时间,不包括数据抓取的时间)。&&&经过一段时间的数据抓取生涯,也曾遇到了很多困难,其中最常见的一个就是关于分页数据的抓取问题,原因在于分数据分页的形式有很多种,下面我主要针对三种形式介绍一下抓取分页数据的方法,此类文章虽然在网上见过很多,但每次拿别人的代码总也总是有各种各样的问题,下面各种方式的代码都是能正确执行,并且我目前也正在使用中的。本文中代码实现是用C#语言来实现的,我想其他语言原理大致相同下面切入正题:&&&&第一种方式:URL地址中包含分页信息,这种形式是最简单的,这种形式使用第三方工具抓取也很简单,基本上不用写代码,对于我这种宁可自己花个半天时间写代码也懒得学第三方工具的人,还是通过自己写代码实现了;&&&&这种方式就是通过循环生成数据分页的URL地址 如:&这样通过HttpWebRequest访问对应URL地址,返回对应页面的html文本,接下来的任务就是对字符串的解析,将需要的内容保存到本地数据库内;抓取的代码可参考下面:&public string GetResponseString(string url)&&&&&&&{&&&&&&&&&&&&&&&&&&&&&&string _StrResponse = "";&&&&&&&&&&&HttpWebRequest _WebRequest = (HttpWebRequest)WebRequest.Create(url);&&&&&&&&&&&_WebRequest.UserAgent = "MOZILLA/4.0 (COMPATIBLE; MSIE 7.0; WINDOWS NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.; .NET CLR 3.5.21022; .NET CLR 3.0.; .NET CLR 3.5.30729)";&&&&&&&&&&&_WebRequest.Method = "GET";&&&&&&&&&&&WebResponse _WebResponse = _WebRequest.GetResponse();&&&&&&&&&&&StreamReader _ResponseStream = new StreamReader(_WebResponse.GetResponseStream(), System.Text.Encoding.GetEncoding("gb2312"));&&&&&&&&&&&_StrResponse = _ResponseStream.ReadToEnd();&&&&&&&&&&&_WebResponse.Close();&&&&&&&&&&&_ResponseStream.Close();&&&&&&&&&&&return _StrR&&&&&&&}&&上面的代码可以返回对应页面的html内容的字符串,剩下的工作就是从这个字符串中获取自己关心的信息了。第二种方式:可能是通过asp.net开发的网站常会遇到,它的分页控件通过post方式 提交分页信息到后台代码,如.net下Gridview自带的分页功能,当你点击分页的页码时,会发现URL地址没有变化,但页码变化了,页面内容也变化,仔细看会发现,把鼠标移到每个页码上的时候状态栏会显示 javascript:__dopostback("gridview","page1")等等 之类的代码,这种形式其实也不是很难,因为毕竟有地方得到页码的规律可寻。&&我们知道http请求提交的方式有两种一种是get一种是Post,第一种方式是get方式,那么第二种方式就是post方式,具体提交的原理不必细说,不是本文的重点抓取这种页面 需要注意asp.net页面的几个重要的元素&&一、 __VIEWSTATE ,这个应该是.net特有的,也是让.net开发人员既爱又恨的东西,当你打开一个网站的某一个页面的时候,如果发现这个东西,而且后面还跟随着一大堆乱七八糟的字符的时候,那这个网站肯定是用asp.net写的了;&&二、__dopostback方法,这个是asp.net页面自动生成一个javascript方法,包含两个参数,__EVENTTARGET,__EVENTARGUMENT,这两个参数可以参看页码对应的内容,因为点击翻页的时候,会将页码信息传给这两个参数。&&三、__EVENTVALIDATION 这个也也应该是asp.net特有的东西大家也不用 太关心这三个东西都是干什么的,只需要注意自己写代码抓取页面的时候 记得提交这三个元素就可以了。&&&和第一种方式一样,肯定要通过循环的方式是去拼凑_dopostback的两个参数,只需要拼其中包含了页码信息的参数即可。这里有一个需要注意的地方,就是在每次通过Post提交请求下一页的时候,先应得到当前页的__VIEWSTATE 信息和__EVENTVALIDATION信息,所以分页数据的第一页可采用第一种方式得到页码内容然后,同时取出对应的__VIEWSTATE 信息和__EVENTVALIDATION信息,然后再做循环处理下一页面,然后每抓取完一个页面,再记录下__VIEWSTATE 信息和__EVENTVALIDATION信息,为下一个页面post提交数据使用参考代码如下:&for (int i = 0; i & 1000; i++)&&&&&&&&&&&{&&&&&&&&&&&&&&&System.Net.WebClient WebClientObj = new System.Net.WebClient();&&&&&&&&&&&&&&&System.Collections.Specialized.NameValueCollection PostVars = new System.Collections.Specialized.NameValueCollection();&&&&&&&&&&&&&&&PostVars.Add("__VIEWSTATE", "此处是您需要提前得到的信息");&&&&&&&&&&&&&&&PostVars.Add("__EVENTVALIDATION", "此处是您需要提前得到的信息");&&&&&&&&&&&&&&&PostVars.Add("__EVENTTARGET", "此处是__dopostback方法对应的参数");&&&&&&&&&&&&&&&PostVars.Add("__EVENTARGUMENT",&"此处是__dopostback方法对应的参数");&&&&&&&&&&&&&&&WebClientObj.Headers.Add("ContentType", "application/x-www-form-urlencoded");&&&&&&&&&&&&&&&try&&&&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&&&byte[] byte1 = WebClientObj.UploadValues("http://www.xxxx.cn/messagelist.aspx", "POST", PostVars);&&&&&&&&&&&&&&&&&&&string ResponseStr = Encoding.UTF8.GetString(byte1);&//得到当前页面对应的html&文本字符串&&&&&&&&&&&&&&&&&&&GetPostValue(ResponseStr);//得到当前页面对应的 __VIEWSTATE 等上面需要的信息,为抓取下一页面使用&&&&&&&&&&&&&&&&&&&SaveMessage(ResponseStr);//保存自己关心的内容到数据库中&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&catch (Exception ex)&&&&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&&&Console.WriteLine(ex.Message);&&&&&&&&&&&&&&&}&&&&&&&&&&&}第三种方式是最麻烦的,也是最恶心的,这种页面 在你翻页的过程中没有任何一个地方可以找到页码信息,这种方式费了我很大的力气,后来采用了一个比较狠的办法,用代码模拟手动翻页,这种方式应该可以处理任何形式的翻页数据,原理就是,用代码模拟人工点击翻页链接,用代码一页一页的翻页,然后一页一页的抓取。
下页更精彩: 1}

我要回帖

更多关于 必应图片爬虫 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信