#python #selenium #web-scraping #beautifulsoup #scrapy
Вопрос:
Я хочу выполнить поиск по веб-сайту и найти все ссылки в формате pdf. Я знаю, что есть несколько решений с BeautifulSoup для поиска PDF-файлов с помощью тегов < a>, но я хочу выполнить поиск по всему домену, используя базовый URL-адрес, а не только связанную страницу.
Моя идея состояла в том, чтобы а) сначала выполнить поиск по всему веб-сайту для всех дополнительных ссылок, а затем б) отфильтровать ссылки с расширением .pdf. Для первой части я попробовал это https://github.com/mujeebishaque/extract-urls:
import requests
from bs4 import BeautifulSoup
if __name__ == '__main__':
user_input_url = "https://www.aurednik.de/"
if not user_input_url or len(user_input_url) < 1:
raise Exception("INFO: Invalid Input")
_start = user_input_url.find('//')
_end = user_input_url.find('.com')
readable_website_name = user_input_url[_start 2:_end].strip()
try:
website_content = requests.get(user_input_url.strip()).text
except:
check_internet = requests.get('https://google.com').status_code
if check_internet != requests.codes.ok:
raise ConnectionError("ERROR: Check internet connection.")
_soup = BeautifulSoup(website_content, features='lxml')
internal_url_links = []
external_url_links = []
for link in _soup.find_all('a', href=True):
if readable_website_name in link.get('href'):
internal_url_links.append(link['href'])
if readable_website_name not in link.get('href') and len(link.get('href')) > 3:
external_url_links.append(link['href'])
print(internal_url_links, 'n')
print(external_url_links, 'n')
Я ожидал, что он сможет сканировать и возвращать все ссылки, такие как
https://www.aurednik.de/info-service/downloads/#unserekataloge
и https://www.aurednik.de/downloads/AUREDNIK_Haupt2021.pdf но это не так. Я вообще не вижу 2-й ссылки на pdf, а для первой ссылки я вижу только
/info-service/downloads/#unserekataloge
когда я распечатываю внешние ссылки. Мне нужна полная ссылка и желательно также все ссылки в формате pdf на домене веб-сайта. Как еще я мог бы этого достичь? Я открыт для использования любых инструментов или библиотек.
Ответ №1:
Возможно, на веб-сайте есть динамический контент. Проверьте, содержит ли HTML, загруженный BeautifulSoup, тот же самый, что и при просмотре веб-сайта в вашем браузере. Если нет, используйте, например, селен для очистки веб-сайта с динамически загружаемым контентом.
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
driver = webdriver.Firefox()
html = driver.page_source
soup = BeautifulSoup(html)
internal_url_links = []
external_url_links = []
for link in soup.find_all('a', href=True):
if readable_website_name in link.get('href'):
internal_url_links.append(link['href'])
if readable_website_name not in link.get('href') and len(link.get('href')) > 3:
external_url_links.append(link['href'])
print(internal_url_links, 'n')
print(external_url_links, 'n')
driver.close()
Комментарии:
1. где мы можем добавить исходный базовый URL-адрес здесь?