driver.find_element_by_css_selector работает медленно к концу страницы - PullRequest
1 голос
/ 30 мая 2019

У меня есть веб-скребок с температурой from selenium import webdriver, работающий с weather.com с использованием Python. Веб-скребок в начале страницы находит правильные высокие и низкие температуры практически мгновенно. Однако ближе к концу страницы она становится все медленнее (к концу уходит 7 секунд). Вероятно, это связано с тем, что для поиска правильных данных скребок должен пройти через больше HTML (?). Вот основная часть кода:

high = driver.find_element_by_css_selector('#twc-scrollabe > table > tbody > tr:nth-child(' + str(j) + ') > td.temp > div > span:nth-child(1)').text
low = driver.find_element_by_css_selector('#twc-scrollabe > table > tbody > tr:nth-child(' + str(j) + ') > td.temp > div > span:nth-child(3)').text
    date = driver.find_element_by_css_selector('#twc-scrollabe > table > tbody > tr:nth-child(' + str(j) + ') > td:nth-child(2) > div > span').text

#auth > div > div > div > div > div > form > button

#twc-scrollabe > table > tbody > tr:nth-child(1) > td:nth-child(2) > div > span
#twc-scrollabe > table > tbody > tr:nth-child(2) > td:nth-child(2) > div > span

Есть ли простое (или сложное) решение этой проблемы? И если вы думаете, что не существует легкого решения, это было бы также очень полезно (что могло бы быть в случае?)

1 Ответ

1 голос
/ 01 июня 2019

Сгенерирован ли JavaScript контент, который вы ищете?Если бы это был только HTML, вы могли бы избегать безголового браузера и использовать requests и bs4:

$ python test.py
Got response: 200
Today JUN 1  80°/61°
Sun   JUN 2  70°/47°
Mon   JUN 3  63°/45°
Tue   JUN 4  74°/57°
Wed   JUN 5  75°/64°
Thu   JUN 6  77°/63°
Fri   JUN 7  77°/64°
Sat   JUN 8  81°/66°
Sun   JUN 9  81°/65°
Mon   JUN 10 80°/63°
Tue   JUN 11 80°/63°
Wed   JUN 12 81°/62°
Thu   JUN 13 80°/63°
Fri   JUN 14 81°/63°
Sat   JUN 15 81°/63°
Total: 0.66s, request: 0.60s

test.py

import requests
import time

from bs4 import BeautifulSoup

URL = 'https://weather.com/weather/tenday/l/USPA1290:1:US'


def fetch(url):
    with requests.Session() as s:
        r = s.get(URL, timeout=5)
        return r


def main():
    start_t = time.time()
    resp = fetch(URL)
    print(f'Got response: {resp.status_code}')
    html = resp.text
    bs = BeautifulSoup(html, 'html.parser')
    tds = bs.find_all('td', class_='twc-sticky-col', attrs={'headers': 'day'})
    for td in tds:
        date_time = td.find_next('span', class_='date-time')
        day_detail = td.find_next('span', class_='day-detail')
        temp = td.find_next('td', class_='temp', attrs={'headers': 'hi-lo'})
        hi_lo = '/'.join(i.text for i in temp.find_all('span', class_=''))
        print(f'{date_time.text:5} {day_detail.text:6} {hi_lo}')
    end_t = time.time()
    elapsed_t = end_t - start_t
    r_time = resp.elapsed.total_seconds()
    print(f'Total: {elapsed_t:.2f}s, request: {r_time:.2f}s')


if __name__ == '__main__':
    main()
...