Как парсить 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.