---
title: "Web data"
output: rmarkdown::html_vignette
vignette: >
%\VignetteIndexEntry{Web data}
%\VignetteEngine{knitr::rmarkdown}
%\VignetteEncoding{UTF-8}
---
```{r setup, include=FALSE}
knitr::opts_chunk$set(
eval = identical(Sys.getenv("TEXTPRESS_BUILD_LIVE_VIGNETTES"), "true"),
message = FALSE,
warning = FALSE,
comment = "#>"
)
```
`textpress` is organized around four actions -- fetch, read, process, search. This vignette covers the first two. `fetch_rss()` retrieves recent entries from publisher-supported RSS and Atom feeds; `read_urls()` scrapes their content into a node-level data frame while retaining that provenance. Together they turn selected news sources into an analysis-ready corpus in a few lines.
## Select, fetch, and read
Filter the bundled `rss_politics` catalog directly, use `fetch_rss()` to retrieve recent entries from those publishers, then filter the returned metadata locally before `read_urls()` scrapes and parses the selected articles. The filtering below is ordinary R filtering, not a query sent to a search service.
```{r web-urls, message=FALSE, warning=FALSE}
library(textpress)
library(dplyr)
library(DT)
feeds <- textpress::rss_politics |>
filter(category %in% c("polling", "public_opinion"))
web_urls <- textpress::fetch_rss(feeds$url) |>
filter(grepl(
"immigration|poll|survey",
paste(title, description),
ignore.case = TRUE
))
```
Scrape and parse the URLs returned above into a node-level data frame with `$text` and `$meta` components.
```{r web-text}
web_text_list <- web_urls |>
textpress::read_urls(cores = 4)
```
Build a text snippet from the first 15 words of each article, join to metadata, and display as an interactive table.
```{r}
snippets <- web_text_list$text |>
group_by(doc_id) |>
summarise(text = {
words <- unlist(strsplit(paste(text, collapse = " "), "\\s+"))
paste(paste(words[seq_len(min(15, length(words)))], collapse = " "), "...")
}, .groups = "drop")
metas_dt <- web_text_list$meta |>
filter(!is.na(h1_title) & nzchar(trimws(h1_title))) |>
left_join(snippets, by = "doc_id") |>
arrange(desc(date)) |>
mutate(
title_link = paste0(
'', h1_title, ''
)
)
DT::datatable(
metas_dt |> select(date, source, title_link, text),
options = list(columnDefs = list(
list(targets = 2, orderable = FALSE)
)),
escape = FALSE,
rownames = FALSE
)
```
## Summary
`fetch_rss()` and `read_urls()` are source-to-corpus entry points for a `textpress` pipeline. `fetch_rss()` returns publisher-provided article URLs with feed metadata; `read_urls()` scrapes and parses them into `$text` (one row per node) and `$meta` (one row per URL, including discovery provenance).