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.
(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.
Verwenden Sie pip.
pip install requests
pip install lxml
pip install beautifulsoup4
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)
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.
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.
Sie können es sofort mit pip tun.
pip install selenium
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)
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)
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)
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