python - 如何使用 Python 在 ASP.Net 中调用回发

标签 python asp.net web-services http http-headers

我正在尝试使用 Python 从网页上抓取一些元素及其值;但是,要获得更多元素,我需要模拟点击下一步。有一个与这些按钮相关的回发,所以我正在尝试调用它。不幸的是,Python 只是一遍又一遍地打印相同的值 [意味着 next button 的回发没有被调用]。我正在使用 requests 来执行我的 POST/GET。

import re
import time
import requests

TARGET_GROUP_ID = 778092


SESSION = requests.Session()
REQUEST_HEADERS = {"Accept-Encoding": "gzip,deflate"}
GROUP_URL = "http://roblox.com/groups/group.aspx?gid=%d"%(TARGET_GROUP_ID)
POST_BUTTON_HTML = 'pagerbtns next'

EVENTVALIDATION_REGEX = re.compile(r'id="__EVENTVALIDATION" value="(.+)"').search
VIEWSTATE_REGEX = re.compile(r'id="__VIEWSTATE" value="(.+)"').search
VIEWSTATEGENERATOR_REGEX = re.compile(r'id="__VIEWSTATEGENERATOR" value="(.+)"').search
TITLE_REGEX = re.compile(r'<a id="ctl00_cphRoblox_rbxGroupRoleSetMembersPane_dlUsers_ctrl\d+_hlAvatar".*?title="(\w+)".*?ID=(\d+)"')
page = SESSION.get(GROUP_URL, headers = REQUEST_HEADERS).text
while 1:
    if POST_BUTTON_HTML in page:
        for (ids,names) in re.findall(TITLE_REGEX, page):
            print ids,names
        postData = {
            "__EVENTVALIDATION": EVENTVALIDATION_REGEX(page).group(1),
            "__VIEWSTATE": VIEWSTATE_REGEX(page).group(1),
            "__VIEWSTATEGENERATOR": VIEWSTATEGENERATOR_REGEX(page).group(1),
            "__ASYNCPOST": True,
            "ct1000_cphRoblox_rbxGroupRoleSetMembersPane_currentRoleSetID": "4725789",
            "ctl00$cphRoblox$rbxGroupRoleSetMembersPane$dlUsers_Footer$ctl02$ctl00": "",
            "ctl00$cphRoblox$rbxGroupRoleSetMembersPane$dlUsers_Footer$ctl01$HiddenInputButton": "",
            "ctl00$cphRoblox$rbxGroupRoleSetMembersPane$dlUsers_Footer$ctl01$PageTextBox": "3"
        }
        page=SESSION.post(GROUP_URL, data = postData, stream = True).text
    time.sleep(2)

如何从 Python 正确调用 ASP.NET 中的回发来解决此问题?如前所述,它每次只打印出相同的值。

这是按钮的 HTML 元素

<a class="pagerbtns next" href="javascript:__doPostBack('ctl00$cphRoblox$rbxGroupRoleSetMembersPane$dlUsers_Footer$ctl02$ctl00','')">&nbsp;</a>

这是它所在的 div:

<div id="ctl00_cphRoblox_rbxGroupRoleSetMembersPane_dlUsers_Footer_ctl01_MembersPagerPanel" onkeypress="javascript:return WebForm_FireDefaultButton(event, 'ctl00_cphRoblox_rbxGroupRoleSetMembersPane_dlUsers_Footer_ctl01_HiddenInputButton')">
 <div id="ctl00_cphRoblox_rbxGroupRoleSetMembersPane_dlUsers_Footer_ctl01_Div1" class="paging_wrapper">
Page <input name="ctl00$cphRoblox$rbxGroupRoleSetMembersPane$dlUsers_Footer$ctl01$PageTextBox" type="text" value="1" id="ctl00_cphRoblox_rbxGroupRoleSetMembersPane_dlUsers_Footer_ctl01_PageTextBox" class="paging_input"> of 
<div class="paging_pagenums_container">125</div>
<input type="submit" name="ctl00$cphRoblox$rbxGroupRoleSetMembersPane$dlUsers_Footer$ctl01$HiddenInputButton" value="" onclick="loading('members');" id="ctl00_cphRoblox_rbxGroupRoleSetMembersPane_dlUsers_Footer_ctl01_HiddenInputButton" class="pagerbtns translate" style="display:none;">
</div>                      
</div>

我正在考虑使用 JS 库并执行 JS __postback 方法,但是,我想先看看这是否可以在纯 Python 中实现。

最佳答案

是的,它应该是可以实现的,您只需在正确的字段上提交正确的值。但我假设您正在尝试解析的网页使用 asp.net 网络表单,因此查找值等应该非常耗时。我建议你看看selenium有了它,您就可以轻松调用网页上的点击和事件,而无需编写那么多代码。

driver = webdriver.Firefox()
driver.get("http://site you are trying to parse")
driver.find_element_by_id("button").click()
//then get the data you want

关于python - 如何使用 Python 在 ASP.Net 中调用回发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32554583/

相关文章:

python - 在 unix 上为 python 3.5 安装 psycopg2 包

python - 使用 Beautifulsoup 的类的正则表达式

asp.net - 这些 Web Essentials 选项有什么作用?

c# - 创建 XLSX 文件需要更多时间来记录 100000 条记录并占用最大 RAM 内存

web-services - 任何带有 API 的 Latex 网络服务?

python - 将单个字母代码连同链编号一起转换为 3 个字母代码

python - 如何将 django admin "view site"链接更改为自定义绝对 url

c# - "Errors During Preprocessing"在 ASP.NET 性能计数器中非零

java - 如何在 websphere 上部署同一个 web 服务的多个版本

web-services - 使用 CXF 在 WSDL 中的soapaction