puppeteer爬虫服务
爬虫文件
baidu.js
const puppeteer = require("puppeteer");
const path = require('path');
const pathToExtension = path.join(__dirname, './chrome-mac/Chromium.app/Contents/MacOS/Chromium');
var exec = require('child_process').execSync;
const conf = {
headless: false,
executablePath: pathToExtension,
defaultViewport: {
width: 1300,
height: 900
},
};
const run = async (browserEndpoint) => {
//var count = exec('ps -ef |grep Chromium |grep -v "grep" |awk \'{print $8}\'|wc -l');
if (browserEndpoint == "") {
var browser = await puppeteer.launch(conf)
const _browserEndpoint = await await browser.wsEndpoint();
console.log("_browserEndpoint",_browserEndpoint)
browserEndpoint=_browserEndpoint
}
var browser = await puppeteer.connect({"browserWSEndpoint":browserEndpoint})
const page = await browser.newPage()
await page.goto('https://www.baidu.com/', {waitUntil: 'networkidle2'});
//addScriptTag需要加在goto的后面,然后就可以在evaluate里使用jQuery的语法了。
await page.addScriptTag({
url: 'https://code.jquery.com/jquery-3.2.1.min.js',
});
await page.waitFor('#u1')
// 可以接收evaluate内部打印的console内容
page.on('console', msg => {
for (let i = 0; i < msg.args().length; i++) {
console.log(`${i}: ${msg.args([i])}`)
}
})
const result = await page.evaluate(() => {
let data = []; // 初始化空数组来存储数据
let elements = $("#u1"); // 获取所有元素
for (let element of elements) {
let title = element.innerText; // 获取标题
let url = element.href;//获取网址
data.push({title, url}); // 存入数组
}
return data;
});
console.log(result);
const dic = {
"result": result,
"browserEndpoint": browserEndpoint
}
await page.close()
return dic
};
module.exports = {
run
}
服务文件
server.js
var http = require('http');
var run_spider = require("./baidu.js");
var browserEndpoint = ""
http.createServer(function (req, res) {
console.log("in", browserEndpoint)
res.writeHead(200, {'Content-Type': 'text/plain;charset=UTF-8', 'Access-Control-Allow-origin': '*'});
if (req.method.toUpperCase() == 'POST') {
var postData = '';
req.on('data', function (data) {
postData += data; //接受的数据
});
req.on('end', function () {
if (browserEndpoint == "") {
console.log("if", browserEndpoint)
run_spider.run(browserEndpoint).then(function (result_dict) {
browserEndpoint = result_dict.browserEndpoint
console.log("browserEndpoint", browserEndpoint)
})
} else {
console.log("else", browserEndpoint)
run_spider.run(browserEndpoint).then(function (result_dict) {
Promise.resolve(result_dict.browserEndpoint)
})
}
}
);
}
}).listen('9001', function () {
console.log('开启服务端口9001');
});
puppeteer爬虫服务的更多相关文章
- 网络爬虫:使用Scrapy框架编写一个抓取书籍信息的爬虫服务
上周学习了BeautifulSoup的基础知识并用它完成了一个网络爬虫( 使用Beautiful Soup编写一个爬虫 系列随笔汇总 ), BeautifulSoup是一个非常流行的Python网 ...
- 搭建pyspider爬虫服务
1. 环境准备 首先yum更新 yum update -y 安装开发编译工具 yum install gcc gcc-c++ -y 安装依赖库 yum install python-pip pytho ...
- 爬虫服务集群处理nginx返回504
最近在对爬虫服务做分布式服务的时候总是遇到服务器返回504,搞了两天才发现原来是nginx中有对超时的设置参数,自己都是用默认的,然而客户端的等待时间超过了nginx默认的超时设置 修改 keepal ...
- 用go写爬虫服务并发请求,限制并发数
java写爬虫服务,思路是线程池,任务队列,限制并行线程数即可. go要用另一种设计思路,不能在线程层面限制,协程的异步请求,如果不作处理,并行发出所有网络请求,因网络请求数过多,会抛出异常 低版本的 ...
- Puppeteer爬虫实战(一)
Puppeteer 爬虫技术实践 信息简介 Puppeteer是Chrome开发团队发布的一个通过Chrome DevTool Protocol来控制浏览器Chrome(下文若无显式称呼Chromiu ...
- 【原】使用puppeteer爬虫下载Midi文件
The Beatles 乐队的 Midi文件下载地址 puppeteer官方github地址 midi文件爬取示例代码github地址 1.安装npm 参考:安装npm及cnpm(Windows) 修 ...
- Puppeteer爬虫实战(三)
本篇文章针对大家熟知的技术站点作为目标进行技术实践. 确定需求 访问目标网站并按照筛选条件(关键词.日期.作者)进行检索并获取返回数据中的目标数据.进行技术拆分如下: 打开目标网站 找到输入框元素 ...
- LINUX搭建PySpider爬虫服务
1.环境搭建 yum update -y yum install gcc gcc-c++ -y yum install python-pip python-devel python-distribut ...
- puppeteer 爬虫 pdf 截图 自动化
puppeteer简介 puppeteer 翻译是操纵木偶的人,利用这个工具,我们能做一个操纵页面的人.puppeteer是一个nodejs的库,支持调用Chrome的API来操纵Web,相比较Sel ...
随机推荐
- Laravel with 查询指定的字段(非复制的哦)
问题: 在with里面指定查询字段,结果是null. 在模型里面指定查询字段,结果是null. 解决办法: 在查询指定字段的时候要顺带着查询关联的外键,例: // user 表 id name // ...
- less学习大纲总结
1.注释的区别 /**/ //2.变量的命名 @+变量名 如:@f_width 引用的时候也要带上@ 符号3.混合 可带参数 默认带值4.匹配模式 相当于js里的if,但不完全是 用于符号条件的匹配 ...
- $.serializeArray()获取不到input的value值bug问题
今天修改form表单,发现有好几个input值保存不上,上网搜索了一下是$.serializeArray()获取不到disabled的值.如果想要让input元素变为不可用,可以把input设为rea ...
- SVN配置使用及移植
使用svn作为配置管理工具及其普遍的用于项目开发中,网上有很多关于svn的原理介绍及命令行管理教程.这里仅仅分享下个人配置及使用的过程,不通过命令行,可简单的上手操作.如有遗漏欢迎留言交流. 配置及使 ...
- golang GC(一 原理)
golang中的gc采用三色标记法.在讲三色标记法之前,先了解一下Mark and Sweep算法,因为Mark and Sweep算法是三个标记法的一个改进版. Mark and Sweep算法: ...
- 15.Vue组件中的data
1.组件中展示数据和响应事件: // 1. 组件可以有自己的 data 数据 // 2. 组件的 data 和 实例的 data 有点不一样,实例中的 data 可以为一个对象 // 3. 但是组件中 ...
- 7.Vue实例的生命周期
1.Vue实例的生命周期: 什么是生命周期:从Vue实例创建.运行.到销毁期间,总是伴随着各种各样的事件,这些事件,统称为生命周期! 生命周期钩子 = 生命周期函数 = 生命周期事件 2. 主要的生命 ...
- JS遍历表格获取每行数据及每个单元格数据
/** * 遍历表格获取每行数据及每个单元格数据 * @param tableID 表格ID */ function GetTable(tableID) { var milasUrl = {};//新 ...
- metal tile shader
刚发现了个问题 tileshader的memory不需要和attachement对应 imageblock被tileshader读写 fragmentshader也可以写imageblock 还可以正 ...
- mysql基础篇--新增
语法 #支持单行.多行插入和子查询 insert into 表名(列名,...) values(值1,...); #单行插入 insert into 表名(列名,...) values(值1,...) ...