如何使用网络抓取获取推文的内容

时间:2020-07-02 18:18:55

标签: javascript node.js twitter cheerio

我尝试使用puppeteer,但是我会尝试通过传递x路径来获取信息,并且它永远不会返回任何信息。完全相同的程序可用于其他站点,但不适用于Twitter。有没有一种方法可以使用cheerio或其他方法获取推文的内容?我可以访问twitter API,但是文档很难理解。

编辑代码:这是我的pupputeer代码,由于某种原因,它挂在了等待页面上。waitfornavigation()仅适用于twitter。对于其他任何适用的网站。

const Apify = require('apify');
 
var OldAlphaAIData = {TICKER:"", REF:"", SIGNAL:""} 
Apify.main(async () => {
    const input = await Apify.getValue('INPUT');
 
    const browser = await Apify.launchPuppeteer();
    const page = await browser.newPage();
    await page.goto('https://twitter.com/MarketsTicker');
    await page.waitForNavigation();
    do
    {
        console.log('ffff');
        var timenow = new Date(); //Get Date
        timenow.setHours(timenow.getHours() + 1);
        var AlphaAIData = {TICKER:"", REF:"", SIGNAL:""};
        var everything;
        var everythingarray = [];
 
        //xpath to 1st twitter message      
        const [el0] = await page.$x('/html/body/div/div/div/div[2]/main/div/div/div/div[1]/div/div[2]/div/div/div[2]/section/div/div/div/div[1]');    
        const txt0 = await el0.getProperty('textContent');
        everything = await txt0.jsonValue();
        console.log(everything);
    }while(true);
});

1 个答案:

答案 0 :(得分:0)

不确定要从每条推文中提取的内容是什么以及如何解决问题,但是假设您正在根据问题的标签使用node,twitter module的文档非常简单。

var Twitter = require('twitter');
 
var client = new Twitter({
  consumer_key: '',
  consumer_secret: '',
  access_token_key: '',
  access_token_secret: ''
});
 
var params = {screen_name: 'nodejs'};
client.get('statuses/user_timeline', params, function(error, tweets, response) {
  if (!error) {
    console.log(tweets);
  }
});

为此,您当然需要使用相应的变量(例如consumer_key,consumer_secret等)注册访问API的权限并提供这些详细信息。


更新:我设法使您的代码适用于twitter,请查看以下更改,其中最重要的是await page.waitForXPath(xpath);,它会先等待xpath加载,然后再尝试获取其内容。另外,xpath也有所不同,我在DOM内部进一步指出了保存消息的范围。

const Apify = require('apify');

var OldAlphaAIData = { TICKER: "", REF: "", SIGNAL: "" }
Apify.main(async () => {
    const input = await Apify.getValue('INPUT');

    const browser = await Apify.launchPuppeteer();
    const page = await browser.newPage();
    const navigationPromise = page.waitForNavigation();
    await page.goto('https://twitter.com/MarketsTicker')
    await navigationPromise

    console.log('ffff');
    var timenow = new Date(); //Get Date
    timenow.setHours(timenow.getHours() + 1);
    var AlphaAIData = { TICKER: "", REF: "", SIGNAL: "" };
    var everything;
    var everythingarray = [];

    //xpath to 1st twitter message      
    const xpath = '/html/body/div/div/div/div[2]/main/div/div/div/div/div/div/div/div/div[2]/section/div/div/div/div[1]/div/div/article/div/div/div/div[2]/div[2]/div[2]/div[1]/div/span';
    await page.waitForXPath(xpath);
    const [el0] = await page.$x(xpath);
    const txt0 = await el0.getProperty('textContent');
    everything = await txt0.jsonValue();
    console.log(everything);

});

为简单起见,我删除了while循环,因为它无限期地打印了第一条tweet。