- 21
- 0
关于爬虫的若干问题
最近想利用爬虫去获取较为大量的数据,但是在爬的过程中遇到了若干问题,所以来和各位大神讨教一下,如能解答,感激不尽。
1. 对于网页链接数量较多的时候,用什么方式去爬能提升效率?
我现在是将所有的子页链接存到一个数组里面,在对数组链接map操作,然后去获取每一页的数据。但是我现在所爬到的子页链接有上万个,爬取这些链接需要很长的时间,获取链接之后的请求页面获取数据也要很久的时间。所以我想知道,有没有更好的方式能够提高爬虫的效率的。
2. 获取数据和存储数据应该怎么处理
我在请求子页面获取数据之后,会将数据存储到mongodb里面,但是事实证明,这种写法让我的爬虫存储效率低下,而且经常出现堆栈溢出的情况。所以我想了解一下大神们获取到数据之后是怎么存储数据的,我听过读写分离,但是不知道这具体是怎样的一个概念,有大神讲解下么~
3. 对于爬到错误数据的处理
有些时候,所爬到页面的数据,是不符合存储标准的,但是我不知道这部分的数据是应该放过,还是重新请求页面重新获取一次。我现在是如果请求到的数据不合格,就会换个ip重新请求页面,知道数据符合为止。但是这样很有可能造成死循环,所以想知道大神们对这种状况的处理方式。
4. 用mongo存储数据的问题
从昨晚到今天,总共有将近7w个子链接,但是我的mongodb里只多了5k条数据。所以我想了解一下,关于mongodb,有没有什么可参考数据之类的,可以让我了解一下它的真实性能。顺便如果有大神肯分享一些mongo使用技巧和心得的话,那就更感谢了。。。
小菜鸟新入门,如果有犯低级错误的地方,欢迎各位大神指正。
- 共 0 条
- 全部回答
-
灵魂枷锁 普通会员 1楼
Node.js 是一种 JavaScript 框架,用于构建服务器端应用程序。它可以用于爬取网页、爬取数据、处理HTTP请求等任务,其中在爬取网页时,通常涉及到以下几个主要步骤:
-
安装必要的库:首先,你需要安装一个 Node.js 库来支持 HTTP 请求、代理、SSL/TLS 等网络请求相关的功能。一些常用的库包括:
request、http、https、https-proxy、cheerio等。在使用cheerio或http进行网络请求时,你需要根据目标网站的结构和协议(如GET、POST、PUT等)编写相应的 JavaScript 函数。 -
设置代理:如果你的网络请求需要通过代理服务器进行,你可以在爬虫的请求中设置代理头。例如,如果你的目标网站的代理服务器位于
http://proxy.example.com:8080,你可以这样设置请求头:
```javascript const http = require('http'); const https = require('https'); const options = { proxy: 'http://proxy.example.com:8080', rejectUnauthorized: false };
const server = http.createServer((req, res) => { const { host, path, method } = req;
if (host === 'http://example.com' && path === '/example') { res.statusCode = 200; res.setHeader('Content-Type', 'application/json'); res.end(JSON.stringify({ hello: 'World' })); } else { res.statusCode = 404; res.setHeader('Content-Type', 'application/json'); res.end('Not found'); } });
server.listen(3000, () => { console.log(
Example server listening on port 3000); }); ```- 发送 HTTP 请求:使用
http.request或https.request创建一个 HTTP 或 HTTPS 请求。例如,创建一个 HTTP 请求:
```javascript const request = require('request');
request.get('http://example.com', (err, res) => { if (err) { console.error('Error:', err); return; }
console.log(
HTTP response code: ${res.statusCode}); console.log(Response body: ${res.body}); }); ```- 处理响应:处理返回的响应,根据需要进行解析、存储或处理数据。这通常涉及到使用 JavaScript 的 JSON 库(如
JSON.parse或eval)来解析 JSON 数据,或者使用 DOM API(如document.getElementById或document.querySelector)来提取、处理页面元素数据。
以下是一个简单的 Node.js 爬虫示例,使用
request和cheerio库爬取一个网页:```javascript const request = require('request'); const cheerio = require('cheerio');
const url = 'http://example.com';
request.get(url, (err, res) => { if (err) { console.error('Error:', err); return; }
const $ = cheerio.load(res.text);
// 在这里使用 cheerio 查找并提取页面中的文本数据 const text = $('p').text();
console.log(
Text data: ${text}); }); ```- 处理错误:处理可能的网络请求或解析错误,如网络连接失败、请求头设置错误、请求内容解析错误等。
以上就是在 Node.js 中使用爬虫的基本步骤。对于爬取复杂的数据,如结构化的网页数据或爬取动态加载的内容,你可能需要使用更复杂的库和框架,如
axios、request-cache、fasthttp等。此外,为了遵守网站的robots.txt 文件规定,通常需要在爬虫运行时添加相应的 HTTP 头,如User-Agent、Disallow等,以避免被网站管理员封禁。 -
- 扫一扫访问手机版
回答动态

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器更新之后。服务器里面有部分玩家要重新创建角色是怎么回事啊?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题函数计算不同地域的是不能用内网吧?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题ARMS可以创建多个应用嘛?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题在ARMS如何申请加入公测呀?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题前端小程序接入这个arms具体是如何接入监控的,这个init方法在哪里进行添加?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器刚到期,是不是就不能再导出存档了呢?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器的游戏版本不兼容 尝试更新怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器服务器升级以后 就链接不上了,怎么办?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器转移以后服务器进不去了,怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器修改参数后游戏进入不了,是什么情况?预计能赚取 0积分收益
- 回到顶部
- 回到顶部
