Google sammelt Informationen von Suchmaschinen [Googlebot](https://ja.wikipedia.org/wiki/%E3%82%B0%E3%83%BC%E3%82%B0%E3%83%AB%E3 % 83% 9C% E3% 83% 83% E3% 83% 88) wird verwendet. Ab einer bestimmten Website folgt sie automatisch den Links dieser Website und sammelt Informationen.
Sie können dasselbe mit dem Python-Modul Scrapy tun. Verwenden wir Scrapy, um Informationen über die Site zu sammeln.
Installieren Sie Scrapy mit pip. `$ pip install scrapy
Scrapy wird projektweise verwaltet. Bearbeiten Sie nach dem Generieren des Projekts die folgenden Dateien, die dort automatisch generiert werden.
Erstellen Sie zunächst ein Projekt.
$ scrapy startproject tutorial
Dann wird ein solcher Ordner erstellt.
tutorial/
tutorial/
scrapy.cfg # deploy configuration file
tutorial/ # project's Python module, you'll import your code from here
__init__.py
items.py # project items file
pipelines.py # project pipelines file
settings.py # project settings file
spiders/ # a directory where you'll later put your spiders
__init__.py
...
Definieren Sie, was Sie erhalten. Dies ist die Definition des Feldes in der Datenbank.
items.py
import scrapy
class WebItem(scrapy.Item):
title = scrapy.Field()
link = scrapy.Field()
date = scrapy.Field()
Dies ist eine blütenförmige Datei, die das Web crawlt und Daten extrahiert. Geben Sie die Startadresse der Patrouille, die Patrouillenbedingungen und die Datenextraktionsbedingungen an.
Mach eine Spinne. Die Syntax lautet "$ Scrapy Genspider [Optionen]
commandline
$ scrapy genspider webspider exsample.com
Created spider 'webspider' using template 'basic' in module:
tutorial.spiders.webspider
Die generierte Datei ist
tutorial/spiders/webspider.py
# -*- coding: utf-8 -*-
import scrapy
class WebspiderSpider(scrapy.Spider):
name = "webspider" #Der Name im Projekt. Wird verwendet, um eine Spinne beim Bewegen anzugeben
allowed_domains = ["exsample.com"] #Domänenspezifikation für Patrouille OK
start_urls = (
'http://www.exsample.com/', #Fang hier an. Sie können mehrere in der Liste angeben.
)
def parse(self, response): #Hier sind die Extraktionsbedingungen
pass
Eine solche Datei wird generiert. Ändern Sie dies nach Ihren Wünschen.
tutorial/spiders/webspider.py
# -*- coding: utf-8 -*-
import scrapy
from tutorial.items import WebItem
import re
import datetime
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor
class WebspiderSpider(CrawlSpider): #Der Klassenname hat keine Bedeutung
name = 'WebspiderSpider' #Das ist wichtig. Spinne mit diesem Namen(Crawler)Bewegung
allowed_domains = ['example.com']
start_urls = ['http://www.example.com']
xpath = {
'title' : "//title/text()",
}
list_allow = [r'(Reguläre Ausdrücke)'] #Links, die diese Bedingung erfüllen, werden überwacht
list_deny = [
r'/exsample/hogehoge/hoge/', #Dies ist ein Beispiel für die Angabe eines Links, der nicht umgeht. Listennotation ist ebenfalls möglich
]
list_allow_parse = [r'(Reguläre Ausdrücke)'] #Linkspezifikation zum Extrahieren von Daten
list_deny_parse = [ #Linkspezifikation ohne Datenextraktion
r'(Reguläre Ausdrücke)',
r'(Reguläre Ausdrücke)',
]
rules = (
#Patrouillenregeln.
Rule(LinkExtractor(
allow=list_allow,
deny=list_deny,
),
follow=True #Gehen Sie in diesen Link
),
#Datenextraktionsregeln
Rule(LinkExtractor(
allow=list_allow_parse,
deny=list_deny_parse,
unique=True #Extrahieren Sie keine Daten am selben Verbindungsziel
),
callback='parse_items' #Wenn die Bedingungen erfüllt sind, wird die hier angegebene Datenextraktionsausführungsfunktion ausgeführt.
),
)
#Definition der Datenextraktionsfunktion
def parse_items(self, response): #Die Antwort enthält Website-Informationen
item = WebItem() # items.Klasse angegeben durch py
item['title'] = response.xpath(self.xpath['title']).extract()[0]
item['link'] = response.url
item['date'] = datetime.datetime.utcnow() + datetime.timedelta(hours=9) #Aktuelle Uhrzeit. Es wird in Japan Zeit sein.
yield item
Bitte beziehen Sie sich auf die Kommentare für das, was Sie schreiben.
Fügen Sie den Ertragsgegenstand der oben erstellten Spinne in mongoDB ein.
pipelines.py
from pymongo import MongoClient #Verbindung mit mongoDB
import datetime
class TutorialPipeline(object):
def __init__(self, mongo_uri, mongo_db, mongolab_user, mongolab_pass):
#Variableninitialisierung mit den beim Erstellen der Instanz übergebenen Argumenten
self.mongo_uri = mongo_uri
self.mongo_db = mongo_db
self.mongolab_user = mongolab_user
self.mongolab_pass = mongolab_pass
@classmethod #Sie können auf Klassenvariablen zugreifen, da das Argument eine Klasse enthält
def from_crawler(cls, crawler):
return cls(
mongo_uri=crawler.settings.get('MONGO_URI'), # settings.Zugriffsvariablen definiert durch py
mongo_db=crawler.settings.get('MONGO_DATABASE', 'items'),
mongolab_user=crawler.settings.get('MONGOLAB_USER'),
mongolab_pass=crawler.settings.get('MONGOLAB_PASS')
) # def __init__Werden Sie ein Argument von
def open_spider(self, spider): #Wird ausgeführt, wenn die Spinne startet. Datenbankverbindung
self.client = MongoClient(self.mongo_uri)
self.db = self.client[self.mongo_db]
self.db.authenticate(self.mongolab_user, self.mongolab_pass)
def close_spider(self, spider): #Am Ende der Spinne ausgeführt. Datenbankverbindung schließen
self.client.close()
def process_item(self, item, spider):
self.db[self.collection_name].update(
{u'link': item['link']},
{"$set": dict(item)},
upsert = True
) #Nach Link suchen, neu erstellen, wenn nicht, aktualisieren, wenn
return item
Ich habe viel geschrieben, aber der Punkt ist, dass ich einfach die Datenbank öffne, die Daten stochere und sie schließe, wenn ich fertig bin.
settings.py Definieren Sie zunächst die verschiedenen Variablen, die Sie in pipelines.py aufrufen.
settings.py
MONGO_URI = 'hogehoge.mongolab.com:(Port-Nummer)'
MONGO_DATABASE = 'database_name'
MONGOLAB_USER = 'user_name'
MONGOLAB_PASS = 'password'
Dies ist ein Beispiel für Mongolab. Geben Sie in settings.py zusätzlich das Verhalten an.
settings.py
REDIRECT_MAX_TIMES = 6
RETRY_ENABLED = False
DOWNLOAD_DELAY=10
COOKIES_ENABLED=False
Hier ist die maximale Anzahl von Weiterleitungen auf 6 festgelegt, sodass keine erneuten Versuche ausgeführt werden, der Zugriff auf die Website alle 10 Sekunden festgelegt wird und keine Cookies gespeichert werden. Wenn Sie nicht "DOWNLOAD_DELAY" angeben, greifen Sie mit voller Leistung zu, was den Zielstandort stark belastet. Lass uns anhalten.
Lass es uns laufen.
commandline
$ scrapy crawl WebspiderSpider
Wir werden den Links nacheinander folgen und Daten werden aus den Links extrahiert, die die Bedingungen erfüllen.
Recommended Posts