如何使用python“抓取”包含弹出窗口的网站?

Posted

技术标签:

【中文标题】如何使用python“抓取”包含弹出窗口的网站?【英文标题】:How to "webscrape" a site containing a popup window, using python? 【发布时间】:2020-07-07 21:29:00 【问题描述】:

我正在尝试使用 python 抓取 etherscan 站点的某个部分,因为没有用于此功能的 api。基本上去this link 并且需要按下验证,这样做之后会出现一个弹出窗口,您可以看到here。我需要刮的是这部分0x0882477e7895bdc5cea7cb1552ed914ab157fe56,以防消息以图片中的消息开头。

我编写了下面的 python 脚本来启动它,但我不知道如何与站点进行进一步交互,以便让该弹出窗口出现在前台并抓取信息。这可以吗?

from bs4 import BeautifulSoup
from requests import get

headers = 'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/60.0','X-Requested-With': 'XMLHttpRequest',
url = "https://etherscan.io/proxyContractChecker?a=0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48"
response = get(url,headers=headers )
soup = BeautifulSoup(response.content,'html.parser')

谢谢

【问题讨论】:

查看selenium 或webbrowser @KALEB 澄清一下,我知道如果你用 Selenium 或 Scrapy 来工作,它会工作的。但是,可以通过 Beautiful Soup 和 Requests 库实现 我不知道这个包,只要它在 python 中......它会检查 scrapy 库谢谢 【参考方案1】:
import requests
from bs4 import BeautifulSoup


def Main(url):
    with requests.Session() as req:
        r = req.get(url, headers='User-Agent': 'Ahmed American :)')
        soup = BeautifulSoup(r.content, 'html.parser')
        vs = soup.find("input", id="__VIEWSTATE").get("value")
        vsg = soup.find("input", id="__VIEWSTATEGENERATOR").get("value")
        ev = soup.find("input", id="__EVENTVALIDATION").get("value")
        data = 
            '__VIEWSTATE': vs,
            '__VIEWSTATEGENERATOR': vsg,
            '__EVENTVALIDATION': ev,
            'ctl00$ContentPlaceHolder1$txtContractAddress': '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48',
            'ctl00$ContentPlaceHolder1$btnSubmit': "Verify"
        
        r = req.post(
            "https://etherscan.io/proxyContractChecker?a=0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", data=data, headers='User-Agent': 'Ahmed American :)')
        soup = BeautifulSoup(r.content, 'html.parser')
        token = soup.find(
            "div", class_="alert alert-success").text.split(" ")[-1]
        print(token)


Main("https://etherscan.io/proxyContractChecker")

输出:

0x0882477e7895bdc5cea7cb1552ed914ab157fe56

【讨论】:

【参考方案2】:

我不同意@InfinityTM。通常此类问题遵循的工作流程是您需要向网站发出 POST 请求。

看,如果您点击验证,就会向网站发出 POST 请求,如下图所示:

这个POST请求是用这个headers发出的:

还有这个参数

您需要弄清楚如何使用正确的 URL、标头、参数和 cookie 发送此 POST 请求。完成请求后,您将收到回复

其中包含您要在 div 下 抓取 类为“alert alert-success”的信息:

总结

所以你需要遵循的步骤是:

    导航到您的网站,并收集您的 POST 请求所需的所有信息(请求 URL、Cookie、标头和参数)。 使用 requests 库发出请求。 收到 响应后,抓取您对 BS 感兴趣的数据。

如果这为您指明了正确的方向,请告诉我! :D

【讨论】:

干得好。对我来说是新的。可能专业人士说这是不可能的。 如果您在某个时候遇到困难,请告诉我您是否完成了这项任务,我很乐意为您提供帮助:D @EnriqueBet 答案在哪里?代码在哪里?给我看看你的代码和输出到OP 我认为从事该项目的人应该在指出正确的方向后进行第一次尝试。与此同时,我将为此编写代码。 @EnriqueBet 感谢您提供有用的帖子,我会尝试一下...一定会及时通知您

以上是关于如何使用python“抓取”包含弹出窗口的网站?的主要内容,如果未能解决你的问题,请参考以下文章

WordPress网站的响应弹出窗口

通过 webdriver 点击 javascript 弹出窗口

执行 oauth 时如何创建弹出窗口?

如果用户访问 5 个页面或用户在网站上停留 2 分钟,如何显示弹出窗口

电脑总是弹出2345广告怎么办

如何仅向用户显示一次弹出窗口