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

How to "webscrape" a site containing a popup window, using python?

提问人:KALEB 提问时间:3/27/2020 最后编辑:StabledogKALEB 更新时间:4/27/2021 访问量:2833

问:

我正在尝试使用 python 对 etherscan 站点的某个部分进行网络抓取,因为没有用于此功能的 api。基本上转到此链接,需要按验证,完成后会出现一个弹出窗口,您可以在此处看到。我需要抓取的是这部分,以防消息以如图所示的消息开头。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')

谢谢

python 网页抓取 beautifulsoup 代码合约 etherscan

评论

1赞 StonedTensor 3/27/2020
查看 selenium网络浏览器@KALEB
0赞 EnriqueBet 3/27/2020
澄清一下,我知道如果您使用 Selenium 或 Scrapy 来使用它,它会起作用。但是,可以通过 Beautiful Soup 和 Requests lib 实现
0赞 KALEB 3/27/2020
我对这个包是不可知的,只要它是在 python 中......它会检查出 scrapy 库,谢谢

答:

0赞 EnriqueBet 3/27/2020 #1

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

看,如果单击“验证是否已向网站发出POST请求”,如下图所示:

After Verify was clicked

POST 请求是使用以下标头发出的:

Request Headers

有了这个参数

Params

您需要弄清楚如何使用正确的 URL、标头、参数和 cookie 发送此 POST 请求。一旦您完成提出请求,您将收到响应

Response

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

总结

因此,您需要遵循的步骤是:

  1. 导航到您的网站,并收集 POST 请求所需的所有信息(请求 URL、Cookie、标头和参数)。
  2. 使用 requests 库发出请求。
  3. 收到 <200> 的回复后,使用 BS 抓取您感兴趣的数据。

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

评论

0赞 Joshua Varghese 3/27/2020
干得好。对我来说是新的。梅的专业人士说这是不可能的。
0赞 EnriqueBet 3/27/2020
如果您在某些时候遇到困难,请告诉我,如果您完成此任务,我将很乐意为您提供帮助:D
0赞 αԋɱҽԃ αмєяιcαη 3/27/2020
@EnriqueBet答案本身在哪里?代码在哪里?向我展示您的代码和输出到OP
0赞 EnriqueBet 3/27/2020
我相信从事该项目的人应该在指出正确的方向后进行第一次尝试。与此同时,我将为此编写代码。
1赞 KALEB 3/27/2020
@EnriqueBet感谢您的有用帖子,我会尝试一下......并且肯定会让您随时发布
3赞 αԋɱҽԃ αмєяιcαη 3/27/2020 #2
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

评论

0赞 Akashgreninja 10/25/2023
伙计,非常感谢!!欣赏它