2018-09-29

爬取内容


1. http/axios 等爬取API接口 [#](#t11. http/axios 等爬取API接口)

let axios = require('axios');
axios.get('https://follow-api-ms.juejin.im/v1/getUserFollowInfo?uid=551d6923e4b0cd5b623f54da&src=web')
    .then(res => console.log(res.data))

2. superagent/request/crawl爬取HTML页面 [#](#t22. superagent/request/crawl爬取HTML页面)

let request = require('request');
request('https://juejin.im/tag/%E5%89%8D%E7%AB%AF', (err, response, body) => {
    let regexp = /class="title" data-v-\w+>(.+?)<\/a>/g;
    let titles = [];
    body.replace(regexp, (matched, title) => {
        titles.push(title);
    });
    console.log(titles);
});

3. 使用puppeteer控制chromium [#](#t33. 使用puppeteer控制chromium)

  • puppeteer是Chrome团队开发的一个node库

  • 可以通过api来控制浏览器的行为,比如点击,跳转,刷新,在控制台执行js脚本等等

  • 通过这个工具可以用来写爬虫,自动签到,网页截图,生成pdf,自动化测试等

    (async () => {
         const browser = await puppeteer.launch();//打开浏览器
         const page = await browser.newPage();//打开一个空白页
         await page.goto('https://www.baidu.com');//在地址栏输入网址并等待加载
         await page.screenshot({ path: 'baidu.png' });//截个图
         await browser.close();//关掉浏览器
    })();
    
    showapi zhangximufeng zxmf2018
    const account = `1516383135@qq.com`;
    const password = `zxmf2018`;
    (async () => {
        const browser = await puppeteer.launch({ headless: false });//打开浏览器
        const page = await browser.newPage();//打开一个空白页
        await page.goto('https://accounts.douban.com/login');//打开豆瓣网站
        await page.type('#email', account);
        await page.screenshot({ path: 'email.png' });//截个图
        await page.type('#password', password);
        await page.screenshot({ path: 'password.png' });//截个图
        let src = await page.$eval('#captcha_image', el => el.getAttribute('src'));
        const captchaText = await readCaptchaImg(src);
        await page.type('#captcha_field', captchaText);
        await page.screenshot({ path: 'captcha.png' });//截个图
        await page.click('.btn-submit');
        await page.waitForNavigation({
            waitUntil: 'networkidle2'
        });//等待页面加载出来,等同于window.onload
        await page.screenshot({ path: 'welcome.png' });//截个图
        await browser.close();//关掉浏览器
    })(ret => console.log(ret), error => console.log(err));
    
    function readCaptchaImg(src) {
        return new Promise(function (resolve, reject) {
            let options = {
                url: src,
                headers: {
                    "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36"
                }
            }
            let imageStream = fetch(options);
            var showapiSdk = require('showapi-sdk');
            //设置你测试用的appId和secret,img
            var appId = '72885';
            var secret = 'ae08b393b8fa4a1290ab3f700d2c3f95';
            //开启debug
            //showapiSdk.debug(true);
            if (!(appId && secret)) {
                console.error('请先设置appId等测试参数,详见样例代码内注释!')
                return;
            }
            //全局默认设置
            showapiSdk.setting({
                url: 'http://route.showapi.com/184-4',//你要调用的API对应接入点的地址,注意需要先订购了相关套餐才能调
                appId: appId,//你的应用id
                secret: secret,//你的密钥
                timeout: 50000,//http超时设置
                options: {//默认请求参数,极少用到
                    testParam: 'test'
                }
            })
    
        let request = showapiSdk.request();
        request.appendText('typeId', '20');
        request.appendText('convert_to_jpg', '0');
        request.appendText('needMorePrecise', '0');
        request.appendFile('image', {
            value: imageStream,
            options: {
                filename: 'captcha.jpg',
                contentType: 'image/jpeg'
            }
        });
        request.post(function (data) {
            resolve(data.showapi_res_body.Result);
        })
    });
    
    }
    

2.数据持久化 #

  • 根据爬取的规则和策略,把爬取到的数据储到数据库中
  • 如果要兼容不同的来源,需要对数据需要格式化
  • 为不同的数据建立索引方便检索

3. 数据订阅 [#](#t53. 数据订阅)

  • 用户可以按照自己的兴趣和需要进行订制内容

4. 分发 [#](#t64. 分发)

有新的数据的时候

  • 可以使用邮件推送到订阅者
  • 可以使用极光推送等推送服务
  • 可以使用及时通信服务向客户端推送

参考 #

Gitalking ...

Markdown is supported

Be the first guy leaving a comment!