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