Соскоб ASPX формы и избегая селен
Ранее я спрашивал (см. Здесь), как получить результаты из формы ASPX. Форма отображает вывод в новой вкладке (с помощью функции window.open
в JS). В моем предыдущем посте я не делал правильный запрос POST, и я решил это.
Следующий код успешно извлекает HTML-код из формы с правильными заголовками запроса, и он в точности совпадает с ответом POST, который я вижу в инспекторе Chrome. Но (...) я не могу получить данные. Как только пользователь делает выбор, открывается новое всплывающее окно, но я не могу его поймать.
Следуя таким рекомендациям, я дал selenium
попытка, с небольшой удачей. Создание запросов POST от Selenium медленно, и загрузить response.text
для веб-драйвера Selenium кажется неоптимальным.
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 ответ
Посмотрите этот блог о scrapy https://blog.scrapinghub.com/2016/04/20/scrapy-tips-from-the-pros-april-2016-edition
Я использовал эту концепцию в прошлом для очистки страниц ASPX.