Linux Ubuntu Xfce
Web Scraping mit Python Python Crawling & Scraping - Praktischer Entwicklungsleitfaden für die Datenerfassung und -analyse Selenium WebDriver üben
Chrome
sudo curl -sS -o - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add
sudo echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google-chrome.list
sudo apt-get -y update
sudo apt-get -y install google-chrome-stable
Andere
sudo apt install chromium-chromedriver liblzma-dev \
&& pip install bs4 selenium pandas
Für bs4 werden verschiedene Methoden vorbereitet, und wenn Sie diese Methoden und regulären Ausdrücke (re) vollständig nutzen, ** gibt es nichts, was nicht erhalten werden kann **
Am schnellsten und kann die meisten CSS-Selektoren verwenden
html_doc = '<html>...</html>'
soup = BeautifulSoup(html_doc, 'lxml')
Wenn Sie dies nicht tun, werden sich die Trümmer des Prozesses ansammeln.
from selenium import webdriver
driver = webdriver.Chrome()
#Beenden Sie den Treiber
driver.close()
driver.quit()
Suchen Sie nach der Lieferung mit BS4 nach Schätzen
options = ChromeOptions()
options.add_argument('--headless') #Fensterloser Modus
driver = Chrome(options=options)
url = 'https://www.example.com/'
driver.get(url)
#Starten Sie den Betrieb von Selen
...
...
...
#Ende des Selenbetriebs
html = driver.page_source.encode('utf-8')
soup = BeautifulSoup(html, "lxml")
#BS4-Verarbeitung gestartet
...
...
...
#BS4-Verarbeitung beendet
Suchen Sie nach dem Tag-Namen direkt aus dem BeautifulSoup
-Objekt
Wenn es nur wenige Tags wie dieses gibt
from bs4 import BeautifulSoup
html_doc = '''
<html>
<head>
<title>hello soup</title>
</head>
<body>
<p class="my-story">my story</p>
</body>
</html>
'''
soup = BeautifulSoup(html_doc, 'lxml')
print(soup.title)
print(soup.title.text)
print(soup.p)
print(soup.p['class'])
print(soup.p.text)
Ausführungsergebnis
<title>hello soup</title>
hello soup
<p class="my-story">my story</p>
['my-story']
my story
BeautfulSoup hat 4 Arten von Objekten: "Tag", "NavigableString", "BeautifulSoup", "Kommentar".
Von diesen benutze ich oft "Schöne Suppe" und "Tag".
BeautifulSoup
: Konvertiert die HTML-Quelle in ein Format (Baumstruktur), das von Python verarbeitet werden kann
Tag
: Ein Tag-Objekt wird erstellt, wenn eine bestimmte Methode für ein BeautifulSoup-Objekt verwendet wird.
Sie können mit den Methoden "find" und "find_all" für ein "BeautifulSoup" -Objekt nach allem suchen, aber Sie müssen wissen, was die Methode erzeugt, um eine gute Suche durchzuführen.
** Mit der Methode erstellte Objekte **
find
→ bs4.element.Tag
find_all
→ bs4.element.ResultSet
** Rückgabewert, wenn nichts gefunden wird **
find
→ None
find_all
→ [] leere Liste
bs4.element.Tag
Sie können sich vorstellen, dass es mit anderen bs4-Methoden als der Methode find_all, der Methode BeautifulSoup und der Methode select generiert wird.
from bs4 import BeautifulSoup
html_doc = '''
<html>
<head>
<title>hello soup</title>
</head>
<body>
<p class="my-story">my story</p>
<a class='brother' href='http://example.com/1' id='link1'>Link 1</a>
<a class='brother' href='http://example.com/2' id='link2'>Link 2</a>
<a class='brother' href='http://example.com/3' id='link3'>Link 3</a>
</body>
</html>
'''
soup = BeautifulSoup(html_doc, 'lxml')
print('tag1')
tag1 = soup.find('a')
print(tag1)
print(type(tag1))
print('tag2')
tag2 = soup.a
print(tag2)
print(type(tag2))
bs4.element.ResultSet
Erstellt mit den Methoden find_all
, BeautifulSoup
und select
Ein Bild mit viel bs4.element.Tag
in der Liste (** Dieses Bild ist ziemlich wichtig **)
python:bs4.element.ResultSet Bild
bs4.element.ResultSet = [bs4.element.Tag, bs4.element.Tag, bs4.element.Tag,...]
Daher kann es nicht so durchsucht werden, wie es ist, und es wird verwendet, nachdem es aus der Liste entfernt wurde. Wenn Sie es herausnehmen, können Sie dieselbe Methode wie oben "bs4.element.tag" verwenden.
- Die Methode kann nicht verwendet werden! Das ist fast der Fall, wenn Sie versuchen, die Methode "bs4.element.Tag" für "bs4.element.ResultSet" zu verwenden.
from bs4 import BeautifulSoup
html_doc = '''
<html>
<head>
<title>hello soup</title>
</head>
<body>
<p class="my-story">my story</p>
<a class='brother' href='http://example.com/1' id='link1'>Link 1</a>
<a class='brother' href='http://example.com/2' id='link2'>Link 2</a>
<a class='brother' href='http://example.com/3' id='link3'>Link 3</a>
</body>
</html>
'''
soup = BeautifulSoup(html_doc, 'lxml')
print('tag3')
tag3 = soup.select('a:nth-of-type(2)') #Suchen Sie anhand des Vorhandenseins oder Nichtvorhandenseins eines Tags im Body-Tag
print(tag3)
print(type(tag3))
print('tag4')
tag4 = soup.select('.link1') #CSS-Auswahlklasse
print(tag4)
print(type(tag4))
print('tag5')
tag5 = soup.select('a[href]') #Suchen Sie nach Tags mit oder ohne Attribute
print(tag5)
print(type(tag5))
Wenn Sie die Standardeinstellung beibehalten, wird beim Versuch, eine große Datei zu drucken, die Fehlermeldung "IOPub-Datenrate überschritten" angezeigt. Ändern Sie sie daher in "Unbegrenzt"
Erstellen Sie eine Konfigurationsdatei
jupyter notebook --generate-config
python:~/.jupyter/jupyter_notebook_config.py
#Vor dem Wechsel 1000000 → Nach dem Wechsel 1e10
jupyter notebook --NotebookApp.iopub_data_rate_limit=1e10
Schnell, weil es im Binärformat liest und schreibt ('b' im Code bedeutet binär)
Es gibt eine Bibliothek mit der gleichen Funktion, "joblib", aber diese ist gut zu verwenden, wenn Sie die Dateigröße auf Kosten der Geschwindigkeit reduzieren möchten.
Schreiben(dump)
import pickle
example = 'example'
with open('example.pickle', 'wb') as f:
pickle.dump(example, f)
Lesen(load)
with open('example.pickle', 'rb') as f:
example = pickle.load(f)
Beim Versuch, ein "bs4-Objekt" (bs4.BeautifulSoup usw.) zu schreiben Da der Fehler "Maximale Rekursionstiefe beim Beizen eines Objekts überschritten" angezeigt wird, konvertieren Sie ihn vor dem Speichern in "Zeichenfolge" usw.
dump
import pickle
example = 'example'
with open('example.pickle', 'wb') as f:
pickle.dump(str(example), f)
load
with open('example.pickle', 'rb') as f:
example = BeatitfulSoup(pickle.load(f), 'lxml')
Wenn Sie es nur lesen, kann es nicht von bs4 verarbeitet werden, da es sich um einen "str-Typ" handelt. Konvertieren Sie daher beim Lesen in den Typ "bs4"
** Wenn die obige Methode nicht funktioniert **
Wenn Sie dict
nicht ausgeben können
In einem solchen Fall ist es gut, mit "json" zu entleeren
dump
import json
with open('example.json', 'w') as f:
json.dump(example, f)
load
with open('example.json', 'r') as f:
json.load(f)
Jupyter Notebook
Wenn Sie sich den DataFrame von Pandas ansehen und die Zellenbreite die Standardeinstellung ist, werden die Zeichen abgeschnitten. Stellen Sie daher die Zellenbreite auf das Maximum ein
css:~/.jupyter/custom/custom.css
.container { width:100% !important; }
Verwenden Sie "% time", das nur in der "Jupyter" -Umgebung verwendet werden kann Dies ist eine integrierte Methode von "Jupyter", daher ist kein Import erforderlich
Wie benutzt man
%time example_function()
Wenn Sie das "Scraping" von "https://www.example.com/themen/scraping" erhalten möchten
Geben Sie /
mit split
an, um das Element dahinter zu erhalten
Code
url = 'https://www.example.com/topics/scraping'
print(url.split('/'))
#['https:', '', 'www.example.com', 'topics', 'scraping']
print(url.split('/')[-1])
#scraping
Pandas
Pandas UserWarning: Could not import the lzma module. Your installed Python is incomplete
Fehler beim Fehlen der erforderlichen Pakete für Pandas
sudo apt install liblzma-dev
import pandas as pd
df = pd.DataFrame(index=[1,2,3], {'Column1':data1, 'Column2':'data2', 'Column3':'data3'})
#Extrahieren Sie Spalte3 und machen Sie daraus eine Liste
col3 = pd.Series(df['Column3']).tolist()
Die Standardeinstellung ist rechtsbündig, daher ist es schwierig, URLs und Englisch zu lesen.
df.style.set_properties(**{'text-align': 'left'}) #Links gerechtfertigt
Recommended Posts