R 数据抓取/抓取动态/多个 URL

昏迷

我尝试在以下位置获取瑞士联邦最高法院的所有法令:https : //www.bger.ch/ext/eurospider/live/de/php/aza/http/index.php?lang=de&type=simple_query&query_words= &lang=de&top_subcollection_aza=all&from_date=&to_date=&x=12&y=12不幸的是,没有提供API。我要检索的数据的 CSS 选择器是.para

我知道http://relevancy.bger.ch/robots.txt

User-agent: *
Disallow: /javascript
Disallow: /css
Disallow: /hashtables
Disallow: /stylesheets
Disallow: /img
Disallow: /php/jurivoc
Disallow: /php/taf
Disallow: /php/azabvger
Sitemap: http://relevancy.bger.ch/sitemaps/sitemapindex.xml
Crawl-delay: 2

在我看来,我正在查看的 URL 似乎可以抓取,对吗?无论如何,联邦 cort 解释说,这些规则是针对大型搜索引擎的,并且可以容忍个人爬行。

我可以检索单个法令的数据(使用https://www.analyticsvidhya.com/blog/2017/03/beginners-guide-on-web-scraping-in-r-using-rvest-with-hands-on -知识/ )

url <- 'https://www.bger.ch/ext/eurospider/live/de/php/aza/http/index.php?lang=de&type=highlight_simple_query&page=1&from_date=&to_date=&sort=relevance&insertion_date=&top_subcollection_aza=all&query_words=&rank=1&azaclir=aza&highlight_docid=aza%3A%2F%2F18-12-2017-6B_790-2017&number_of_ranks=113971'

webpage <- read_html(url)

decree_html <- html_nodes(webpage,'.para')

rank_data <- html_text(decree_html)

decree1_data <- html_text(decree_html)

但是,由于 rvest 仅从一个特定页面提取数据并且我的数据在多个页面上,我尝试使用 Rcrawler 这样做(https://github.com/salimk/Rcrawler),但我不知道如何抓取给定的站点www.bger.ch上的structur以获取带有法令的所有 URL。

我查看了以下帖子,但仍然找不到解决方案:

跨多个页面的 R 网络抓取

Rvest:抓取多个 URL

hrbrmstr

我不做下面的错误处理,因为这超出了这个问题的范围。

让我们从常见的嫌疑人开始:

library(rvest)
library(httr)
library(tidyverse)

我们将定义一个函数,该函数将按页码为我们提供一页搜索结果。自从您提供 URL 以来,我已经对搜索参数进行了硬编码。

在这个函数中,我们:

  • 获取页面 HTML
  • 获取指向我们要抓取的文档的链接
  • 获取文档元数据
  • 制作数据框
  • 为抓取的页码以及是否有更多的页面要抓取的数据框添加属性

这很简单:

get_page <- function(page_num=1) {

  GET(
    url = "https://www.bger.ch/ext/eurospider/live/de/php/aza/http/index.php",
    query = list(
      type="simple_query",
      lang="de",
      top_subcollection_aza="all",
      query_words="",
      from_date="",
      to_date="",
      x="12",
      y="12",
      page=page_num
    )
  ) -> res

  warn_for_status(res) # shld be "stop" and you should do error handling

  pg <- content(res)

  links <- html_nodes(pg, "div.ranklist_content ol li")

  data_frame(
    link = html_attr(html_nodes(links, "a"), "href"),
    title = html_text(html_nodes(links, "a"), trim=TRUE),
    court = html_text(html_nodes(links, xpath=".//a/../../div/div[contains(@class, 'court')]"), trim=TRUE), # these are "dangerous" if they aren't there but you can wrap error handling around this
    subject = html_text(html_nodes(links, xpath=".//a/../../div/div[contains(@class, 'subject')]"), trim=TRUE),
    object = html_text(html_nodes(links, xpath=".//a/../../div/div[contains(@class, 'object')]"), trim=TRUE)
  ) -> xdf

  # this looks for the text at the bottom paginator. if there's no link then we're done

  attr(xdf, "page") <- page_num
  attr(xdf, "has_next") <- html_node(pg, xpath="boolean(.//a[contains(., 'Vorwärts')])")

  xdf

}

制作一个辅助函数,因为我无法忍受打字attr(...),而且在使用中它读起来更好:

has_next <- function(x) { attr(x, "has_next") } 

现在,制作一个抓取循环。我在 6 点就停了下来。您应该删除用于抓取所有内容的逻辑。由于互联网连接不稳定,请考虑分批执行此操作:

pg_num <- 0
all_links <- list()

repeat {
  cat(".") # poor dude's progress ber
  pg_num <- pg_num + 1
  pg_df <- get_page(pg_num)
  if (!has_next(pg_df)) break
  all_links <- append(all_links, list(pg_df))
  if (pg_num == 6) break # this is here for me since I don't need ~11,000 documents
  Sys.sleep(2) # robots.txt crawl delay
}
cat("\n")

将数据框列表变成一个大列表。注意:您应该在此之前进行有效性测试,因为网络抓取充满危险。您还应该将此数据框保存到 RDS 文件中,这样您就不必再次执行此操作。

lots_of_links <- bind_rows(all_links)

glimpse(lots_of_links)
## Observations: 60
## Variables: 5
## $ link    <chr> "https://www.bger.ch/ext/eurospider/live/de/php/aza/http/index.php?lang=de&type=highlight_simple_query&...
## $ title   <chr> "18.12.2017 6B 790/2017", "14.12.2017 6G 2/2017", "13.12.2017 5A 975/2017", "13.12.2017 5D 257/2017", "...
## $ court   <chr> "Strafrechtliche Abteilung", "Cour de droit pénal", "II. zivilrechtliche Abteilung", "II. zivilrechtlic...
## $ subject <chr> "Straf- und Massnahmenvollzug", "Procédure pénale", "Familienrecht", "Schuldbetreibungs- und Konkursrec...
## $ object  <chr> "Bedingte Entlassung aus der Verwahrung, Beschleunigungsgebot", "Demande d'interprétation et de rectifi...

有了所有的链接,我们就会得到文件。

定义一个辅助函数。注意我们不在这里解析。分开做。我们将存储内部内容<div>HTML 文本,以便您稍后对其进行解析。

get_documents <- function(urls) {
  map_chr(urls, ~{
    cat(".") # poor dude's progress ber
    Sys.sleep(2) # robots.txt crawl delay 
    read_html(.x) %>% 
      xml_node("div.content") %>% 
      as.character() # we do this b/c we aren't parsing it yet but xml2 objects don't serialize at all
  })
}

这是如何使用它。再次,删除head()但也考虑分批进行。

head(lots_of_links) %>% # I'm not waiting for 60 documents
  mutate(content = get_documents(link)) -> links_and_docs
cat("\n")

glimpse(links_and_docs)
## Observations: 6
## Variables: 6
## $ link    <chr> "https://www.bger.ch/ext/eurospider/live/de/php/aza/http/index.php?lang=de&type=highlight_simple_query&...
## $ title   <chr> "18.12.2017 6B 790/2017", "14.12.2017 6G 2/2017", "13.12.2017 5A 975/2017", "13.12.2017 5D 257/2017", "...
## $ court   <chr> "Strafrechtliche Abteilung", "Cour de droit pénal", "II. zivilrechtliche Abteilung", "II. zivilrechtlic...
## $ subject <chr> "Straf- und Massnahmenvollzug", "Procédure pénale", "Familienrecht", "Schuldbetreibungs- und Konkursrec...
## $ object  <chr> "Bedingte Entlassung aus der Verwahrung, Beschleunigungsgebot", "Demande d'interprétation et de rectifi...
## $ content <chr> "<div class=\"content\">\n      \n<div class=\"para\"> </div>\n<div class=\"para\">Bundesgericht </div>...

您仍然需要在各个地方进行错误和有效性检查,如果出现服务器错误或解析问题,可能需要重新抓取页面。但这就是构建这种性质的特定于站点的爬虫的方法。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

R - 抓取多个 url 并在不同的 excel 数据表中写入每个数据 url

来自分类Dev

无法抓取多个URL

来自分类Dev

添加参数以从动态 URL 连接和抓取数据

来自分类Dev

Python Scrapy-从多个网站URL抓取数据

来自分类Dev

Python Scrapy-从多个网站URL抓取数据

来自分类Dev

使用RVest抓取多个URL

来自分类Dev

在R中抓取URL目录ID

来自分类Dev

重定向URL时R抓取(302)

来自分类Dev

重定向URL时R抓取(302)

来自分类Dev

使用for循环或lapply将Web抓取到具有相似URL的R个多个链接

来自分类Dev

将源链接URL添加到R中的Web抓取数据

来自分类Dev

使用R从TripAdvisor抓取数据

来自分类Dev

使用R Web抓取数据

来自分类Dev

如何抓取页面的动态URL?

来自分类Dev

如何使用 R 动态执行网页抓取

来自分类Dev

从抓取URL参数插入数据-PHP PDO

来自分类Dev

使用Python从.ASPX网站URL抓取数据

来自分类Dev

从抓取URL参数插入数据-PHP PDO

来自分类Dev

从数据库中抓取生成URL

来自分类Dev

如何从R中的搜索框中抓取URL链接?

来自分类Dev

在R中抓取一系列URL

来自分类Dev

使用URL中的变量循环抓取网站中多个页面的数据

来自分类Dev

使用包含 Python 和漂亮汤的 URL 的 .txt 文件从多个网页中抓取数据

来自分类Dev

跨多个页面的R Web抓取

来自分类Dev

R Web抓取网站的多个级别

来自分类Dev

从R中的网页中抓取多个表

来自分类Dev

如何在R中抓取多个表?

来自分类Dev

网页抓取 - 使用 R 的多个页面

来自分类Dev

R将Atom抓取数据帧