Bis zum letzten Mal, wie Sie in diesem Artikel sehen können, "Lassen Sie uns über das Wetter in Ihrem Lieblingsgebiet von Yahoo Wetter auf LINE benachrichtigt werden!" Ich erklärte von Yahoo Wetter bis zum Abrufen der URL des ganzen Landes.
Dieses Mal werde ich in diesem TEIL 2 kurz von der URL des nationalen Gebiets bis zum Erwerb der URL des detaillierten Gebiets (Stadt, Gemeinde, Stadt, Dorf) erklären. Überlegen.
Hier ist zunächst die URL, die ich beim letzten Mal erhalten habe.
Die Informationen auf der Seite in dieser URL, beispielsweise von der ersten Seite, lauten wie folgt. Sie können leicht das Wetter der wichtigsten Gemeinden sehen, die zur Region gehören.
Wenn Sie auf diesem Bildschirm auf "Wakauchi" klicken, wird die detaillierte Wetter- und Niederschlagswahrscheinlichkeit von "Wakauchi" angezeigt.
Was ist von hier aus zu tun? ・ "Abrufen des Namens und der URL des Gebiets und der Stadt" ・ "Wetterinformationen von der URL der Stadt abrufen" Es gibt zwei.
Von hier aus werde ich erklären, wie man die Informationen tatsächlich erhält. Zunächst erkläre ich "Den Namen und die URL des Gebiets und der Stadt ermitteln".
Das Programm ist wie folgt.
with open("yahooChiku.csv", "r", encoding="utf-8") as readChikuNum:
reader = csv.reader(readChikuNum)
with open("shosaiChiku.csv", "w", encoding="cp932", newline="") as schiku:
writer = csv.writer(schiku)
column = ["Ländlich", "Gemeinde", "URL"]
writer.writerow(column)
for target_url in reader:
res = requests.get(target_url[0])
soup = BeautifulSoup(res.text, 'lxml')
chiku = re.search(r".*von", str(soup.find("title").text)).group().strip("von")
elems = soup.find_all("a")
chikuList, shosaiNumList = [], []
chikuNameList = [chikuName.get_text() for chikuName in soup.find_all(class_= "name")]
for e in elems:
if re.search(r'data-ylk="slk:prefctr', str(e)):
if re.search(r'"https://.*html"', str(e)):
row = re.search(r'"https://.*html"', str(e)).group().strip('"')
chikuList.append(chiku)
shosaiNumList.append(row)
for p, e, c in zip(chikuList, chikuNameList, shosaiNumList):
writeList = [p, e, c]
writer.writerow(writeList)
Die erste mit open liest die URL-Datei und die zweite mit open öffnet die lokalen und kommunalen Dateien und die Datei, um ihre jeweiligen URLs zu schreiben. Speichern Sie anschließend die HTML-Informationen in Suppe und erfassen Sie die erforderlichen Informationen nacheinander. Passen Sie für Chiku den lokalen Namen des Erfassungsziels so an, dass es nur der lokale Name mit einem regulären Ausdruck ist, und ersetzen Sie ihn. Speichern Sie in elems das HTML-Tag mit find_all, um die URL der Stadt, des Bezirks, der Stadt und des Dorfes abzurufen.
Von hier kommen die Variablen, die in die Datei geschrieben werden. In chikuNameList wird derjenige, dessen Tag "name" ist, aus dem lokalen HTML-Code unter Verwendung der Einschlussnotation abgerufen. Glücklicherweise sind die Namen von Städten, Gemeinden, Städten und Dörfern alle im "Namensschild" enthalten. In Bezug auf die for-Anweisung finden Sie hier die URL der Stadt, des Bezirks, der Stadt und des Dorfes im "data-ylk =" slk: prefctr "-Tag. Legen Sie daher die Bedingungen in der ersten if-Anweisung fest. Da das Tag "data-ylk =" slk: prefctr "andere Daten als die URL der Stadt, Gemeinde, Stadt und des Dorfes enthält, werden bei der Suche nach regulären Ausdrücken nur diejenigen beurteilt, die dem URL-Format entsprechen. Fügen Sie dann den Distriktnamen zur chikuList und die URL der Stadt / Gemeinde / Stadt / des Dorfes zur shosaiNumList hinzu.
Schreiben Sie in der letzten for-Anweisung den in der Liste gespeicherten lokalen Namen, die Stadt, die Gemeinde, die Stadt und die URL Zeile für Zeile in "shosaiChiku.csv".
Und die resultierende Datei sieht folgendermaßen aus:
Es ist möglich, auf die URL für jede Stadt, Gemeinde, Stadt und jedes Dorf zuzugreifen und die gewünschten Daten durch regulären Ausdruck oder Scraping einzugeben. Ich habe jedoch festgestellt, dass RSS vorhanden ist, und habe mich daher entschlossen, dies ebenfalls hinzuzufügen.
df = pd.read_csv("shosaiChiku.csv", encoding="cp932")
with open("dataBase.csv", "w", encoding="cp932", newline="") as DBcsv:
writer = csv.writer(DBcsv)
#Header schreiben
columns = ["Ländlich", "Gemeinde", "URL", "RSS"]
writer.writerow(columns)
#Schreiben Sie Daten (Name der Stadt, Stadt, Gemeinde, Stadt, URL, RSS) Zeile für Zeile
for place, city, url in zip(df["Ländlich"], df["Gemeinde"], df["URL"]):
row = [place, city, url]
rssURL = "https://rss-weather.yahoo.co.jp/rss/days/"
#Von der URL "Nummer.Holen Sie sich HTML ">" Nummer.In RSS geformt
url_pattern = re.search(r"\d*\.html", url).group()
url_pattern = url_pattern.replace("html", "xml")
rssURL = rssURL + url_pattern
row.append(rssURL)
writer.writerow(row)
Fast alles, was Sie tun, ist das gleiche wie in der vorherigen Quelle. Da die meisten Daten in shosaiChiku enthalten sind, geben Sie die RSS-URL ein
Fügen Sie einfach ein wenig hinzu. (Ich habe es mir anders überlegt und versucht, pandas read_csv zu verwenden.)
Die Basis-URL für RSS ist die Zeichenfolge "https: // rss-weather.yahoo.co.jp / rss / days /
" in rssURL.
Das Programm liest zuerst shosaiChiku Zeile für Zeile und erhält die "Region", "Stadt" und "URL".
Ich habe festgestellt, dass die URL nach "Tagen /" in RSS mit dem Nummernteil der URL der Stadt, Gemeinde, Stadt und des Dorfes übereinstimmt.
Extrahieren Sie als Nächstes nur den Nummernteil der URL der Stadt, Gemeinde, Stadt oder des Dorfes mit einem regulären Ausdruck.
Außerdem ist RSS nicht ".html", sondern ".xml". Konvertieren Sie es also.
Nachdem wir die RSS-URL kennen, hängen wir sie an die Liste an und schreiben sie.
Hier ist die resultierende Datei. Es ist schwer zu erkennen, weil Sie es nicht direkt öffnen und verwenden, aber jetzt haben Sie die Daten, um das zu tun, was Sie wollen. (Wenn ich Zeit habe, plane ich, SQLite zu verwenden, damit es wie eine Datenbank aussieht.)
Ich habe viel geschrieben, aber es ist lange her, also werde ich damit aufhören, "den Namen und die URL des Gebiets und der Stadt zu ermitteln". Außerdem hoffe ich, dass ich im nächsten Update erklären kann, wie man die Wetterinformationen erhält und sie online sendet. .. ..
Also nächstes Mal.