网页搜罗政策Tweet与rvest

8ehkhllq  于 2022-12-20  发布在  其他
关注(0)|答案(2)|浏览(162)

网页https://polititweet.org/存储了某些政客、CEO等的完整推文历史。重要的是,他们还提供了我感兴趣的已删除推文。现在,我想在R中编写一个webscraper来检索Elon Musk已删除推文的文本,但我失败了,因为html中包含一些href。
这是我的尝试(编辑后,由于@Bensstats):

library(rvest)
url_page1<- read_html("https://polititweet.org/tweets?page=1&deleted=True&account=44196397&search=")
tweets_deleted <- html_nodes(url_page1, ".tweet-card") |> html_attr("href")

tweets_deleted

这样,我就在第1页上生成了被删除的tweet的ID。然而,我想要的是被删除的文本本身。
此外,马斯克有9页被删除的推文。由于未来这一页面数量可能会增加,我希望自动提取页面数量,然后自动化每个页面的过程(通过循环或类似的东西)。
如果你们中有人知道如何解决这些问题,我将非常感激!
多谢了!

3phpmpom

3phpmpom1#

获取伊隆删除的所有推文,第1:9页。

library(tidyverse)
library(rvest)

get_tweets <- function(page) {
  tweets <-
    str_c(
      "https://polititweet.org/tweets?page=",
      page,
      "&deleted=True&account=44196397&search="
    ) %>%
    read_html() %>%
    html_elements(".tweet-card")
  
  tibble(
    tweeter = tweets %>%
      html_element("strong+ .has-text-grey") %>%
      html_text2(),
    tweet = tweets %>%
      html_element(".small-top-margin") %>%
      html_text2(),
    time = tweets %>%
      html_element(".is-paddingless") %>%
      html_text2() %>%
      str_remove_all("Posted ")
  )
}

map_dfr(1:9, get_tweets)

# A tibble: 244 × 3
   tweeter   tweet                                             time 
   <chr>     <chr>                                             <chr>
 1 @elonmusk "@BBCScienceNews Tesla Megapacks are extremely e… Nov.…
 2 @elonmusk "\u2014 PolitiTweet.org"  Nov.…
 3 @elonmusk "@BuzzPatterson They could help it \U0001f923 \u… Nov.…
 4 @elonmusk "\U0001f37f \u2014 PolitiTweet.org"               Nov.…
 5 @elonmusk "Let\u2019s call the fact-checkers \u2026 \u2014… Nov.…
 6 @elonmusk "#SharkJumping  \u2014 Po… Nov.…
 7 @elonmusk "Can you believe this app only costs $8!? https:… Nov.…
 8 @elonmusk "@langdon @EricFrohnhoefer @pokemoniku He\u2019s… Nov.…
 9 @elonmusk "@EricFrohnhoefer @MEAInd I\u2019ve been at Twit… Nov.…
10 @elonmusk "@ashleevance @mtaibbi @joerogan Twitter drives … Nov.…
# … with 234 more rows
# ℹ Use `print(n = ...)` to see more rows

既然你想让它自动检测页面并抓取,这里有一个可能的解决方案,你只需提供一个指向函数的链接:

get_tweets <- function(link) {
  page <- link %>%
    read_html()
  
  pages <- page %>%
    html_elements(".pagination-link") %>%
    last() %>%
    html_text2() %>%
    as.numeric()
  
  twitter <- function(link, page) {
    tweets <-
      link %>%
      str_replace(pattern = "page=1", str_c("page=", page)) %>%
      read_html() %>% 
      html_elements(".tweet-card")
    
    tibble(
      tweeter = tweets %>%
        html_element("strong+ .has-text-grey") %>%
        html_text2(),
      tweet = tweets %>%
        html_element(".small-top-margin") %>%
        html_text2(),
      time = tweets %>%
        html_element(".is-paddingless") %>%
        html_text2() %>%
        str_remove_all("Posted ")
    )
  }
  
  map2_dfr(link, 1:pages, twitter)
}

get_tweets("https://polititweet.org/tweets?page=1&deleted=True&account=44196397&search=")

我强烈推荐这个tool来帮助您选择CSS元素。

lmvvr0a8

lmvvr0a82#

    • 编辑**

您可能需要更改CSS选择器

library(rvest)
url <- read_html("https://polititweet.org/tweets?account=44196397&deleted=True")
tweets_deleted <- html_nodes(url, "p.small-top-margin") |> html_text()

tweets_deleted %>% 
  gsub('\\n','',.)

相关问题