Python 3.x 使用登录/通行证(使用静态url?)刮取网站

Python 3.x 使用登录/通行证(使用静态url?)刮取网站,python-3.x,web-scraping,beautifulsoup,python-requests,Python 3.x,Web Scraping,Beautifulsoup,Python Requests,我正在做一个自我项目,不断学习和练习python3。我已经用BS4和selenium做了一些其他的刮片项目,但是在这个项目中,我想用BS4来做 在这个项目中,我想从中获取一些数据。我面临的第一个问题是需要登录才能获取数据。对于这个测试,我使用的是网站提供的usser和密码,因此您可以使用相同的凭据。你还必须从表格中选择一个“种族”(我选择了Manilla-Calbayog) 通过inspector,我检测到需要传递给post功能的信息: <input name="boat" type="t

我正在做一个自我项目,不断学习和练习python3。我已经用BS4和selenium做了一些其他的刮片项目,但是在这个项目中,我想用BS4来做

在这个项目中,我想从中获取一些数据。我面临的第一个问题是需要登录才能获取数据。对于这个测试,我使用的是网站提供的usser和密码,因此您可以使用相同的凭据。你还必须从表格中选择一个“种族”(我选择了Manilla-Calbayog)

通过inspector,我检测到需要传递给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
当我检查打印输出时,我可以看到我在同一个登录位置

假设我可以正确登录,那么第二个问题将出现。
…当您登录时,一个新菜单将以按钮形状出现。我需要抓取的数据在“导航”中。问题是,当你按下按钮时,新的信息会出现在浏览器中,但url不会改变,无论你在哪里单击,url总是相同的。那么,我怎么去那里

和最后一道题。我假设我在“导航”部分(不使用url)。我需要至少每30秒刷新一次信息。如果没有可请求的url,我该怎么做


?有没有不使用selenium的方法来实现这一点?

此页面通过Ajax动态加载数据,包含boat XML数据的url是
http://sol.brainaid.de/sailonline/toolbox/getBoatData.php
,您可以在Firefox/Chrome网络检查器中查看它。您所需要的只是令牌,它在登录时存储在cookies中:

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>

N 14°35.4000'
E 120°57.0000'
381.84
107.68
220.48
4.76
0
-
齿轮
uTWA/u
220.48
0
0
100
0
2018-07-25
12:47:11

非常感谢您!!!我知道你是怎么做的,知道怎么找到饼干的!但是最后一件事,如果我想避免每30秒创建一个新的cookie(我想每30秒更新一次信息),那么在行
boat_data=BeautifulSoup(s.post(boat_data_url,data=data.text,'xml')
?@DLA前面做一个While循环是正确的:a)使用
time.sleep()
并在while循环中等待30秒,b)将cookie存储在文件中并在脚本运行时加载,c)什么都不做-创建新cookie不会影响此脚本的工作方式;)
<?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>