POST-запрос с данными формы, работающими только на текущий год - PullRequest
1 голос
/ 27 мая 2019

Я пытаюсь отправить данные формы, чтобы получить информацию о счетах за каждый год. Все работает, как и ожидалось в 2019 году, однако, если я изменю данные формы «ctl00 $ rilinContent $ cbYear» на предыдущий год, он просто вернет страницу поиска по умолчанию (по умолчанию 2019 как год) и, следовательно, не даст никакой информации для сбора.

Я пытался использовать «__EVENTTARGET», чтобы изменить год, но безуспешно. Спасибо за любую помощь, которую вы можете оказать.

Пример кода

import requests

default_data = {'__EVENTTARGET': '',
            '__EVENTARGUMENT': '',
            '__LASTFOCUS': '',
            '__VIEWSTATE': 'PZZDS...', #(long string)
            '__VIEWSTATEGENERATOR': 'B3C16737',
            '__EVENTVALIDATION': 'kp03y...', #(long string)
            'ctl00$rilinContent$cbYear': '',
            'ctl00$rilinContent$txtReport': '',
            'ctl00$rilinContent$cbCommittee': '',
            'ctl00$rilinContent$comm': 'cbxIn',
            'ctl00$rilinContent$cbCategory': '',
            'ctl00$rilinContent$cbSponsor': '',
            'ctl00$rilinContent$cbxPrime': '',
            'ctl00$rilinContent$txtBills': '',
            'ctl00$rilinContent$cbxSortNumeric': '',
            'ctl00$rilinContent$txtBillFrom': '',
            'ctl00$rilinContent$txtBillTo': '',
            'ctl00$rilinContent$cbAction': '',
            'ctl00$rilinContent$cbxLastAction': '',
            'ctl00$rilinContent$cmdReport': 'Enter',
            'ctl00$rilinContent$hfQuery': ''}

url = "http://status.rilin.state.ri.us/"
data = default_data

headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"}

data['ctl00$rilinContent$cbYear'] = '2019'
data['ctl00$rilinContent$cbCategory'] = '307'

r = requests.post(url, data=data, headers=headers).text

# simple test
string = 'Legislative Status Report'
string in r

1 Ответ

2 голосов
/ 27 мая 2019

Я думаю, что страница делает первоначальное обновление через POST для года, а затем для брака. Следующее может быть упрощено, я уверен, но, кажется, работает

import requests
from bs4 import BeautifulSoup as bs

default_data = {'__EVENTTARGET': '',
            '__EVENTARGUMENT': '',
            '__LASTFOCUS': '',
            '__VIEWSTATE': '', 
            '__VIEWSTATEGENERATOR': 'B3C16737',
            '__EVENTVALIDATION': '',
            'ctl00$rilinContent$cbYear': '',
            'ctl00$rilinContent$txtReport': '',
            'ctl00$rilinContent$cbCommittee': '',
            'ctl00$rilinContent$comm': 'cbxIn',
            'ctl00$rilinContent$cbCategory': '',
            'ctl00$rilinContent$cbSponsor': '',
            'ctl00$rilinContent$cbxPrime': '',
            'ctl00$rilinContent$txtBills': '',
            'ctl00$rilinContent$cbxSortNumeric': '',
            'ctl00$rilinContent$txtBillFrom': '',
            'ctl00$rilinContent$txtBillTo': '',
            'ctl00$rilinContent$cbAction': '',
            'ctl00$rilinContent$cbxLastAction': '',
            'ctl00$rilinContent$cmdReport': '', #'Enter'
            'ctl00$rilinContent$hfQuery': ''}

url = "http://status.rilin.state.ri.us/"
data = default_data

headers = {
    'User-Agent': 'Mozilla/5.0',
    'Accept' : 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
    'Content-Type' : 'application/x-www-form-urlencoded'
}

data['ctl00$rilinContent$cbYear'] = 2017

with requests.Session() as s:
    r = s.get(url)
    soup = bs(r.content, 'lxml')
    vs = soup.select_one('#__VIEWSTATE')['value']
    ev = soup.select_one('#__EVENTVALIDATION')['value']
    data['__VIEWSTATE'] = vs
    data['__EVENTVALIDATION'] = ev
    r = s.post(url, data=data, headers=headers)
    soup = bs(r.content, 'lxml')
    vs = soup.select_one('#__VIEWSTATE')['value']
    ev = soup.select_one('#__EVENTVALIDATION')['value']
    data['ctl00$rilinContent$cbCategory'] = 307
    data['__VIEWSTATE'] = vs
    data['__EVENTVALIDATION'] = ev
    data['ctl00$rilinContent$cmdReport'] = 'Enter'
    r = s.post(url, data=data, headers=headers)
    soup = bs(r.content, 'lxml')
    print(soup)
...