Войдите на веб-страницу с библиотекой python запросов, кодом состояния 200, не удается выполнить синтаксический анализ и неавторизованные страницы все еще неавторизованы - PullRequest
0 голосов
/ 20 июня 2020

Я пытаюсь создать свой первый веб-парсер, цель которого - очистить некоторые таблицы данных с веб-сайта и использовать их для заполнения pandas фреймов данных. На сайте требуется логин. Веб-сайт называется spotra c .com .

У меня возникла пара проблем. Во-первых, когда я запускаю метод публикации beautifulsoup, я получаю следующую ошибку: «InvalidURL: Failed to parse: ". Эта ошибка возникает, когда я запускаю следующий код:

import pandas as pd
import requests, lxml.html
from bs4 import BeautifulSoup

with requests.session() as s:    
    login = s.get('http://www.spotrac.com/signin/submit/')
    form = {'redirect' : '',
            'email' : 'my_email@gmail.com',
            'password' : 'my_password',
            }    

    p = s.post(login, data=form)

    r1 = s.get('http://www.spotrac.com/nfl/rankings/2019/base/quarterback/')
    soup1 = BeautifulSoup(r1.content,'lxml')
    table1 = soup1.find_all('table')[0]
    df1 = pd.read_html(str(table1))
    
    r2 = s.get('http://www.spotrac.com/nfl/rankings/2018/base/quarterback/')
    soup2 = BeautifulSoup(r2.content,'lxml')
    table2 = soup2.find_all('table')[0]
    df2 = pd.read_html(str(table2))
    
    print(r1.status_code) # 200
    print(r2.status_code) # 200

Чтобы мой код продолжал работать, я помещаю строку сообщения в блок try, как показано ниже:

with requests.session() as s:    
    try:
        p = s.post(login, data=form)
    except:
        pass

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

Проблема, с которой я сталкиваюсь после этого, заключается в том, что когда я go на неавторизованную веб-страницу, таблицы данных не заполняются, как если бы я вошел в систему. В моем коде вы увидите r1 и r2. Когда я go через процесс получения данных из r1, У меня нет проблем. Я считаю, что это потому, что он общедоступен . Когда я пробую тот же процесс для r2, я получаю следующую ошибку: «IndexError: индекс списка вне допустимого диапазона». Эта ошибка возникает из-за того, что веб-страница не загружает таблицу данных, поскольку таблица данных доступна только для премиум-клиентов, которые вошли в систему. Я знаю, что это так, потому что если вы go перейдете на веб-страницу r1 (http://www.spotrac.com/nfl/rankings/2019/base/quarterback/) вы увидите e таблица данных без входа в систему. Если вы попытаетесь go перейти на веб-страницу r2 (http://www.spotrac.com/nfl/rankings/2018/base/quarterback/), вы увидите не таблицу данных. Вместо этого вы будете перенаправлены на страницу входа.

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

Спасибо, Дэвид

1 Ответ

1 голос
/ 23 июня 2020

На самом деле это была очень глупая ошибка. Проблема в том, что я передавал следующую переменную "login" методу post, а не URL-адрес входа:

login = s.get('http://www.spotrac.com/signin/submit/')
p = s.post(login, data=form)

Я все еще хотел запустить метод get, поэтому я просто назначил URL-адрес отдельная переменная. Простое исправление:

login = 'http://www.spotrac.com/signin/submit/'
r = s.get(login)
p = s.post(login, data=form)
...