Использование Twill для захвата .txt со страницы входа Python

Я использую Twill для извлечения страниц, которые содержат нужные данные .txt, чтобы я мог сохранить их в виде файла Excel. Данные защищены паролем, поэтому я вхожу со страницы /user/login.

Мой код сталкивается с проблемой, когда он пытается получить доступ к текстовой странице с экрана входа в систему и сталкивается с кирпичной стеной HTML, а не с самим .txt.

Когда я запускаю логин:

path = "https://naturalgasintel.com/ext/resources/Data-Feed/Daily-GPI/"
end = "td.txt"

go("http://www.naturalgasintel.com/user/login")
showforms()
fv("2", "user[email]", user_email)
fv("2", "user[password]", user_password)
fv("2", "commit", "Login")

datafilelocation = path + year + "/" + month + "/" + date + end
go(datafilelocation)

Когда мой код достигает go(datafilelocation), я получаю следующее:

==> at https://www.naturalgasintel.com/user/login?referer=%2Fext%2Fresources%2FData-Feed%2FDaily-GPI%2F2018%2F12%2F20181221td.txt
Out[18]: u'https://www.naturalgasintel.com/user/login?referer=%2Fext%2Fresources%2FData-Feed%2FDaily-GPI%2F2018%2F12%2F20181221td.txt'

Поэтому он указывает на referer, а не на фактический текст, когда я действительно хочу попасть на страницу:

https://naturalgasintel.com/ext/resources/Data-Feed/Daily-GPI/2018/12/20181221td.txt

Причина, по которой я использовал fv("2", "commit", "Login") вместо submit(), заключается в том, что когда я перехожу на страницу, она дает мне это:

showforms()

Form name=quick-search (#1)
## ## __Name__________________ __Type___ __ID________ __Value__________________
1     q                        text      q            Search 


Form #2
## ## __Name__________________ __Type___ __ID________ __Value__________________
1     utf8                     hidden    (None)       ✓ 
2     authenticity_token       hidden    (None)       pnFnPGhMomX2Lyh7/U8iGOZKsiQnyicj7BWT ... 
3     referer                  hidden    (None)       https://www.naturalgasintel.com/ext/ ... 
4     popup                    hidden    (None)       false 
5     user[email]              text      user_email    
6     user[password]           password  user_pas ... 
7     user[remember_me]        hidden    (None)       0 
8     user[remember_me]        checkbox  user_rem ... None 
9     commit                   submit    (None)       Login 

Затем он говорит мне после того, как я submit():

Note: submit is using submit button: name="commit", value="Login"

Какое лучшее решение для решения этой проблемы?


person HelloToEarth    schedule 21.12.2018    source источник
comment
Проблема определенно в том, что вы не вошли в систему должным образом, поэтому, когда вы делаете запрос данных, он перенаправляет вас обратно на /user/login. Он передает URL-адрес данных в параметре referrer, чтобы он мог перенаправить вас обратно после входа в систему.   -  person cody    schedule 22.12.2018
comment
Я попытался исправить это, войдя в систему с главной страницы, но если вы попробуете, существует только форма № 1 без указателя на адрес электронной почты или пароль пользователя. Это дает только страницу быстрого поиска, поэтому мне нужно войти в систему со страницы пользователя/входа. Есть ли способ войти в систему, сохранить файлы cookie и вернуться на главную страницу, чтобы получить доступ к файлу?   -  person HelloToEarth    schedule 22.12.2018


Ответы (1)


Если вы не против использовать Mechanize вместо Twill, попробуйте следующее:

import mechanize

username = ""
password = ""
login_post_url = "http://www.naturalgasintel.com/user/login"
internal_url = "https://naturalgasintel.com/ext/resources/Data-Feed/Daily-GPI/2018/12/20181221td.txt"

browser = mechanize.Browser()
browser.open(login_post_url)
browser.select_form(nr = 1)
browser.form['user[email]'] = username
browser.form['user[password]'] = password
browser.submit()

response = browser.open(internal_url)
print response.read()

person walkinghawk    schedule 05.01.2019
comment
Спасибо, @walkinghawk. Это был действительно единственный способ сделать это в 2.7! - person HelloToEarth; 08.01.2019