Как заставить веб-сайт последовательно возвращать контент из GET-запроса, когда он противоречив? - PullRequest
1 голос
/ 17 мая 2019

Я опубликовал аналогичный вопрос ранее, но думаю, что это более изощренный вопрос.

Я пытаюсь очистить: https://www.prosportstransactions.com/football/Search/SearchResults.php?Player=&Team=&BeginDate=&EndDate=&PlayerMovementChkBx=yes&submit=Search&start=0

Мой код случайным образом выдает ошибки при отправкеПОЛУЧИТЕ запрос на URL.После отладки я увидел следующее.Будет отправлен запрос GET для следующего URL-адреса (пример URL-адреса, может произойти на любой странице): https://www.prosportstransactions.com/football/Search/SearchResults.php?Player=&Team=&BeginDate=&EndDate=&PlayerMovementChkBx=yes&submit=Search&start=2400

На веб-странице будет указано «Не найдено подходящих транзакций».Однако, если я обновлю страницу, содержимое будет загружено.Я использую BeautifulSoup и Selenium и поместил в свой код операторы сна в надежде, что это сработает, но безрезультатно.Это проблема на конце сайта?Мне не имеет смысла, как один запрос GET ничего не будет возвращать, но точно такой же запрос будет что-то возвращать.Кроме того, есть ли что-нибудь, что я мог бы исправить или это вышло из-под контроля?

Вот пример моего кода: t

def scrapeWebsite(url, start, stop):
    driver = webdriver.Chrome(executable_path='/Users/Downloads/chromedriver')
    print(start, stop)


    madeDict = {"Date": [], "Team": [], "Name": [], "Relinquished": [], "Notes": []}

    #for i in range(0, 214025, 25):
    for i in range(start, stop, 25):
        print("Current Page: " + str(i))
        currUrl = url + str(i)
        #print(currUrl)
        #r = requests.get(currUrl)
        #soupPage = BeautifulSoup(r.content)

        driver.get(currUrl)
        #Sleep program for dynamic refreshing
        time.sleep(1)
        soupPage = BeautifulSoup(driver.page_source, 'html.parser')

        #page = urllib2.urlopen(currUrl)
        #time.sleep(2)
        #soupPage = BeautifulSoup(page, 'html.parser')


        info = soupPage.find("table", attrs={'class': 'datatable center'})
        time.sleep(1)
        extractedInfo = info.findAll("td")

Ошибка возникает в последней строке.«findAll» жалуется, потому что не может найти findAll, когда содержимое имеет значение null (что означает, что запрос GET ничего не возвратил)

1 Ответ

0 голосов
/ 17 мая 2019

Я нашел способ обойти всю страницу, используя try except.

Возможно, цикл запросов такой быстрый, и страница не может его поддерживать.

См. Пример ниже, сработавший как шарм:

import requests
from bs4 import BeautifulSoup

URL = 'https://www.prosportstransactions.com/football/Search/SearchResults.php?Player=&Team=&BeginDate=&EndDate=' \
      '&PlayerMovementChkBx=yes&submit=Search&start=%s'


def scrape(start=0, stop=214525):
    for page in range(start, stop, 25):
        current_url = URL % page

        print('scrape: current %s' % page)
        while True:
            try:
                response = requests.request('GET', current_url)
                if response.ok:
                    soup = BeautifulSoup(response.content.decode('utf-8'), features='html.parser')

                    table = soup.find("table", attrs={'class': 'datatable center'})
                    trs = table.find_all('tr')

                    slice_pos = 1 if page > 0 else 0
                    for tr in trs[slice_pos:]:
                        yield tr.find_all('td')

                    break
            except Exception as exception:
                print(exception)


for columns in scrape():
    values = [column.text.strip() for column in columns]
    # Continuous your code ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...