【问题标题】:Scraping ASPX form and avoiding Selenium刮取 ASPX 形式并避免使用 Selenium
【发布时间】:2019-03-01 19:22:06
【问题描述】:

我之前询问过(请参阅here)如何从 ASPX 表单中抓取结果。表单在新选项卡中呈现输出(通过在 JS 中使用函数 window.open)。在我之前的帖子中,我没有发出正确的 POST 请求,我解决了这个问题。

以下代码成功地从表单中检索到具有正确请求标头的 HTML 代码,它与我在 Chrome 检查器中看到的 POST 响应完全相同。但是(...)我无法检索数据。用户做出选择后,会打开一个新的弹出窗口,但我无法捕捉到它。弹出窗口有一个新的 URL,其信息不是请求响应正文的一部分。

请求网址:https://apps.neb-one.gc.ca/CommodityStatistics/Statistics.aspx

弹窗网址【我要下载的数据】: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)

有什么方法可以使用requestsbs4 从弹出窗口中检索数据?我注意到html-requests可以解析和渲染JS,但是我所有的试验都没有成功。

url 源代码显示了这个 JS 代码,我猜是打开带有数据的弹出窗口的那个:


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

但我无法访问它。

【问题讨论】:

  • 如果您将您提出的最后一个问题的解决方案发布出来,这样其他人可以从中学习,那就太好了。
  • 完成!我添加了交叉引用。
  • 将点击传递给 XPATH 对象?我不认为你想做什么或你的问题是什么。
  • @pguardiario,我重新表述了我在问题中的一些陈述,以使自己更清楚。问题基本上是在浏览器中,一旦我单击查看一个新的弹出窗口。我尝试提出正确的请求,但无法使用上面发布的代码检索弹出数据。有一个非硒选项可以帮助我吗?
  • 我认为您对弹出窗口感到困惑 -> 请求只是一个请求。如果您发出与浏览器相同的请求,您将得到相同的响应。查看 chrome 开发工具的网络选项卡以找到正确的表单数据。

标签: python selenium web-scraping python-requests python-requests-html


【解决方案1】:

查看这个scrapy博客https://blog.scrapinghub.com/2016/04/20/scrapy-tips-from-the-pros-april-2016-edition

我过去曾使用此概念来抓取 aspx 页面。

【讨论】:

  • 有趣!感谢您的分享,但scrappy 只会让我的 POST 请求更清晰(我已经完成了三个请求来模拟 UI 行为并处理不同的 __VIEWSTATE 值,这就是为什么我在每次请求时更新我的​​payload) ,但最终会返回相同的 HTML 正文。我的问题是数据是在新选项卡中打开的,而不是在响应正文中。
猜你喜欢
  • 1970-01-01
  • 2017-01-30
  • 2017-06-11
  • 1970-01-01
  • 2013-10-23
  • 2021-12-26
  • 1970-01-01
  • 2020-03-21
  • 1970-01-01
相关资源
最近更新 更多