使用 puppeteer.js 抓取 Twitter 帖子

Jav*_*ift 1 twitter node.js web-scraping puppeteer

我正在尝试制作我的个人推特帖子抓取工具,但这似乎比我想象的要难。

这个想法是首先获取 div 帖子,然后浏览它们并最终获得帖子文本。

这并不像我想象的那样,目前我只得到一个空数组。

我究竟做错了什么?

const puppeteer = require('puppeteer');
var fs = require('fs');

async function getQuotes(){

    const browser = await puppeteer.launch({headless:true});
    const page = await browser.newPage();

    await page.goto('https://twitter.com/Twitter', {waitUntil: 'networkidle2'}); // page url
   
    const result = await page.$$eval('div.css-901oao.r-jwli3a.r-1qd0xha.r-a023e6.r-16dba41.r-ad9z0x.r-bcqeeo.r-bnwqim.r-qvutc0', rows => {
        return rows.map(row =>{
            const properties = {};
            const post = row.querySelector('span.css-901oao.css-16my406.r-1qd0xha.r-ad9z0x.r-bcqeeo.r-qvutc0');
            properties.text = post.innerText;
            return properties;
        });
    });
    console.log(result);
    browser.close();
}
getQuotes();
Run Code Online (Sandbox Code Playgroud)

ove*_*eer 7

每条推文都是一个article元素。每条推文的内容似乎都在带有divlang属性的a中。

\n

知道了这一点,我们可以将您的选择器更改为article div[lang]

\n
const puppeteer = require(\'puppeteer\');\n\n(async () => {\n  const browser = await puppeteer.launch({ headless: true });\n  const page = await browser.newPage();\n\n  await page.goto(\'https://twitter.com/Twitter\', { waitUntil: \'networkidle2\' });\n\n  const results = await page.$$eval(\'article div[lang]\', (tweets) => tweets.map((tweet) => tweet.textContent));\n  console.log(results);\n\n  browser.close();\n})();\n
Run Code Online (Sandbox Code Playgroud)\n

这输出:

\n
[\n  \'if you had a twitter before 2020 rt this\',\n  \'some of you hating...\\n\\nbut we see you Fleeting \',\n  \'That thing you didn\xe2\x80\x99t Tweet but wanted to but didn\xe2\x80\x99t but got so close but then were like nah. \\n\' +\n    \'\\n\' +\n    \'We have a place for that now\xe2\x80\x94Fleets! \\n\' +\n    \'\\n\' +\n    \'Rolling out to everyone starting today.\'\n]\n
Run Code Online (Sandbox Code Playgroud)\n

当然,您仍然需要解决无限滚动问题,并且您可能会遇到更多问题,但这足以让您开始。

\n
\n

但是,您可能一开始就不应该这样做。

\n

根据Twitter 服务条款(重点是我的):

\n
\n

[\xe2\x80\xa6] 通过任何方式(自动或其他方式)访问或搜索或尝试访问或搜索服务,而不是通过 Twitter 提供的当前可用的已发布界面(并且仅根据适用的条款和条件)条件),除非您在与 Twitter 的单独协议中被明确允许这样做(注意:如果按照 robots.txt 文件的规定进行抓取服务是允许的,但是,未经 Twitter 事先同意就抓取服务) Twitter 被明确禁止);[\xe2\x80\xa6]

\n
\n