如何使用 python "webscrape" 包含弹出窗口 window 的站点?
How to "webscrape" a site containing a popup window, using python?
我正在尝试使用 python 对 etherscan 网站的某个部分进行网络抓取,因为没有 api 此功能。基本上去this link and one would need to press verify, after doing so a popup comes up which you can see 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')
谢谢
我不同意@InfinityTM。通常此类问题的工作流程是您需要向网站发出 POST 请求。
看,如果您单击 验证 ,则会向网站发出 POST 请求,如图所示:
此 POST 请求是通过此 headers:
发出的
并使用此 params:
您需要了解如何使用正确的 URL、headers、参数和 cookie 发送此 POST 请求。完成请求后,您将收到 响应:
里面包含了你要抓取下div的信息,用class"alertalert-success:
总结
因此您需要遵循的步骤是:
- 导航到您的网站,并收集您 POST 所需的所有信息(请求 URL、Cookie、headers 和参数) 请求。
- 使用 requests 库发出请求。
- 收到 <200> 响应后,用 BS 抓取 您感兴趣的数据。
如果这为您指明了正确的方向,请告诉我! :D
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
我正在尝试使用 python 对 etherscan 网站的某个部分进行网络抓取,因为没有 api 此功能。基本上去this link and one would need to press verify, after doing so a popup comes up which you can see 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')
谢谢
我不同意@InfinityTM。通常此类问题的工作流程是您需要向网站发出 POST 请求。
看,如果您单击 验证 ,则会向网站发出 POST 请求,如图所示:
此 POST 请求是通过此 headers:
发出的并使用此 params:
您需要了解如何使用正确的 URL、headers、参数和 cookie 发送此 POST 请求。完成请求后,您将收到 响应:
里面包含了你要抓取下div的信息,用class"alertalert-success:
总结
因此您需要遵循的步骤是:
- 导航到您的网站,并收集您 POST 所需的所有信息(请求 URL、Cookie、headers 和参数) 请求。
- 使用 requests 库发出请求。
- 收到 <200> 响应后,用 BS 抓取 您感兴趣的数据。
如果这为您指明了正确的方向,请告诉我! :D
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