ใช้ 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 ที่มีอยู่โดยไม่มีตัวชี้ไปยังอีเมลหรือรหัสผ่านของผู้ใช้ มันให้เฉพาะหน้าค้นหาด่วนเท่านั้น ดังนั้นฉันต้องเข้าสู่ระบบจากหน้าผู้ใช้/เข้าสู่ระบบ มีวิธีใดบ้างในการเข้าสู่ระบบ บันทึกด้วยคุกกี้ และกลับไปที่หน้าหลักเพื่อเข้าถึงไฟล์?   -  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