[Scraping] Python-Scraping

Umgebung

Linux Ubuntu Xfce

Referenz

Web Scraping mit Python Python Crawling & Scraping - Praktischer Entwicklungsleitfaden für die Datenerfassung und -analyse Selenium WebDriver üben

Werkzeug

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

Basic

Was Sie mit bs4 machen können

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 **

Parse verwendet lxml

Am schnellsten und kann die meisten CSS-Selektoren verwenden

html_doc = '<html>...</html>'
soup = BeautifulSoup(html_doc, 'lxml')

Stellen Sie sicher, dass Sie das Programm schließen und nach der Ausführung beenden

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()

Arbeiten Sie mit Selen und übergeben Sie die HTML-Quelle an BS4

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

Verwenden Sie die Suchmethode nicht, wenn die Anzahl der HTML-Tags gering ist

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

Kennen Sie die 4 Objekte von bs4

BeautfulSoup hat 4 Arten von Objekten: "Tag", "NavigableString", "BeautifulSoup", "Kommentar".

Von diesen benutze ich oft "Schöne Suppe" und "Tag".

BeautifulSoup-Objekt und Tag-Objekt

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.

Verstehe den Unterschied zwischen find und find_all

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 ** findbs4.element.Tag find_allbs4.element.ResultSet

** Rückgabewert, wenn nichts gefunden wird ** findNone 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))

Tipps

Lösen Sie die Druckausgabegrenzen

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

Lesen und Schreiben mit hoher Geschwindigkeit mit Gurke

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)

Es wurde ein Problem behoben, das einen Fehler verursachte, wenn versucht wurde, etwas anderes als eine Zeichenfolge zu lesen oder zu schreiben

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

Zellenbreite maximieren

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; }

Verarbeitungszeit messen

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()

Reguläre Ausdrücke

Holen Sie sich die Zeichen vor und nach dem Schrägstrich in der URL

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

Extrahieren Sie die Spalte von DataFrame und machen Sie daraus eine Liste

  1. Fügen Sie die Spalte, die Sie abrufen möchten, in Serie ein
  2. Verwenden Sie die Series-Tolist-Methode
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()

Links das Ausgabeergebnis von DataFrame ausrichten

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

[Scraping] Python-Scraping
Python-Scraping-Memo
Python Scraping get_ranker_categories
Scraping mit Python
Scraping mit Python
Python Scraping eBay
Python Scraping get_title
Python: Scraping Teil 1
Scraping mit Python
Python: Scraping Teil 2
Scraping in Python (Vorbereitung)
Versuchen Sie es mit Python.
Python
UnicodeEncodeError: 'cp932' während des Python-Scrapings
Grundlagen der Python-Scraping-Grundlagen
Scraping mit Python + PhantomJS
Schaben mit Selen [Python]
Scraping mit Python + PyQuery
Schaben 1
Scraping von RSS mit Python
Scraping mit Python 3.5 async / await
Ich habe versucht, mit Python zu kratzen
Web Scraping mit Python + JupyterLab
Schaben mit Selen in Python
Schaben mit Selen + Python Teil 1
Python Super Anfänger versucht zu kratzen
Festliches Scraping mit Python, Scrapy
Scraping mit Python 3.5 Async-Syntax
Scraping mit Tor in Python
Web Scraping mit Selenium (Python)
Kratzwettervorhersage mit Python
Schaben mit Selen + Python Teil 2
[Python + Selen] Tipps zum Scraping
Ich habe versucht, mit Python zu kratzen
Web Scraping Anfänger mit Python
Python Crawling & Scraping Kapitel 4 Zusammenfassung
Kafka Python
Versuchen Sie es mit Python + Beautiful Soup
Python-Grundlagen ⑤
Python-Zusammenfassung
Eingebaute Python
Python-Einschlussnotation
Python studieren
Python 2.7 Countdown
Python-Memorandum
Python FlowFishMaster
Verschiedene Kratzer
Python-Dienst
Python-Tipps
Beginn des Schabens
Scraping mit Node, Ruby und Python
Python-Memo
Python-Einschlussnotation
Scraping mit Selen in Python (Basic)
Python Singleton
Python-Grundlagen ④