<p>对于这样一个页面,您不需要使用<code>Scrapy</code>或<code>Selenium</code></p>
<p>您可以使用<code>requests</code>、<code>bs4</code>和<code>pandas</code>实现您的目标</p>
<p>现在,让我们把计划付诸实施:</p>
<hr/>
<p><strong>1</strong>。我们将检查您的<code>browser</code>{a2}下的<a href="https://developer.mozilla.org/en-US/docs/Tools/Network_Monitor" rel="nofollow noreferrer">Network Monitor</a>,看看更改日期后会发生什么</p>
<p><a href="https://i.stack.imgur.com/4Ce2v.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/4Ce2v.png" alt="enter image description here"/></a></p>
<ul>
<li><p>如您所见,我们注意到已向
<a href="https://heavens-above.com/StarlinkLaunchPasses.aspx?lat=50&lng=12&loc=Somewhere" rel="nofollow noreferrer">host</a>
具有多个<code>Form data</code></p>
<p>问:<strong>为什么你的url呼叫没有得到响应
传递POST数据</strong></p>
<p>答:因为<code>host</code>实际上设置了一个特定的日期,从<code>drop
down</code>到<code>static</code>,这是<code>18 March 2020 12:16</code>,一旦打开url就可以看到</p></li>
</ul>
<blockquote>
<p>Notes:</p>
</blockquote>
<ol>
<li>您不需要解析<code>HTML</code>并搜索表来用<code>Pandas</code>读取它,因为您可以在一次调用中完成!as<code>pandas</code>有一个名为<code>read_html</code>的函数,它将解析<code>HTML</code>并将<code>tables</code>作为列表为您读取。可以通过切片<code>[]</code>在它们之间移动</李>
</ol>
<pre class="lang-py prettyprint-override"><code>import pandas as pd
df = pd.read_html(
"https://heavens-above.com/StarlinkLaunchPasses.aspx?lat=50&lng=12&loc=Somewhere")[0]
print(df)
</code></pre>
<ol start=“2”>
<li>您根本不需要使用<a href="https://www.journaldev.com/23598/python-raw-string" rel="nofollow noreferrer">raw string</a><code>Python raw string treats backslash</code>()<code>as a literal character</code>,在某些情况下需要将其传递给<code>host</code></李>
</ol>
<hr/>
<p><strong>2</strong>。我们将查看<code>Form data</code>中的所有<code>parameters</code>,丢弃空值<code>""</code>,并检查哪个<code>values</code>是<code>filled</code>。现在如果我们刷新页面,我们会注意到有一些<code>values</code>被更改了。因此,我们将检查<code>HTML</code>源代码,看看是否可以找到这些<code>values</code></p>
<p><a href="https://i.stack.imgur.com/q2HCj.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/q2HCj.png" alt="enter image description here"/></a></p>
<p>正如您所看到的,我们在前面的<code>screen-shot</code>的这一部分中找到了<code>parameters</code>和<code>values</code></p>
<p>这里是<code>drop-down</code>选项的<code>important</code>部分的值,我们需要将它传递给这个<code>parameter</code>{<cd37>}</p>
<h2><a href="https://i.stack.imgur.com/RUJjt.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/RUJjt.png" alt="enter image description here"/></a></h2>
<p><strong>3</strong>。现在,我们需要通过维护<code>session</code>对象发出<code>GET</code>请求来解析<code>url</code>并收集所有必需的<code>parameters</code>{<cd26>},然后发出<code>post</code>请求。而我们将用<code>Pandas</code>阅读它</p>
<ul>
<li>问:<strong>为什么我们不直接使用Pandas来读取HTML表?
答:因为<code>Pandas</code>没有传递<code>Form data</code>的选项,所以我们使用<code>requests</code>并通过<code>data=</code>传递<code>Form data</code>,然后通过<code>read_html</code>读取<code>content</code></李>
</ul>
<p>最后,我们将使用每个表的名称将其保存到<code>csv</code>文件中</p>
<p><strong>最终代码</strong></p>
<pre class="lang-py prettyprint-override"><code>import requests
from bs4 import BeautifulSoup
import pandas as pd
import re
def Main(url):
with requests.Session() as req:
r = req.get(url)
soup = BeautifulSoup(r.content, 'html.parser')
times = [item.get("value") for item in soup.findAll(
"option", value=re.compile(r"\d{6}"))]
vs = soup.find("input", id="__VIEWSTATE").get("value")
vsg = soup.find("input", id="__VIEWSTATEGENERATOR").get("value")
ut = soup.find("input", id="ctl00_cph1_hidStartUtc").get("value")
for time in times:
data = {
'__EVENTTARGET': 'ctl00$cph1$ddlLaunches',
'__EVENTARGUMENT': '',
'__LASTFOCUS': '',
'__VIEWSTATE': vs,
'__VIEWSTATEGENERATOR': vsg,
'utcOffset': '0',
'ctl00$ddlCulture': 'en',
'ctl00$cph1$hidStartUtc': ut,
'ctl00$cph1$ddlLaunches': time
}
r = req.post(url, data=data)
df = pd.read_html(r.content)[0]
df.to_csv(f"{time}.csv", index=False)
Main("https://heavens-above.com/StarlinkLaunchPasses.aspx?lat=50&lng=12&loc=Somewhere")
</code></pre>