如何使用nodejs做爬虫程序
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用nodejs做爬虫程序相关的知识,希望对你有一定的参考价值。
《使用 superagent 与 cheerio 完成简单爬虫》目标
建立一个 lesson3 项目,在其中编写代码。
当在浏览器中访问 http://localhost:3000/ 时,输出 CNode(https://cnodejs.org/ ) 社区首页的所有帖子标题和链接,以 json 的形式。
输出示例:
[
"title": "【公告】发招聘帖的同学留意一下这里",
"href": "http://cnodejs.org/topic/541ed2d05e28155f24676a12"
,
"title": "发布一款 Sublime Text 下的 javascript 语法高亮插件",
"href": "http://cnodejs.org/topic/54207e2efffeb6de3d61f68f"
]
挑战
访问 http://localhost:3000/ 时,输出包括主题的作者,
示例:
[
"title": "【公告】发招聘帖的同学留意一下这里",
"href": "http://cnodejs.org/topic/541ed2d05e28155f24676a12",
"author": "alsotang"
,
"title": "发布一款 Sublime Text 下的 JavaScript 语法高亮插件",
"href": "http://cnodejs.org/topic/54207e2efffeb6de3d61f68f",
"author": "otheruser"
]
知识点
学习使用 superagent 抓取网页
学习使用 cheerio 分析网页
课程内容
Node.js 总是吹牛逼说自己异步特性多么多么厉害,但是对于初学者来说,要找一个能好好利用异步的场景不容易。我想来想去,爬虫的场景就比较适合,没事就异步并发地爬几个网站玩玩。
本来想教大家怎么爬 github 的 api 的,但是 github 有 rate limit 的限制,所以只好牺牲一下 CNode 社区(国内最专业的 Node.js 开源技术社区),教大家怎么去爬它了。
我们这回需要用到三个依赖,分别是 express,superagent 和 cheerio。
先介绍一下,
superagent(http://visionmedia.github.io/superagent/ ) 是个 http 方面的库,可以发起 get 或 post 请求。
cheerio(https://github.com/cheeriojs/cheerio ) 大家可以理解成一个 Node.js 版的 jquery,用来从网页中以 css selector 取数据,使用方式跟 jquery 一样一样的。
还记得我们怎么新建一个项目吗?
新建一个文件夹,进去之后 npm init
安装依赖 npm install --save PACKAGE_NAME
写应用逻辑
我们应用的核心逻辑长这样
app.get('/', function (req, res, next)
// 用 superagent 去抓取 https://cnodejs.org/ 的内容
superagent.get('https://cnodejs.org/')
.end(function (err, sres)
// 常规的错误处理
if (err)
return next(err);
// sres.text 里面存储着网页的 html 内容,将它传给 cheerio.load 之后
// 就可以得到一个实现了 jquery 接口的变量,我们习惯性地将它命名为 `$`
// 剩下就都是 jquery 的内容了
var $ = cheerio.load(sres.text);
var items = [];
$('#topic_list .topic_title').each(function (idx, element)
var $element = $(element);
items.push(
title: $element.attr('title'),
href: $element.attr('href')
);
);
res.send(items);
);
);
OK,一个简单的爬虫就是这么简单。这里我们还没有利用到 Node.js 的异步并发特性。不过下两章内容都是关于异步控制的。
记得好好看看 superagent 的 API,它把链式调用的风格玩到了极致。 参考技术A 1、如果是定向爬取几个页面,做一些简单的页面解析,爬取效率不是核心要求,那么用什么语言差异不大。
当然要是页面结构复杂,正则表达式写得巨复杂,尤其是用过那些支持xpath的类库/爬虫库后,就会发现此种方式虽然入门门槛低,但扩展性、可维护性等都奇差。因此此种情况下还是推荐采用一些现成的爬虫库,诸如xpath、多线程支持还是必须考虑的因素。
2、如果是定向爬取,且主要目标是解析js动态生成的内容
此时候,页面内容是有js/ajax动态生成的,用普通的请求页面->解析的方法就不管用了,需要借助一个类似firefox、chrome浏览器的js引擎来对页面的js代码做动态解析。
此种情况下,推荐考虑casperJS+phantomjs或slimerJS+phantomjs ,当然诸如selenium之类的也可以考虑。 参考技术B 后端渲染的页面用cheerio这个模块爬就可以,具体如何爬可以去谷歌。如果是js渲染的,比如百度图片,就用phantomjs去爬,用phantomjs爬的话需要在phantomjs这个看不见的浏览器里进行浏览器操作,获得相应数据后,再通过node的接口传给node 参考技术C 网上有很多的类似教程,可以跟着学学,做着看看。
nodejs爬虫selenium
6、元素操作
查找元素 使用操作如何找到页面元素Webdriver的findElement方法可以用来找到页面的某个元素,最常用的方法是用id和name查找。下面介绍几种比较常用的方法。 By ID假设页面写成这样: <input type=”text” name=”userName” id=”user” /> 那么可以这样找到页面的元素: 通过id查找: WebElement element = driver.findElement(By.id(“user”)); By Name或通过name查找: WebElement element = driver.findElement(By.name(“userName”)); By XPATH或通过xpath查找: WebElement element =driver.findElement(By.xpath(“//input[@id=‘user‘]“)); By Class Name假设页面写成这样: <div class=”top”><span>Head</span></div><divclass=”top”><span>HeadName</span></div> 可以通过这样查找页面元素: List<WebElement>top= driver.findElements(By.className(“top”)); By Link Text假设页面元素写成这样: <a href=”http://www.baidu.com”>baidu</a>> 那么可以通过这样查找: WebElement baidu=driver.findElement(By.linkText(“baidu”));
输入框传值 输入框(text field or textarea) 找到输入框元素: WebElement element = driver.findElement(By.id(“passwd-id”)); 在输入框中输入内容: element.sendKeys(“test”); 将输入框清空: element.clear(); 获取输入框的文本内容: element.getText();
下拉菜单 下拉选择框(Select)找到下拉选择框的元素: Select select = new Select(driver.findElement(By.id(“select”))); 选择对应的选择项:select.selectByVisibleText(“testName”); 或 select.selectByValue(“name”); 不选择对应的选择项: select.deselectAll(); select.deselectByValue(“name”); select.deselectByVisibleText(“姓名”); 或者获取选择项的值: select.getAllSelectedOptions(); select.getFirstSelectedOption();
单选框 单选项(Radio Button)找到单选框元素: WebElement sex=driver.findElement(By.id(“sex”)); 选择某个单选项: sex.click(); 清空某个单选项: sex.clear(); 判断某个单选项是否已经被选择: sex.isSelected();
复选框 多选项(checkbox)多选项的操作和单选的差不多: WebElement area =driver.findElement(By.id(“area .”)); area .click(); area .clear(); area .isSelected(); area .isEnabled();
弹出框 弹出对话框(Popup dialogs)Alert alert = driver.switchTo().alert(); alert.accept(); alert.dismiss(); alert.getText();
表单提交 表单(Form)Form中的元素的操作和其它的元素操作一样,对元素操作完成后对表单的提交可以: WebElement sub= driver.findElement(By.id(“sub”)); sub.click(); 或 sub.submit();//只适合于表单的提交
多窗口切换 Windows 或 Frames之间的切换 首先切换到默认的frame driver.switchTo().defaultContent(); 切换到某个frame: driver.switchTo().frame(“leftFrame”); 从一个frame切换到另一个frame: driver.switchTo().frame(“mainFrame”); 切换到某个window: driver.switchTo().window(“windowName”);
以上是关于如何使用nodejs做爬虫程序的主要内容,如果未能解决你的问题,请参考以下文章