Как сделать соскоб быстрее? - PullRequest
0 голосов
/ 31 марта 2020

Я соскоб https://www.purplebricks.co.uk. Моя цель - получать электронные письма от всех эксперсантов с более чем 1 000 000 почтовых индексов. Но есть только 600 - 700 экспертов и обычно есть 1 - 5 экспертов на 1 странице, таким образом, есть только 200 - 300 полезных почтовых индексов, но я не знаю, какие. Мой код сейчас такой:

URL = "https://www.purplebricks.co.uk/search-local-expert?postcode="
driver = webdriver.Chrome()
emails = set()
postcodes = ['AB1 0AA', 'AB1 1AA', 'AB1 2AA', 'AB1 3AA']
for postcode in postcodes:
    postcode_url = (URL + postcode).replace(" ", "%20")
    driver.get(postcode_url)
    try:
        wait = WebDriverWait(driver, 1)
        wait = wait.until(EC.presence_of_element_located(
            (By.CLASS_NAME, "p_not-found-message_2vB3")))
    except TimeoutException:
        names = driver.find_elements_by_class_name("p_name_1T9u")
        for name in names:
            email = name.get_attribute("innerText").replace("\n", ".") + "@purplebricks.com"
            emails.add(email)
print(emails)

Это работает так. Он получает html страницы и выполняет поиск, если не найден элемент, например там . Это происходит в большинстве случаев, но в 0,03% есть некоторые эксперты, например там . Я знаю, что их адрес электронной почты - имя. lastname@purplebricks.com, поэтому мне не нужно открывать страницу для каждого. Проблема в том, что он очень медленный + - 1 / se c, поэтому потребуется 1 000 000 секунд, что составляет 11 дней. Есть мои идеи, как улучшить время, но я не могу, если они хороши или как их реализовать.

  1. Безголовый драйвер:
    # initialize options
    options = webdriver.ChromeOptions()
    # pass in headless argument to options
    options.add_argument('--headless')
    # initialize driver
    driver = webdriver.Chrome(chrome_options=options)

Есть это действительно помогает?

Лучший выбор для поиска: очень велика вероятность того, что номера постов, которые находятся позади, имеют одинаковый результат (те же эксперты или ничего). Вот почему я думаю, что хорошо искать вначале и последнем, что находится посередине, затем прямо между 1. и средним, а также средним и последним. И так далее.

enter image description here

На этом рисунке порядок красный> желтый> синий> фиолетовый. Я думаю, что это хорошо, так что я буду воплощать это в жизнь.

Multi thearding: я не знаю, как это реализовать, но я думаю, что это, безусловно, поможет, поэтому я попытаюсь найти его. Если вы можете дать мне совет, я буду очень счастлив.

Не используйте селен: это, вероятно, поможет больше всего, потому что это очень медленно, и я думаю, что это не нужно для этой сети потому что он возвращает нормальный html по запросу, но я не смог найти нужные элементы в запросах, потому что им нужно время для загрузки, и я не знал, как это сделать. Есть ли способ, как загрузить страницы в какое-то хранилище и чем go через них быстрее?

Спасибо за ответ, потому что я не знаю, что делать. <3 </p>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...