Недавно я выложил вопрос про то как подсчитать количество страниц на сайте,
ccылка
Данный вопрос создан чтобы разобрать один из методов подсчета. Методов было несколько:
- Использовать sitemap.xml
- Индексация сайтов в гугл, то есть загуглить site:url (url - сайт который нужно искать) через несколько миллисекунд гугл выдаст количество найденных страниц
- Зайти на страницу сайта и искать все ссылки ведущие на другие страницы сайта и грамотна проверять чтобы не попасть в бесконечный цикл
- Использование инструментов для собирания информации о сайте (т.к. Screaming Frog)
Это все способы что мне удалось найти. Лично я писал скрипт проходясь по sitemap.xml, какие были у меня проблемы:
- Маленькая скорость
- Не все сайты имеют sitemap
- Разная структура sitemap
- В данный момент у меня стоит задача подсчитать страницы таких сайтов как википедия, ютуб и т.д., так как эти сайты имеют очень обширную sitemap этот способ не эффективный
Сразу скажу про инструменты такие как Screaming Frog, это было очень медленно и в итоге я не увидел статистики по количеству страниц.
Искать на главной странице ссылки которые ведут на другие странице это нереально долго.
Остается только поиск в гугле. В чем проблема, через selenium получается долго, хотя тоже не плохо если запускать в потоках и на несколько серверов, но проблема в капче и бане от гугла. Я так и не нашел никакого api которое давало бы мне возможность совершать много запросов в секунду. Код для selenium:
from selenium.webdriver import Chrome
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.chrome.options import Options
import time
from fake_useragent import UserAgent
def create_browser():
ua = UserAgent()
options = Options()
options.add_argument(f"user-agent={ua.random}")
browser = Chrome(options=options)
return browser
def read_urls_file():
with open("urls.txt", "r") as file:
urls = [i for i in file.readlines()]
return urls
def get_page_count(browser):
WebDriverWait(browser, 10).until(EC.presence_of_element_located((By.ID, "result-stats")))
result_text = browser.find_element(by=By.ID, value="result-stats").text
count = int(result_text[25:result_text.find(" (")].replace(" ", ""))
return count
def main():
browser = create_browser()
urls = read_urls_file()
for index, url in enumerate(urls):
browser.get(url)
page_count = get_page_count(browser)
print(f"{url.strip()}: {page_count}")
if __name__ == '__main__':
main()
Также пробовал через запросы, но гугл меня детектит и не дает получить информацию.
Я уже запутался как можно выполнить данную задачу. Возможно я упускаю что-то или просто не понимаю. Возможно кто-то знает какую-то статью которая помогла бы мне с моей проблемой, или кто-то уже сталкивался с этим и знает как это можно решить.