Как парсить PDF-файлы с сайтов и поддоменов, не натыкаясь на капчу? (R, python)

Вопрос: Мне нужно собрать ссылки на PDF-файлы (рабочие программы дисциплин) с сайтов вузов. У меня есть список сайтов вроде:

Однако сами файлы часто лежат на поддоменах — например, docs.university-a.ru, cabinet.institute-b.edu, и т.д. Это вызывает проблемы с поиском. При этом, карты всех доменов у меня, разумеется, нет.

Что я пробовал:

Поиск через Bing и DuckDuckGo

Формировал поисковый запрос так:

query <- paste0("filetype:pdf название_дисциплины site:", domain)
search_url <- paste0("https://www.bing.com/search?q=", URLencode(query))

В браузере по такому запросу я вижу нужный файл в первой ссылке, а через R получаю либо пустую страницу, либо ссылку на неподходящий домен.

Парсинг результатов через rvest

resp <- GET(search_url, user_agent("Mozilla/5.0"))
page <- content(resp, as = "parsed")
links <- page %>% html_nodes("a") %>% html_attr("href")
pdf_links <- links[grepl("\\.pdf", links, ignore.case = TRUE)]

Иногда результат есть, но часто — вообще ни одной PDF-ссылки. Даже если вручную они точно находятся.

Обработка поддоменов

Я убирал https:// и www. из доменов, чтобы site: стал короче, и выдача была более разнообразной (при https:// и www. скрипт искал только по конкретному домену)

main_domain <- gsub("^(https?://)?(www\\.)?", "", site)

Помогает, но не стабильно. Иногда Bing и DDG всё равно не показывают файлы с поддоменов.

Но в итоге, даже решая эти проблемы, я всё равно натыкался на главную проблему:

Антибот-защита/Капча

Я добавлял случайные паузы, кастомный User-Agent и т.п.:

Sys.sleep(sample(8:15, 1))
GET(url, user_agent("Mozilla/5.0"))

Но всё-равно, DuckDuckGo быстро начинает показывать капчу (через 15-20 запросов), Bing часто отдаёт неполную или пустую выдачу без ссылок.

Что хочу понять: Есть ли способ надежно искать и извлекать PDF-ссылки с сайтов и их поддоменов:

не натыкаясь на капчу; возможно, если натыкаясь, то решая капчу автоматически; или, возможно, вообще обходя поисковики?

Буду рад решениям как на R, так и на Python.


Ответы (0 шт):