2014-12-29 3 views
4

Я пытаюсь получить Automaticly некоторых данных с этого сайта: http://www.casablanca-bourse.com/bourseweb/en/Negociation-History.aspx?Cat=24&IdLink=225Python - Скачать файл из формы ASPX

с использованием urllib2 в питоне, я успешно получил HTML-файл, как если бы я нажимаю на кнопку «Отправить» на этом веб-сайте.

Но, когда я имитирую поведение нажатия на ссылку «скачать данные», я получил что-то в качестве вывода.

Мой код:

import urllib 
import urllib2 

uri = 'http://www.casablanca-bourse.com/bourseweb/en/Negociation-History.aspx?Cat=24&IdLink=225' 
headers = { 
    'HTTP_USER_AGENT': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36', 
    'HTTP_ACCEPT': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8' 
} 

formFields = (
    (r'TopControl1$ScriptManager1', r'HistoriqueNegociation1$UpdatePanel1|HistoriqueNegociation1$HistValeur1$LinkButton1'), 
    (r'__EVENTTARGET', r'HistoriqueNegociation1$HistValeur1$LinkButton1'), 
    (r'__EVENTARGUMENT', r''), 
    (r'__VIEWSTATE', r'/wEPDwUKMTcy/ ... +ZHYQBq1hB/BZ2BJyHdLM='), #just a small part because it's so long ! 
    (r'TopControl1$TxtRecherche', r''), 
    (r'TopControl1$txtValeur', r''), 
    (r'HistoriqueNegociation1$HistValeur1$DDValeur', r'9000 '), 
    (r'HistoriqueNegociation1$HistValeur1$historique', r'RBSearchDate'), 
    (r'HistoriqueNegociation1$HistValeur1$DateTimeControl1$TBCalendar', r'22/12/2014'), 
    (r'HistoriqueNegociation1$HistValeur1$DateTimeControl2$TBCalendar', r'28/12/2014'), 
    (r'HistoriqueNegociation1$HistValeur1$DDuree', r'6'), 
    (r'hiddenInputToUpdateATBuffer_CommonToolkitScripts', r'1') 
) 


encodedFields = urllib.urlencode(formFields) 

req = urllib2.Request(uri, encodedFields, headers) 
f = urllib2.urlopen(req) 

Что я должен сделать для того, чтобы получить тот же файл, как если бы я нажимаю на «загрузить данные» ссылка на сайт?

Спасибо

+1

Причина изменения значений формы в формате «ASP.NET» каждый раз, когда вы извлекаете страницу, вам нужно проанализировать значения из полученного HTML-кода, а не жестко кодировать их. – alecxe

ответ

0

Прежде всего, я хотел бы предложить вам ие requests библиотеки вместо URLLIB. Также нужно BeautifulSoup для работы с HTML-тегами:

pip install requests 

pip install beautifulsoup4 

Чем, код будет выглядеть следующим образом:

import requests 
from bs4 import BeautifulSoup 

session = requests.Session() 

payload = { 
    r'TopControl1$ScriptManager1': r'HistoriqueNegociation1$UpdatePanel1|HistoriqueNegociation1$HistValeur1$LinkButton1', 
    r'__EVENTTARGET': r'HistoriqueNegociation1$HistValeur1$LinkButton1', 
    r'__EVENTARGUMENT': r'', 
    r'TopControl1$TxtRecherche': r'', 
    r'TopControl1$txtValeur': r'', 
    r'HistoriqueNegociation1$HistValeur1$DDValeur': r'9000 ', 
    r'HistoriqueNegociation1$HistValeur1$historique': r'RBSearchDate', 
    r'HistoriqueNegociation1$HistValeur1$DateTimeControl1$TBCalendar': r'22/12/2014', 
    r'HistoriqueNegociation1$HistValeur1$DateTimeControl2$TBCalendar': r'28/12/2014', 
    r'HistoriqueNegociation1$HistValeur1$DDuree': r'6', 
    r'hiddenInputToUpdateATBuffer_CommonToolkitScripts': r'1' 
    } 


uri = 'http://www.casablanca-bourse.com/bourseweb/en/Negociation-History.aspx?Cat=24&IdLink=225' 
r = session.get(uri) 

#Find __VIEWSTATE value, there is only one input tag with type="hidden" 
soup = BeautifulSoup(r.text) 
viewstate_tag = soup.find('input', attrs={"type" : "hidden"}) 
payload[viewstate_tag['name']] = viewstate_tag['value'] 

r = session.post(uri, payload) 
print r.text #contains html table with data 

Во-первых, мы получаем исходную страницу, извлечь __VIEWSTATE значение и использовать это значение для второй запрос.

+0

спасибо, что так много NorthCat, ты спас мой день :) – BilNash

Смежные вопросы