Python crawlt Daten zur Überwachung der Oberflächenwasserqualität (Crawler)


Vorwort

Auch der erste Blog ist ein Anfänger, der Zweck des Blogschreibens ist es, meinen eigenen Lern- und Problemlösungsprozess festzuhalten und auch anderen kleinen Partnern in Not zu helfen. Ich bin ein junger Doktorand an einer bestimmten Universität. Meine Hauptforschungsrichtung ist die Fernerkundung von Wasserressourcen und Umwelt. Kürzlich bat mich mein Chef, die Überwachungsdaten der Oberflächenwasserqualität zu crawlen. Ich habe viele Blogs überprüft und auf einige andere Blogs verwiesen , und fügte einige Variablenänderungen hinzu. Schließlich lief es erfolgreich. Ich bin kein professioneller Programmierer, nur als Referenz.


1. Referenzblog

  1. python+selenium+phantomJS Crawling nationale Oberflächenwasserqualität automatische Überwachung Echtzeit-Datenfreigabesystem - dynamischer Web-Crawler ------- Zhang Junjie@Nick
    Linkadresse
  2. python+selenium+Chrome (headless version) Crawling National Surface Water Quality Automatic Monitoring Real-time Data Publishing System (Modified Version)——Dynamic Web Crawler---Zhang Junjie@Nick Link
    Address

2. Analysebeschreibung

(1) Einführung in den Originaltext

Die Schwierigkeit beim Crawlen dieser Website besteht darin, dass es sich um eine dynamische Website handelt. Ich glaube, jeder hat schon von Octopus gehört, einer sehr nützlichen Daten-Crawling-Software, aber die Website zur Überwachung der Oberflächenwasserqualität ist eine dynamische Website. Ich habe sie entsprechend ausprobiert. Sie wurde gefunden dass nur ein Teil der Daten gecrawlt werden konnte, aber nicht die kompletten Daten.Dann bin ich auf Python umgestiegen, habe einige Modifikationen auf Basis der Vorgänger vorgenommen und lief schließlich erfolgreich. Sehen wir uns das unten an (siehe Einleitung des Blogs)
Bildbeschreibung hier einfügen
Bitte achten Sie auf die 3 Stellen im Bild:
1. Die dritte Position ist die Datenposition
2. Wenn die Webseite alle Daten zurückgibt, müssen wir nur diese lokalisieren 3 Stellen. Die Daten werden Schritt für Schritt gecrawlt, was sich nicht vom vorherigen Code unterscheidet.
3. Die Schwierigkeit besteht darin, dass diese Webseite 60 Datenelemente fest zurückgibt, und sie wird jedes Mal zurückgegeben, wenn Sie scrollen.
4. In diesem Fall Unabhängig davon, wie wir crawlen, ist es schwierig, die Integrität der Daten zu garantieren, entweder redundant oder nicht vorhanden
5. Wenn Sie sich die Webseite jedoch genau ansehen, werden Sie feststellen, dass die Website eine andere Schnittstelle bietet, die es uns ermöglicht, alle Daten anzuzeigen (siehe das Bild unten);
Bildbeschreibung hier einfügen6. Klicken Sie einfach auf „All Watershed“, es werden alle gemeldeten Daten an diesem Tag zurückgegeben; 7. Wir müssen nur die „Schaltfläche“ finden und klicken (click()).

Der Code lautet wie folgt (Beispiel):

#--author--张俊杰@Nick
import datetime
import pandas as pd
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.chrome.options import Options     #建议使用谷歌浏览器
import time
chrome_options = Options()
chrome_options.add_argument('--headless')
#使不使用headless版本,也许你想感受一下浏览器自动打开,自动点击的快感,也不一定
browser = webdriver.Chrome(chrome_options=chrome_options,executable_path = 'C:/Users/Administrator/AppData/Local/Google/Chrome/Application/chromedriver.exe')
#chromedriver下载下来之后复制到chrome.exe同文件夹下即可
print("打开网页中。。。")
browser.get("http://106.37.208.243:8068/GJZ/Business/Publish/Main.html")
print("网页响应中。。。")
wait = WebDriverWait(browser,20)#毕竟代码运行的速度和浏览器打开的速度不再一个量级,一个闪电侠,一个奥特曼
wait.until(EC.frame_to_be_available_and_switch_to_it((By.ID,"mainframe")))#这一步很关键
browser.find_element_by_id('ddm_River').click()#模拟点击“流域”
browser.find_element_by_xpath("/html/body/div[1]/div[2]/div/ul/li[1]").click()#模拟点击“所有流域”
wait.until(EC.presence_of_element_located((By.CLASS_NAME,"grid")))#定位到数据
print("获取网页数据中。。。")
time.sleep(10)
soup = BeautifulSoup(browser.page_source,"lxml")
browser.close()
data_head = soup.select(".panel-heading")[0]
grid_data = soup.select(".grid")[0]
data_colhead = data_head.findAll("td")
data_rows = grid_data.findAll("tr")
water_df = pd.DataFrame(columns=[c.text for c in data_colhead])
print("提取网页数据中。。。")
for i,data_row in enumerate(data_rows):
	water_loc = water_df.iloc[:,0].values
	water_data = water_df.iloc[:,1].values
	row_dat = [r.text for r in data_row]
	water_df.loc[i] = row_dat
