1 Star 5 Fork 0

dyh_xiaoxia / PuppeteerDemo

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README

PuppeteerDemo

pupppeter实现的对百度,网页新闻的爬虫 ; 并可以用node搭建一个小型的服务。 做成产品的话可以实现一个 文章的采集中心

初始化项目

npm install 如果你没有下载chromium的话,可以npm i puppeteer一下,让他自己去下载适合的版本。

主要代码解释

puppeteer是一个无界面浏览器,可以模拟用户的操作,以下是模拟用户登录百度的账号,但是写完发现百度有验证码,尴尬了...

代码


class LoginBaiDu{
    constructor() {
        this.url = 'https://www.baidu.com/';
        this.init();
    }
async init(){
	console.log('正在启动浏览器...');
	this.browser = await puppeteer.launch({headless:false});
	console.log('正在打开新页面...');
	this.page = await this.browser.newPage();
	await this.openBaiDu(this.url);

	console.log('正在关闭浏览器...');
	await timeout(delay);
	await this.browser.close();
}

async openBaiDu(url){
	await timeout(delay);
	let page = this.page;
	await page.goto(url);
	try{
		await timeout(delay);
		var login = await page.$('#u1 .lb');
		console.log('正在获取登录节点---------------'+login);
		await login.click();
		await timeout(1000);

		var userNameLogin = await page.$('#TANGRAM__PSP_10__footerULoginBtn');
		await userNameLogin.click();
		await timeout(1000)

		await page.type('[name=userName]','来生只为你心动',{delay:200});
		await timeout(500);
        // 密码就没填 ^_^
		await page.type('[name=password]','***',{delay:200});
		await timeout(1000)

		// 点击登录
		console.log('点击登录百度...');
		var commit = await page.$('#TANGRAM__PSP_10__submit');
		await commit.click();

		await timeout(2000)
	} catch(e){
		console.log("执行出错......."+e);
		await page.screenshot({path:'./err.png',type: 'png'});
	}
}

}

//到网易体育的首页,抓取网易推荐的新闻的a链接列表
var listMap = await page.evaluate(() => {
    var alist = [...document.querySelectorAll('.topnews_news ul li a')];
    return alist.map((el) => {
        return {
            href: el.href,
            title: el.innerText
        }
    });
});
// 遍历这些a链接,去文章详情页 把文章的标题,来源和内容抓取出来
for(var i=0;i<listMap.length;i++){
    var a = listMap[i].href;
    await this.loadContent(a);
}

async loadContent(url){
    try{
        await timeout(2000);
        let page = this.page;
        await page.goto(url);

        var title = await page.$eval('#epContentLeft h1',el => el.innerText);
        var source = await page.$eval('#ne_article_source',el => el.innerText);

        var contentP = await page.evaluate(() => {
            var pList = [...document.querySelectorAll('#endText p')];
            return pList.map(el => {
                return {
                    p:el.innerHTML
                };
            });
        });
        console.log('----------load content start-----------------------');
        console.log(title);
        console.log(source);
        console.log(contentP);
        console.log('---------load content end--------------------------');

        // 将他们保存在本地文件中,其实一般 要做一个新闻类的产品的话,把文章解析出来直接存在自己的数据库就可以了
        // 然后app端取自己库里面的最新文章
        var cont = title+"\r\n"+source+"\r\n"+contentP;
        fs.writeFile("./"+title+".txt", cont,{flag:'a',encoding:'utf-8',mode:'0666'}, function(err) {
            if(err) {
                return console.log(err);
            }
        });

    } catch(e){
        console.log(e);
    }
}

puppeteer的api文档 这是英文的,本人英语不好,能看懂,翻译不了 不过这里有个大神翻译了很多的api,一般的需求都能满足了。博客地址

空文件

简介

pupppeter实现的对百度,网页新闻的爬虫 展开 收起
JavaScript
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
JavaScript
1
https://gitee.com/xiaoxia_dyh/PuppeteerDemo.git
git@gitee.com:xiaoxia_dyh/PuppeteerDemo.git
xiaoxia_dyh
PuppeteerDemo
PuppeteerDemo
master

搜索帮助