Einfaches Scraping mit Python (JavaScript / Proxy / Cookie-kompatible Version)

Guten Morgen allerseits, @_akisato.

Crawler / Web Scraping Adventskalender http://qiita.com/advent-calendar/2015/ Er wurde als Artikel am 6. Tag des Crawlers geschrieben.

Heute möchte ich das Scraping von Webseiten einführen, die nur gelesen werden können, wenn JavaScript und Cookies zulässig sind.

Die Implementierung wird auf GitHub https://github.com/akisato-/pyScraper hochgeladen.

Zuallererst ohne Einfallsreichtum kratzen

(1) Holen Sie sich die Webseite mit Anforderungen und (2) führen Sie das Scraping mit BeautufulSoup4 aus. Der Python-Standard-HTML-Parser ist nicht sehr gut, daher werden wir hier lxml verwenden. Informationen zur grundlegenden Verwendung von BeautifulSoup4 finden Sie unter http://qiita.com/itkr/items/513318a9b5b92bd56185.

Installation der erforderlichen Pakete

Verwenden Sie pip.

pip install requests
pip install lxml
pip install beautifulsoup4

Quelle

Ich denke, es wird wie folgt sein. Wenn Sie die URL der Seite angeben, die Sie löschen möchten, und den Namen der Ausgabedatei, wird der Titel der Seite im JSON-Format zurückgegeben. Die Funktion Scraping ist der Hauptteil.

scraping.py


import sys
import json
import requests
from bs4 import BeautifulSoup
import codecs

def scraping(url, output_name):
    # get a HTML response
    response = requests.get(url)
    html = response.text.encode(response.encoding)  # prevent encoding errors
    # parse the response
    soup = BeautifulSoup(html, "lxml")
    # extract
    ## title
    header = soup.find("head")
    title = header.find("title").text
    ## description
    description = header.find("meta", attrs={"name": "description"})
    description_content = description.attrs['content'].text
    # output
    output = {"title": title, "description": description_content}
    # write the output as a json file
    with codecs.open(output_name, 'w', 'utf-8') as fout:
        json.dump(output, fout, indent=4, sort_keys=True, ensure_ascii=False)

if __name__ == '__main__':
    # arguments
    argvs = sys.argv
    ## check
    if len(argvs) != 3:
        print("Usage: python scraping.py [url] [output]")
        exit()
    url = argvs[1]
    output_name = argvs[2]

    scraping(url, output_name)

Unterstützt JavaScript

Die Anzahl der Webseiten, die ohne aktiviertes JavaScript nicht angezeigt werden können, nimmt erheblich zu. Wenn Sie mit der oben genannten Quelle auf eine solche Seite zugreifen, wird nur die Seite "Bitte aktivieren Sie JavaScript" angezeigt.

Um solche Seiten zu unterstützen, werden wir die Webseitenerfassung, die bei Anfragen durchgeführt wurde, durch eine Kombination aus Selen und PhantomJS ersetzen. Selen ist ein Tool zur Automatisierung von Browseroperationen, und PhantomJS ist ein Qt-basierter Browser. [^ Browser]

[^ browser]: PhantomJS ist ein Browser, daher können Sie ihn durch einen häufig verwendeten Webbrowser wie IE, Firefox, Chrome usw. ersetzen. Einzelheiten finden Sie im offiziellen Dokument http://docs.seleniumhq.org/docs/03_webdriver.jsp#selenium-webdriver-s-drivers.

Installieren Sie PhantomJS

Unter Mac und Linux kann es sofort mit einem Paketmanager wie Brew oder Yum installiert werden.

Mac


brew install phantomjs

CentOS


yum install phantomjs

Laden Sie unter Windows die Binärdatei von http://phantomjs.org/download.html herunter, platzieren Sie sie an einem geeigneten Speicherort und fügen Sie sie dann in den Pfad ein.

Selen-Installation

Sie können es sofort mit pip tun.

pip install selenium

Quelle

Unter Verwendung von Selen und PhantomJS wird die Scraping-Quelle wie folgt geändert. Nach dem Erwerb der Webseite muss das Verfahren nicht geändert werden. Konfigurieren Sie den PhantomJS-Webtreiber mit Selenium und rufen Sie den HTML-Code über diesen Treiber ab. Danach ist es das gleiche. Wenn Sie das Treiberbetriebsprotokoll aufzeichnen möchten, ändern Sie os.path.devnull in den Dateinamen.

scraping_js.py


import sys
import json
import os
import requests
from selenium import webdriver
from bs4 import BeautifulSoup
import codecs

def scraping(url, output_name):
    # Selenium settings
    driver = webdriver.PhantomJS(service_log_path=os.path.devnull)
    # get a HTML response
    driver.get(url)
    html = driver.page_source.encode('utf-8')  # more sophisticated methods may be available
    # parse the response
    soup = BeautifulSoup(html, "lxml")
    # extract
    ## title
    header = soup.find("head")
    title = header.find("title").text
    ## description
    description = header.find("meta", attrs={"name": "description"})
    description_content = description.attrs['content'].text
    # output
    output = {"title": title, "description": description_content}
    # write the output as a json file
    with codecs.open(output_name, 'w', 'utf-8') as fout:
        json.dump(output, fout, indent=4, sort_keys=True, ensure_ascii=False)

