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 ...
随机推荐
- PHP常见函数
有时候,运行nginx和PHP CGI(PHP FPM)web服务的Linux服务器,突然系统负载上升,用top命令查看,很多phpcgi进程的CPU利用率接近100%后来通过跟踪发现,这种情况与PH ...
- sql语句开启事务
以下为示例代码: begin tran update 表 where 姓名='A' update 表 where 姓名='B' rollback else commit
- LINUX安装Tree软件包
1.将镜像光盘放入光驱中 查看当前LINUX版本号:cat /etc/redhat-release 2.挂载镜像文件 mount /dev/cdrom /mnt mount :挂载设备命令 /d ...
- 安全开发流程(SDL)学习概述
1.简介 SDL的全称是Security Development Lifecycle,即:安全开发生命周期.由微软最早提出,是一种专注于软件开发的安全保障流程.为实现保护最终用户为目标,它在软件开发流 ...
- EF方式增、删、改、查(基本使用)
右击项目——添加——新建项——数据(C#)——选择ADO.NET实体数据模型——点击添加——然后根据实体数据模型向导来一步步的做. 用到的表 using System; using System.Da ...
- MVC方式显示数据(数据库)
新建实体数据模型 选择ADO.NET实体数据模型,名称改为数据库名 因为使用现有数据库,所以选择来自数据库的EF设计器,只演示所以只选择一个表,空模型可后期增加表 选择从数据库更新模型 新建数据库连接 ...
- Java架构师告诉你Spring IoC有什么好处呢
前言: 这个问题也一直困惑我很久,毕竟其他语言没有IOC也活的很好. 但是Spring在当时能够一统江湖,跟IOC真的有很大的关系. 在没有IOC的时代,New代表一切,女朋友都是可以New出来的. ...
- centos下关闭自动锁屏
自己这段时间在学习Linux,选用的系统的为CentOS,在实际操作过程中遇到问题,在无任何操作情况下,系统过一段时间自动锁屏需要重新输入密码.经过多次尝试以后终于成功!解决方法如下: Setting ...
- python3 pyinstaller
一.安装python.pywin32.pyinstaller库 二.官网:https://pyinstaller.readthedocs.io/en/v3.3.1/usage.html#general ...
- 关键字final 修饰类、方法、属性、参数类型
笔记: /** 关键字final(最终的) 标记的类不能被继承, 提高安全性,提高程序的可读性 * 1.final 修饰类,这个类就不能被继承: 如:String类.StringBuffer类.Sys ...