通过登录/传递(使用静态网址?)来抓取网站

时间:2018-07-25 11:13:27

标签: python-3.x web-scraping beautifulsoup python-requests

我正在做一个自我项目,以继续学习和练习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秒刷新一次该信息。如果没有要请求的网址,该怎么办?

¿不使用硒还有什么方法吗?

1 个答案:

答案 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>
  &lt;u&gt;TWA&lt;/u&gt;
 </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>