if __name__ == '__main__':
    # arguments
    argvs = sys.argv
    ## check
    if len(argvs) != 3:
        print("Usage: python scraping.py [url] [output]")
        exit()
    url = argvs[1]
    output_name = argvs[2]

    scraping(url, output_name)

Entspricht Proxy

Sie können die Proxy-Einstellung als Argument von PhantomJS eingeben.

phantomjs_args = [ '--proxy=proxy.server.no.basho:0000' ]
driver = webdriver.PhantomJS(service_args=phantomjs_args, service_log_path=os.path.devnull)

Entspricht Cookie

Cookies sind in PhantomJS standardmäßig aktiviert. Wenn Sie die Cookie-Datei zur Hand haben möchten, können Sie sie im Argument von PhantomJS festlegen.

phantomjs_args = [ '--cookie-file={}'.format("cookie.txt") ]
driver = webdriver.PhantomJS(service_args=phantomjs_args, service_log_path=os.path.devnull)

Quelle endgültige Form

Wenn alle Funktionen abgedeckt sind, ist dies wie folgt.

scraping_complete.py


import sys
import json
import os
import requests
from selenium import webdriver
from bs4 import BeautifulSoup
import codecs

def scraping(url, output_name):
    # Selenium settings
    phantomjs_args = [ '--proxy=proxy.server.no.basho:0000', '--cookie-file={}'.format("cookie.txt") ]
    driver = webdriver.PhantomJS(service_args=phantomjs_args, service_log_path=os.path.devnull)
    # get a HTML response
    driver.get(url)
    html = driver.page_source.encode('utf-8')  # more sophisticated methods may be available
    # parse the response
    soup = BeautifulSoup(html, "lxml")
    # extract
    ## title
    header = soup.find("head")
    title = header.find("title").text
    ## description
    description = header.find("meta", attrs={"name": "description"})
    description_content = description.attrs['content']
    # output
    output = {"title": title, "description": description_content}
    # write the output as a json file
    with codecs.open(output_name, 'w', 'utf-8') as fout:
        json.dump(output, fout, indent=4, sort_keys=True, ensure_ascii=False)

if __name__ == '__main__':
    # arguments
    argvs = sys.argv
    ## check
    if len(argvs) != 3:
        print("Usage: python scraping.py [url] [output]")
        exit()
    url = argvs[1]
    output_name = argvs[2]

    scraping(url, output_name)

Recommended Posts

Einfaches Scraping mit Python (JavaScript / Proxy / Cookie-kompatible Version)
Scraping mit Python
Der HTTP-Zugriff über einen Proxy in Python Web Scraping war bei Anfragen einfach
Einfaches Web-Scraping mit Python und Ruby
Scraping in Python (Vorbereitung)
Versuchen Sie es mit Python.
Scraping mit Python + PhantomJS
Schaben mit Selen [Python]
Scraping mit Python + PyQuery
Scraping von RSS mit Python
Überprüfen Sie die Version mit Python
Schnelles Web-Scraping mit Python (unterstützt das Laden von JavaScript)
Ich habe versucht, mit Python zu kratzen
Schaben mit Selen in Python
[Analyse des gemeinsamen Auftretens] Einfache Analyse des gemeinsamen Auftretens mit Python! [Python]
Schaben mit Chromedriver in Python
Festliches Scraping mit Python, Scrapy
Einfache Ordnersynchronisation mit Python
Scraping mit Selen in Python
Einfaches Web-Scraping mit Scrapy
Scraping mit Tor in Python
Kratzwettervorhersage mit Python
Einfache Python-Kompilierung mit NUITKA-Utilities
Einfacher HTTP-Server mit Python
Einfache Proxy-Anmeldung mit Django-Hijack
Schaben mit Selen + Python Teil 2
Geben Sie die Python-Version mit virtualenv an
Ich habe versucht, mit Python zu kratzen
Web Scraping Anfänger mit Python
Versuchen Sie es mit Python + Beautiful Soup
[Python] Einfache Parallelverarbeitung mit Joblib
Scraping mit Selen in Python (Basic)
Dynamischer Proxy mit Python, Ruby, PHP
Scraping mit Python, Selen und Chromedriver
Web Scraping mit Python Erster Schritt
Ich habe versucht, WebScraping mit Python.
Kratzen mit Python und schöner Suppe
Einfache Python + OpenCV-Programmierung mit Canopy
Einfache Mailübertragung mit Eile Python3
Lassen Sie uns mit Python Image Scraping durchführen
Bayesianische Optimierung, die mit Python sehr einfach ist
Holen Sie sich Qiita-Trends mit Python-Scraping
Verwalten Sie jede Python-Version mit Homebrew
Beherrsche den Typ mit Python [Python 3.9 kompatibel]
Visualisieren Sie Ihre Daten ganz einfach mit Python Seaborn.
Einfache parallele Ausführung mit Python-Unterprozess
"Scraping & maschinelles Lernen mit Python" Lernnotiz
Holen Sie sich Wetterinformationen mit Python & Scraping
Abrufen von Eigenschaftsinformationen durch Scraping mit Python
[Python] Super einfacher Test mit Assert-Anweisung
WEB-Scraping mit Python (für persönliche Notizen)
[Python] Einfache Überprüfung des Argumenttyps mit Datenklasse
Automatisieren Sie einfache Aufgaben mit Python Part1 Scraping
Erste Schritte mit Python Web Scraping Practice
Einfache Einführung der Spracherkennung mit Python
[Persönlicher Hinweis] Scraping von Webseiten in Python3