Вам не нужно использовать Scrapy
или Selenium
для такой отдельной страницы.
Вы можете достичь своей цели, используя requests
, bs4
и pandas
.
Теперь давайте поставим план:
1 . Мы проверим Сетевой монитор в разделе browser
Инструменты разработчика и посмотрим, что произойдет, как только мы изменим дату.
Как вы можете видеть, мы заметили, что POST
запрос был сделан на хост с несколькими Form data
.
Q: Почему вы получили ответ на ваш звонок на URL без передачи данных POST ?
A: Поскольку host
фактически задает указанную c дату из drop
down
быть static
, то есть 18 March 2020 12:16
, как вы можете видеть после открытия URL.
Примечания:
- you не нужно анализировать
HTML
и искать таблицу, чтобы прочитать ее с помощью Pandas
, как вы можете сделать это за один вызов! поскольку pandas
имеет функцию read_html
, которая будет анализировать HTML
и читать для вас tables
в виде списка. который вы можете перемещаться между ними с нарезкой []
.
import pandas as pd
df = pd.read_html(
"https://heavens-above.com/StarlinkLaunchPasses.aspx?lat=50&lng=12&loc=Somewhere")[0]
print(df)
вам вообще не нужно использовать
необработанную строку .
Python raw string treats backslash
()
as a literal character
, который в некоторых случаях необходимо передать в
host
.
2 . Мы рассмотрим все parameters
в пределах Form data
и отбросим пустые значения ""
и проверим, какое values
равно filled
. Теперь, если мы обновим sh страницу, мы заметим, что некоторые values
изменены. Поэтому мы проверим источник HTML
и посмотрим, сможем ли мы найти эти values
.
![enter image description here](https://i.stack.imgur.com/q2HCj.png)
Как вы можете видеть, мы нашли parameters
с values
в этой части предыдущего screen-shot
.
И вот значения параметра important
части drop-down
, где нам нужно передать его в этот parameter
ctl00$cph1$ddlLaunches
.
![enter image description here](https://i.stack.imgur.com/RUJjt.png)
3 . Теперь нам нужно будет сделать запрос GET
с поддержкой объекта session
, чтобы проанализировать url
и собрать все наши необходимые parameters
values
, а затем сделать запрос post
. в то время как мы будем читать это с Pandas
.
- Q: Почему мы не использовали Pandas непосредственно для чтения HTML таблицы ? A: Поскольку
Pandas
не имеет возможности передать Form data
, поэтому мы использовали requests
и передали Form data
на data=
, а затем прочитали content
на read_html
.
И, наконец, мы сохраним каждую таблицу в csv
файле с его именем.
Окончательный код
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")