Соскоб ASPX формы и избегая селен - PullRequest
0 голосов
/ 01 марта 2019

Я спрашивал ранее (см. здесь ), как получить результаты из формы ASPX.Форма отображает вывод в новой вкладке (используя функцию window.open в JS).В моем предыдущем посте я не делал правильный запрос POST, и я решил это.

Следующий код успешно извлекает HTML-код из формы с правильными заголовками запроса, и он точно соответствует ответу POST, который я вижу в инспекторе Chrome.Но (...) я не могу получить данные.Как только пользователь делает выбор, открывается новое всплывающее окно, но я не могу его поймать.У всплывающего окна появился новый URL, и его информация не является частью тела ответа на запрос.

URL запроса: https://apps.neb-one.gc.ca/CommodityStatistics/Statistics.aspx

Всплывающий URL [данные, которые я хочу загрузить]: https://apps.neb-one.gc.ca/CommodityStatistics/ViewReport.aspx

url = 'https://apps.neb-one.gc.ca/CommodityStatistics/Statistics.aspx'

with requests.Session() as s:
        s.headers = {
            "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.115 Safari/537.36",
            "Content-Type": "application/x-www-form-urlencoded",
            "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",
            "Referer": "https://apps.neb-one.gc.ca/CommodityStatistics/Statistics.aspx",
            "Accept-Encoding": "gzip, deflate, br",
            "Accept-Language": "en-US,en;q=0.9"
        }

        response = s.get(url)
        soup = BeautifulSoup(response.content, 'html5lib')

        data = { tag['name']: tag['value'] 
            for tag in soup.select('input[name^=ctl00]') if tag.get('value')
            }
        state = { tag['name']: tag['value'] 
                for tag in soup.select('input[name^=__]')
            }

        payload = data.copy()
        payload.update(state)

        payload.update({
            "ctl00$MainContent$rdoCommoditySystem": "ELEC",
            "ctl00$MainContent$lbReportName": '76',
            "ctl00$MainContent$rdoReportFormat": 'PDF',
            "ctl00$MainContent$ddlStartYear": "2008",
            "__EVENTTARGET": "ctl00$MainContent$rdoCommoditySystem$2"
        })

        print(payload['__EVENTTARGET'])
        print(payload['__VIEWSTATE'][-20:])

        response = s.post(url, data=payload, allow_redirects=True)
        soup = BeautifulSoup(response.content, 'html5lib')

        state = { tag['name']: tag['value'] 
                 for tag in soup.select('input[name^=__]')
             }

        payload.pop("ctl00$MainContent$ddlStartYear")
        payload.update(state)
        payload.update({
            "__EVENTTARGET": "ctl00$MainContent$lbReportName",
            "ctl00$MainContent$lbReportName": "171",
            "ctl00$MainContent$ddlFrom": "01/12/2018 12:00:00 AM"
        })

        print(payload['__EVENTTARGET'])
        print(payload['__VIEWSTATE'][-20:])

        response = s.post(url, data=payload, allow_redirects=True)
        soup = BeautifulSoup(response.content, 'html5lib')

        state = { tag['name']: tag['value']
                 for tag in soup.select('input[name^=__]')
                }

        payload.update(state)
        payload.update({
            "ctl00$MainContent$ddlFrom": "01/10/1990 12:00:00 AM",
            "ctl00$MainContent$rdoReportFormat": "HTML",
            "ctl00$MainContent$btnView": "View"
        })

        print(payload['__VIEWSTATE'])

        response = s.post(url, data=payload, allow_redirects=True)
        print(response.text)

Существует любой способ получитьданные из всплывающего окна, используя requests и bs4?Я заметил, что html-requests может анализировать и визуализировать JS, но все мои испытания оказались безуспешными.

Источник url ​​показывает этот код JS, который, как я полагаю, открывает всплывающее окно с данными:


//<![CDATA[
window.open("ViewReport.aspx", "_blank");Sys.Application.initialize();
//]]>

Но я не могу получить к нему доступ.

1 Ответ

0 голосов
/ 01 марта 2019

См. Этот блог scrapy https://blog.scrapinghub.com/2016/04/20/scrapy-tips-from-the-pros-april-2016-edition

Я использовал эту концепцию в прошлом, чтобы очистить страницы aspx.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...