BeautifulSoup: элемент таблицы не обнаруживается постоянно; Ошибка NoneType иногда возвращается - PullRequest
0 голосов
/ 09 апреля 2020

Привет всем, я хочу получить фактические дневные температуры от www.wunderground.com и время от времени сталкивался с ошибкой NoneType. Например, , ниже приведен фрагмент кода, который пытается измерить температуру с 1 марта по 5 марта 2020 года. Бывают случаи, когда я могу получить результаты за первые пару дней, но есть также В тех случаях, когда код ломался на этапе получения сводной таблицы , , т.е. , он не мог найти таблицу с атрибутом класса "ng-star-вставлен".

from bs4 import BeautifulSoup
from selenium import webdriver
import time

driver = webdriver.Chrome()
df = {'date':[], 'daily average temperature':[]}
while day <= 5:
    daily_weather_url = "https://www.wunderground.com/history/daily/KBOS/date/2020-3-" + str(day)
    driver.get(daily_weather_url)
    content = driver.page_source
    soup = BeautifulSoup(content, 'lxml')

    summary_table = soup.find("table", attrs={"class": "ng-star-inserted"})
    summary_table_rows=summary_table.find_all("tr")

    average_temp=summary_table_rows[3].find_all("td")[0].text.strip()

    df['date'].append("2020-3-"+str(day))
    df['daily average temperature'].append(average_temp)

    day += 1 
    time.sleep(30)

driver.close()
df = pd.DataFrame(df)
print(df)

Интересно, вызвано ли это тем, что сервер wunderground.com является оборонительным и не позволяет пользователям ломиться. Но его robots.txt, кажется, предполагает, что очистка в порядке с задержкой сканирования 10 se c. Как я могу устранить эту ошибку? Любые идеи будут оценены.

1 Ответ

0 голосов
/ 09 апреля 2020

Попробуйте установить заголовки вашего запроса, я сделал, и очистка l oop работала просто отлично, я использовал webdriver. FireFox (), но это не должно иметь значения:

from bs4 import BeautifulSoup
from selenium import webdriver
import time

driver = webdriver.Chrome()
df = {'date':[], 'daily average temperature':[]}
day = 1
while day <= 5:
    daily_weather_url = "https://www.wunderground.com/history/daily/KBOS/date/2020-3-" + str(day)
    driver.header_overrides = {
    "Host": "www.wunderground.com",
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:74.0) Gecko/20100101 Firefox/74.0",
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
    "Accept-Language": "en-US,en;q=0.5",
    "Accept-Encoding": "gzip, deflate, br",
    "Connection": "keep-alive",
    "Upgrade-Insecure-Requests": "1",
    "Cache-Control": "max-age=0",
    "TE": "Trailers"
    } 
    driver.get(daily_weather_url)
    content = driver.page_source
    soup = BeautifulSoup(content, 'lxml')

    summary_table = soup.find("table", attrs={"class": "ng-star-inserted"})
    summary_table_rows=summary_table.find_all("tr")

    average_temp=summary_table_rows[3].find_all("td")[0].text.strip()

    df['date'].append("2020-3-"+str(day))
    df['daily average temperature'].append(average_temp)

    day += 1 
    time.sleep(10)

driver.close()
df = pd.DataFrame(df)
print(df)

enter image description here

...