【发布时间】:2020-08-26 16:51:29
【问题描述】:
我使用 requests 模块和 BeautifulSoup 库在 python 中创建了一个脚本,以从网站获取不同成员的名称。该脚本可以完美地从第一页和第二页获取名称。但是,它会从第三页开始抓取相同的名称。我可以注意到下一页逻辑在__EVENTTARGET 的值内,如dnn$ctr410$MemberSearch$grdMembers$ctl00$ctl02$ctl01$ctl07 和dnn$ctr410$MemberSearch$grdMembers$ctl00$ctl02$ctl01$ctl09 等等。脚本可以相应地增加数字,但第二页之后的结果保持不变。
要从这个website 填充结果,您只需单击搜索按钮而不进行任何更改。然后您可以点击 2,3,4 e.t.c 页面进入相关页面。
我已经尝试过(从前两页抓取数据):
import requests
from bs4 import BeautifulSoup
link = 'https://www.icsi.in/student/Members/MemberSearch.aspx?SkinSrc=%5BG%5DSkins/IcsiTheme/IcsiIn-Bare&ContainerSrc=%5BG%5DContainers/IcsiTheme/NoContainer'
with requests.Session() as s:
s.headers['User-Agent'] = 'Mozilla/5.0 (Windows NT 6.1; ) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36'
r = s.get(link)
soup = BeautifulSoup(r.text,"lxml")
payload = {i['name']:i.get('value','') for i in soup.select('input[name]')}
payload['__EVENTTARGET'] = 'dnn$ctr410$MemberSearch$btnSearch'
page = 5
while True:
r = s.post(link,data=payload)
soup = BeautifulSoup(r.text,"lxml")
for item in soup.select("span[id$='_lblFullName']"):
print(item.text)
page+=2
payload = {i['name']:i.get('value','') for i in soup.select('input[name]')}
if len(str(page))==1:
payload['__EVENTTARGET'] = 'dnn$ctr410$MemberSearch$grdMembers$ctl00$ctl02$ctl01$ctl0{}'.format(page)
else:
payload['__EVENTTARGET'] = 'dnn$ctr410$MemberSearch$grdMembers$ctl00$ctl02$ctl01$ctl{}'.format(page)
payload['__dnnVariable'] = {'__scdoff':'1','__dnn_pageload':'__dnn_setScrollTop();'}
payload['ScrollTop'] = '400'
如何从第二页之后的其余页面中获取名称?
【问题讨论】:
-
它看起来像 ASP.NET 页面 - 它可以发送许多 POST 值 - 不仅是
__EVENTTARGET- 而且您可能必须发送所有这些值 - 也作为POST请求。 FIRTS:使用 Firefox/Chrome 中的 DevTools 来查看当您转到下一页时从浏览器发送的所有请求 - 并查看它发送的值,以及是GET还是POST请求。您的代码必须发送相同的。 -
我可能会发送所有这些。如果您打印有效负载,您可以在其中看到所需的参数。谢谢。
-
顺便说一句,您可以使用
"{:02}".format(7)来获取07而不是7,然后您不必检查if len(str(page))==1:(顺便说一句:而不是if len(str(page))==1:,您可以简单地检查@987654335 @) -
当我检查
payload.keys()并与在网络浏览器中发送的密钥进行比较时,我会看到浏览器未发送的密钥 - 即。带有箭头的按钮的键(移动到第一页/最后一页/上一页/下一页),可能会出现问题。 IE。dnn$ctr410$MemberSearch$grdMembers$ctl00$ctl02$ctl01$ctl02用于移动到第一页的按钮。 -
我在 while 循环的底部添加了这一行
payload.pop('dnn$ctr410$MemberSearch$grdMembers$ctl00$ctl02$ctl01$ctl02')以从有效负载中踢出密钥,但这似乎并不能解决问题。谢谢。
标签: python python-3.x web-scraping beautifulsoup python-requests