我正在做一个自我项目,以继续学习和练习python3。我已经使用BS4和硒完成了其他刮除操作,但是在这个项目中,我想使用BS4进行。
在这个项目中,我想从this site中抓取一些数据。我面临的第一个问题是我需要登录才能获取数据。对于此测试,我使用网站提供的用户名和密码,因此您可以使用相同的凭据。另外,您还必须从表单中选择一个“种族”(我选择了Manilla-Calbayog)。
通过检查器,我检测到需要传递给post函数的信息:
<input name="boat" type="text" />
<input name="key" type="password" />
<select name="race">
<option value="1159">Manilla - Calbayog</option> 'This is the one I want to check for the test
这是我的代码:
from bs4 import BeautifulSoup
import requests
login_data = {'boat':'sol','key':'sol','race':'1159'}
s = requests.session()
post = s.post('http://sol.brainaid.de/sailonline/toolbox/', login_data)
r = requests.get('http://sol.brainaid.de/sailonline/toolbox/')
page = r.content
soup = BeautifulSoup(page, 'html.parser')
print(soup.prettify())
当我检查打印输出时,可以看到我在同一登录位置。
假设我可以正确登录,将出现第二个问题...。登录后,按钮形状中将出现一个新菜单。我需要抓取数据的位置在“导航”中。关键是,当您按下按钮时,新信息会显示在浏览器中,但URL不会更改,无论您在何处单击,URL都始终相同。那么,我怎么到达那里?
还有最终问题。我假设我在“导航”部分(不使用网址)。我需要至少每30秒刷新一次该信息。如果没有要请求的网址,该怎么办?
¿不使用硒还有什么方法吗?
答案 0 :(得分:1)
此页面通过Ajax动态加载数据,带有XML数据的URL为http://sol.brainaid.de/sailonline/toolbox/getBoatData.php
,您可以在Firefox / Chrome网络检查器中对其进行检查。您所需要做的就是令牌,该令牌在登录时存储在cookie中:
from bs4 import BeautifulSoup
import requests
login_data = {'boat':'sol','key':'sol','race':'1159'}
login_url = 'http://sol.brainaid.de/sailonline/toolbox/login.php'
boat_data_url = 'http://sol.brainaid.de/sailonline/toolbox/getBoatData.php'
with requests.session() as s:
post = s.post(login_url, login_data)
data = {'boat': 'sol', 'race': '1159', 'token': s.cookies.get_dict()['sailonline[1159][sol]']}
boat_data = BeautifulSoup(s.post(boat_data_url, data=data).text, 'xml')
print(boat_data.prettify())
这将打印:
<?xml version="1.0" encoding="utf-8"?>
<BOAT>
<LAT>
N 14°35.4000'
</LAT>
<LON>
E 120°57.0000'
</LON>
<DTG>
381.84
</DTG>
<DBL>
107.68
</DBL>
<TWD>
220.48
</TWD>
<TWS>
4.76
</TWS>
<WPT>
0
</WPT>
<RANK>
-
</RANK>
<lCOG>
COG
</lCOG>
<lTWA>
<u>TWA</u>
</lTWA>
<COG>
220.48
</COG>
<TWA>
000.00
</TWA>
<SOG>
0.00
</SOG>
<PERF>
100.00
</PERF>
<VMG>
0.00
</VMG>
<DATE>
2018-07-25
</DATE>
<TIME>
12:47:11
</TIME>
</BOAT>