【发布时间】:2020-11-11 12:06:08
【问题描述】:
我正在尝试从填写表单后返回的多页表中抓取数据。 有问题的原始表单的 URL 是https://ndber.seai.ie/Pass/assessors/search.aspx
从https://kaijento.github.io/2017/05/04/web-scraping-requests-eventtarget-viewstate/ 我得到代码,该代码从空白表单中提取隐藏变量,然后与 POST 请求一起发送以获取数据
import requests
from bs4 import BeautifulSoup
url='https://ndber.seai.ie/PASS/Assessors/Search.aspx'
with requests.session() as s:
s.headers['user-agent'] = 'Mozilla/5.0'
r = s.get(url)
soup = BeautifulSoup(r.content, 'html5lib')
target = 'ctl00$DefaultContent$AssessorSearch$gridAssessors$grid_pager'
# unsupported CSS Selector 'input[name^=ctl00][value]'
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^=__]')
}
data.update(state)
data['__EVENTTARGET'] = ''
data['__EVENTARGUMENT'] = ''
print(data)
r = s.post(url, data=data)
new_soup = BeautifulSoup(r.content, 'html5lib')
print(new_soup)
最初的.get很好,我得到了空白表单的html,我可以将参数提取到数据中。
但是,.post 返回一个 html 页面,表明发生了错误,但没有有用的数据。
请注意,结果被拆分为多个页面,当您从一个页面转到另一个页面时,会为以下参数指定值
data['__EVENTTARGET'] = 'ctl00$DefaultContent$AssessorSearch$gridAssessors$grid_pager'
data['__EVENTARGUMENT'] = '1$n' # where n is the number of the age to retrieve
在上面的代码中,我最初只是尝试获取结果的第一页,然后一旦工作正常,我将制定循环以遍历所有结果并加入它们。
有没有人知道如何处理这种情况?
谢谢/科尔姆
【问题讨论】:
-
继续挖掘后,我找到了 stackoverflow.com/questions/12645849/…,然后我用 python 搜索特定于 aspx 的网络抓取,然后我找到了 kaijento.github.io/2017/05/04/…,我现在正在拖网/爬行。跨度>
-
上面的评论不再相关,它来自我现在更新的原始帖子。
-
您需要在数据参数中使用
ctl00_DefaultContent_AssessorSearch_captcha的值,以便通过发布请求发送相同的内容以获取所需的内容。事实证明,上述键的值是动态的,我非常怀疑您是否可以在页面源代码中找到它。 -
当!它看起来好像在做 AJAX'y 的事情来获得在每次重新加载页面时都会改变的值。这几乎让我想每天对 27 页的结果进行复制/粘贴,只是为了对他们不屑一顾。 #souchforopendata 感谢@SIM 提供的指针
-
我花了大约 10 分钟来复制粘贴,不知道我是否可以每天都这样做!重复性压力损伤的风险。
标签: python asp.net web-scraping python-requests