#系统时间
data_str = datetime.datetime.now().strftime('%Y_%m_%d')
#可修改保存路径
water_df.to_csv("E:/python/国家地表水爬虫/%s_国家地表水水质自动监测系统检测数据.csv" % (data_str),index=None, encoding="GB18030")
print("数据提取完成!!")

(2) Ursachenanalyse

Ich glaube, dass viele Freunde den Code direkt zum Laufen kopiert haben, natürlich muss das Endergebnis ein Fehler sein. Analysieren wir kurz die relevanten Gründe: Aufmerksame Freunde haben festgestellt, dass sich die bestehende Website und die vom ursprünglichen Blog eingeführte Website erneut geändert haben, sodass es natürlich unmöglich ist, die neue Website mit dem vorherigen Code zu crawlen.

3. Zeigen Sie den Quellcode an

Melden Sie sich bei der entsprechenden Website im Google-Browser an, drücken Sie F12, um den Quellcode anzuzeigen, lassen Sie uns sehen, welche Änderungen vorgenommen wurden
1. Wie in der Abbildung gezeigt
Bildbeschreibung hier einfügen
2. Wie in der Abbildung gezeigt
Bildbeschreibung hier einfügen

4. Änderungen relevanter Variablen

Nicht viel Unsinn, gehen Sie direkt zum Bild oben, die roten Kästchen im Bild sind alles Stellen, die geändert werden müssen. Bildbeschreibung hier einfügen
Außerdem stellte der Blogger fest, dass 26 Zeilen von soup = BeautifulSoup(browser.page_source,"lxml") ebenfalls einen Fehler während der Codeoperation meldeten, der nach dem Ausprobieren verschiedener Methoden schließlich behoben werden konnte. Ändern Sie es wie folgt:

soup = BeautifulSoup(browser.page_source,"html.parser")

5. Code läuft

Ändern Sie den Teil der Variablen, der geändert werden muss, der in Kapitel 4 eingeführt wurde, der Code lautet wie folgt:

import datetime
import pandas as pd
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.chrome.options import Options     #建议使用谷歌浏览器
import time
chrome_options = Options()
chrome_options.add_argument('--headless')
#使不使用headless版本,也许你想感受一下浏览器自动打开,自动点击的快感,也不一定
browser = webdriver.Chrome(chrome_options=chrome_options,executable_path = 'E:/Google/Chrome/Application/chromedriver.exe')
#chromedriver下载下来之后复制到chrome.exe同文件夹下即可
print("打开网页中。。。")
browser.get("http://106.37.208.243:8068/GJZ/Business/Publish/Main.html")
print("网页响应中。。。")
wait = WebDriverWait(browser,20)#毕竟代码运行的速度和浏览器打开的速度不再一个量级,一个闪电侠,一个奥特曼
wait.until(EC.frame_to_be_available_and_switch_to_it((By.ID,"MF")))#这一步很关键
browser.find_element_by_id('ddm_Area').click()#模拟点击“区域”
browser.find_element_by_xpath("/html/body/div[1]/div[1]/div/ul/li[1]").click()#模拟点击“所有区域”
wait.until(EC.presence_of_element_located((By.CLASS_NAME,"panel")))#定位到数据
print("获取网页数据中。。。")
time.sleep(10)
soup = BeautifulSoup(browser.page_source,"html.parser")
browser.close()
data_head = soup.select(".panel-heading")[0]
grid_data = soup.select(".panel")[0]
data_colhead = data_head.findAll("td")
data_rows = grid_data.findAll("tr")
water_df = pd.DataFrame(columns=[c.text for c in data_colhead])
print("提取网页数据中。。。")
for i,data_row in enumerate(data_rows):
	water_loc = water_df.iloc[:,0].values
	water_data = water_df.iloc[:,1].values
	row_dat = [r.text for r in data_row]
	water_df.loc[i] = row_dat
#系统时间
data_str = datetime.datetime.now().strftime('%Y_%m_%d_%H')
#可修改保存路径
water_df.to_csv("填写相应的保存路径/%s_国家地表水水质自动监测系统检测数据.csv" % (data_str),index=None, encoding="GB18030")
print("数据提取完成!!")

6. Laufergebnisse

Bildbeschreibung hier einfügen

Sieben, Achtung

Darüber hinaus sollte beachtet werden, dass die Version von pycharm, die ich verwende, 2021.2.3 ist und der Python-Compiler 3.7 ist.
PyCharm- und Python-Download-Adresse anhängen
PyCharm-Download- und Installations-Tutorial-
Python-Download-Adresse

おすすめ

転載: blog.csdn.net/xiatiandexia123/article/details/122050791