看過上篇的同窗,應該都會用Puppeteer的高級爬蟲功能了,附上姐妹篇連接:https://segmentfault.com/a/11...前端
除了爬蟲以外,Puppeteer也能夠幫你完成一些頁面上的重複操做,也能夠看成UI自動化測試!android
開門見山,今天的目標是,爬取SF頭條前端的文章,自動推薦到掘金!!!git
github:https://github.com/zhentaoo/p...github
SF可能比較慢,直接看github圖片地址,錄製了視頻,可是沒發現比較好的工具:https://raw.githubusercontent...npm
page.goto跳轉到https://segmentfault.com/news...segmentfault
接着分析文章的Dom結構,獲取每篇文章的連接cookie
而後取出最重要的 href,title 信息less
具體代碼以下:frontend
try { await page.goto('https://segmentfault.com/news/frontend') await timeout(1000) var SfFeArticleList = await page.evaluate(() => { var list = [...document.querySelectorAll('.news__list .news__item-title a')] return list.map(el => { return {href: el.href.trim(), title: el.innerText} }) }) console.log('SfFeArticleList:', SfFeArticleList); await page.screenshot({path: './sf-juejin/sf.png', type: 'png'}); } catch (e) { console.log('sf err:', e); }
先跳轉到掘金,同樣分析頁面結構,模擬點擊登陸按鈕dom
接着,會彈出一個的登陸dialog,用page.type模擬輸入用戶名密碼
最後,點擊登陸,這時JJ應該把cookie寫好了....
代碼以下:
try { await timeout(1000) await page.goto('https://juejin.im') await timeout(1000) var login = await page.$('.login') await login.click() var loginPhoneOrEmail = await page.$('[name=loginPhoneOrEmail]') console.log('loginPhoneOrEmail:', loginPhoneOrEmail); await loginPhoneOrEmail.click() await page.type('18516697699@163.com', {delay: 20}) var password = await page.$('[placeholder=請輸入密碼]') console.log('password:', password); await password.click() await page.type('123456', {delay: 20}) var authLogin = await page.$('.panel .btn') console.log('authLogin:', authLogin); await authLogin.click() } catch (e) {}
登陸成功後,會進入用戶界面
模擬點擊推薦文章推薦按鈕「+」
?,這時從SF拿到的文章信息就派上用場了,隨機取出一篇
模擬填寫推薦表單,而後點擊發布
嗯,有時會提示該文章已被分享,那就換一篇吧,再執行一次。
代碼以下
try { await timeout(2500) var seed = Math.floor(Math.random() * 30) var theArtile = SfFeArticleList[seed] var add = await page.$('.main-nav .ion-android-add') await add.click() await timeout(2500) var shareUrl = await page.$('.entry-form-input .url-input') await shareUrl.click() await page.type(theArtile.href, {delay: 20}) await page.press('Tab') await page.type(theArtile.title, {delay: 20}) await page.press('Tab') await page.type(theArtile.title, {delay: 20}) await page.evaluate(() => { let li = [...document.querySelectorAll('.category-list-box .category-list .item')] li.forEach(el => { if (el.innerText == '前端') el.click() }) }) var submitBtn = await page.$('.submit-btn') await submitBtn.click() } catch (e) { await page.screenshot({path: './sf-juejin/err.png', type: 'png'}); }
git clone https://github.com/zhentaoo/p...
npm install (puppeteer在win下100+M、mac下70+M,請耐心等候)
npm test
爲了效果展現,這裏使用的headless: false模式,實際使用時能夠同時開n個page,模擬操做,你們能夠嘗試改改,也能夠給我提PR
目前已經帶領你們,使用Puppeteer完成爬蟲 和 UI自動化測試,接下來可能會出第三篇,應該會是關於前端性能分析
其實Puppeteer的應用場景遠不止這些,你們也能夠使用它在各自的領域大放異彩!!!