запустите следующий код без ошибки тайм-аута - PullRequest
0 голосов
/ 08 октября 2019

Какие улучшения я могу внести в следующие строки кода, чтобы он работал быстрее и давал мне нужные результаты. Код занимает слишком много времени для запуска. Я попытался запустить этот код на своем компьютере, но вместо этого я получил сообщение об ошибке тайм-аута. Этот код перебирает 3564 страницы. Как я могу улучшить это, чтобы избавиться от ошибки тайм-аута? Код работает только для страниц в небольшом диапазоне.

import pandas as pd
from bs4 import BeautifulSoup,Tag
import requests
data = []
s=("https://www.cupcakemaps.com/search_results?page=")
for x in range(1,3564):
    res=requests.get(s+str(x),timeout=20)
    soup=BeautifulSoup(res.text,'lxml')
    listings=soup.findAll(class_='grid_element')
    for listing in listings:
        listing_name=listing.find('span',{'class':'h3 bold inline-block rmargin member-search-full-name'})
        if isinstance(listing_name,Tag):
            listing_name=listing_name.text.strip()
        listing_description=listing.find('p',{'class':'small member-search-description'})
        if isinstance(listing_description,Tag):
            listing_description=listing_description.text.strip()
        listing_location=listing.find('span',{'class':'small member-search-location rmargin rpad'})
        if isinstance (listing_location,Tag):
            listing_location=listing_location.text.strip()
        full_dict={'Title':listing_name,'Description':listing_description,'Location':listing_location}
        data.append(full_dict)

df=pd.DataFrame(data)
print(df)

Я ожидаю, что код распечатает фрейм данных с 3 столбцами.

1 Ответ

0 голосов
/ 08 октября 2019

Вы пытались присвоить None для res и протестировать его как None в попытке-> кроме Timeout в цикле while?

import time

for x in range(1,3564):
    res = None

    while not res:
       try:
           res=requests.get(s+str(x),timeout=20)
       except requests.exceptions.Timeout:
           time.sleep(5) # wait 5 seconds and try again
    soup=BeautifulSoup(res.text,'lxml')
    listings=soup.findAll(class_='grid_element')
    for listing in listings:
        listing_name=listing.find('span',{'class':'h3 bold inline-block rmargin member-search-full-name'})
        if isinstance(listing_name,Tag):
            listing_name=listing_name.text.strip()
        listing_description=listing.find('p',{'class':'small member-search-description'})
        if isinstance(listing_description,Tag):
            listing_description=listing_description.text.strip()
        listing_location=listing.find('span',{'class':'small member-search-location rmargin rpad'})
        if isinstance (listing_location,Tag):
            listing_location=listing_location.text.strip()
        full_dict={'Title':listing_name,'Description':listing_description,'Location':listing_location}
        data.append(full_dict)

Итак, мы просто инициируем res как переменную None, проверяя, чтоон остается None и повторяет запрос, если положительный. Каждый раз, когда возникает исключение request.exceptions.Timeout, мы перехватываем его и ждем 5 секунд, прежде чем вернуться к циклу while.
Если в запросах возникает другое исключение, вы можете попробовать заменить строку исключений на:

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