1. 如何自己写一个网络爬虫
网络爬虫以叫网络蜘蛛,网络机器人,这是一个程序,其会自动的通过网络抓取互联网上的网页,这种技术一般可能用来检查你的站点上所有的链接是否是都是有效的。当然,更为高级的技术是把网页中的相关数据保存下来,可以成为搜索引擎。
从技相来说,实现抓取网页可能并不是一件很困难的事情,困难的事情是对网页的分析和整理,那是一件需要有轻量智能,需要大量数学计算的程序才能做的事情。下面一个简单的流程:
在这里,我们只是说一下如何写一个网页抓取程序。首先我们先看一下,如何使用命令行的方式来找开网页。telnet somesite.com 80
get /index.html 文法,甚至还需要解析javascript,因为现在的网页使用ajax的越来越多了,而很多网页内容都是通过ajax技术加载的,因为,只是简单地解析html
2. 互联网金融爬虫怎么写
Previous on 系列教程:互联网金融爬虫怎么写-第一课 p2p网贷爬虫(XPath入门)互联网金融爬虫怎么写-第二课 雪球网股票爬虫(正则表达式入门)互联网金融爬虫怎么写-第三课 雪球网股票爬虫(ajax分析)哈哈,一小时不见,我又来了,话说出教程就是这么任性,咱们乘热打铁,把上节课分析完成但是没写的代码给完成了!工具要求:教程中主要使用到了 1、神箭手云爬虫 框架 这个是爬虫的基础,2、Chrome浏览器和Chrome的插件XpathHelper 这个用来测试Xpath写的是否正确 3、Advanced REST Client用来模拟提交请求基础知识:本教程中主要用到了一些基础的js和xpath语法,如果对这两种语言不熟悉,可以提前先学习下,都很简单。
还记得我们在遥远的电商系列爬虫教程的第一课里提到具体写爬虫的几个步骤吗?我们沿着路径再来走一遍:第一步:确定入口URL暂且使用这个第一页的ajax的url链接:[html] view plain copy ] view plain copy /stock/cata/stocklist\\.json\\?page=\\d+&size=30&order=desc&orderby=percent&type=11%2C12 在提醒大家一下,这里之所以转义符用了两个是因为在神箭手中,设置正则时,是字符串设置,需要对转义符再做一次转义。
第三步:内容页抽取规则由于ajax返回的是json,而神箭手是支持jsonpath的提取方式的,因此提取规则就很简单了。不过这里要特殊注意的是,由于我们是在列表页抽取数据,因此数据最顶层相当于是一个列表,我们需要在顶层的field上设置一个列表数据的值。
具体抽取规则如下:[javascript] view plain copy fields: [ { name: "stocks", selector: "$.stocks", selectorType:SelectorType.JsonPath, repeated: true, children:[ { name:"code", alias:"代码", selector:"$.code", selectorType:SelectorType.JsonPath, }, { name:"name", alias:"名称", selector:"$.name", selectorType:SelectorType.JsonPath, }, { name:"current", alias:"当前价格", selector:"$.current", selectorType:SelectorType.JsonPath, }, { name:"high", alias:"最高价格", selector:"$.high", selectorType:SelectorType.JsonPath, }, { name:"low", alias:"最低价格", selector:"$.low", selectorType:SelectorType.JsonPath, } ] } ] 我简单抽取了一些信息,其他信息都类似。好了,主要的代码基本已经写好了,剩下的还需要解决两个问题1.爬取前需要先访问一下首页获取cookie2.虽然可以直接加入下一页,但是一共有多少页并不知道。
首先对于第一点,我们只需要在beforeCrawl回调中访问一下首页即可,神箭手会自动对cookie进行处理和保存,具体代码如下:[javascript] view plain copy configs.beforeCrawl = function(site){ site.requestUrl(""); }; 好了,除了下一页基本已经没什么问题了,我们先测试一下看看效果:数据已经出来了,没问题,第一页的数据都有了,那下一页怎么处理呢?我们有两个方案:第一个方案:我们可以看到json的返回值中有一个count字段,这个字段目测应该是总数据量的值,那没我们根据这个值,再加上单页数据条数,我们就可以判断总共有多少页了。第二个方案:我们先访问一下,假设页数很大,看看会雪球会返回什么,我们尝试访问第500页,可以看到返回值中的stocks是0个,那么我们可以根据是否有数据来判断需不需要加下一页。
两个方案各有利弊,我们这里选择用第一个方案来处理,具体代码如下:[javascript] view plain copy configs.onProcessHelperPage = function(page, content, site){ if(page.url.indexOf("page=1&size=30") !== -1){ //如果是第一页 var result = JSON.parse(page.raw); var count = result.count.count; var page_num = Math.ceil(count/30); if(page_num > 1){ for(var i = 2;i<=page_num;i++){ site.addUrl("/stock/cata/stocklist.json?page="+i+"&size=30&order=desc&orderby=percent&type=11%2C12"); } } } }; 好了,通过三课的艰苦奋战,终于完成了雪球沪深一览的征服。先看下跑出来的效果。
完整代码如下:[javascript] view plain copy var configs = { domains: ["xueqiu.com"], scanUrls: ["/stock/cata/stocklist.json?page=1&size=30&order=desc&orderby=percent&type=11%2C12"], contentUrlRegexes: ["/stock/cata/stocklist\\.json\\?page=\\d+&size=30&order=desc&orderby=percent&type=11%2C12"], helperUrlRegexes: ["/stock/cata/stocklist\\.json\\?page=\\d+&size=30&order=desc&orderby=percent&type=11%2C12"], fields: [ { name: "stocks", selec。