Mit Scrapy Webseiten crawlen

Ein kleines How To, wie man mit scrapy Daten von Webseiten sammeln (crawlen) kann.

Ich mach das auf einem Debian Bullseye System mit dem root User. Also Linux.
Natürlich kann ein normaler User, wenn scrapy bereits installiert ist, auch genutzt werden.

 

In dem Beispiel crawle ich ein einzelnes Video von Xhamster. Der Grund ist, das Xhamster, scrapy nicht ablehnt in der robots.txt und die auch sonst kein Problem mit dem scrapen und dem Einbinden von deren Videos in andere Webseiten haben.

Youtube hingegen ist da empfindlicher und z. B. ein Kanal lässt sich mit so einem einfachen Skript nicht scrapen. Evtl. lehnt Youtube auch in der robots.txt den Bot ab. Es gäbe eine Einstellung, wie man die robots.txt ignorieren kann. Aber da ist nicht anzuraten. Youtube und die meisten anderen Webseiten, würden dann die IP blockieren.
Wo diese Einstellung ist, erkläre ich am Ende.

 

Erstmal installiert man scrapy mit pip.

pip install scrapy

 

Danach ein Verzeichnis anlegen, in dem die scrapy Projekte liegen sollen.

mkdir /scrapy

Der Befehl um ein Projekt anzulegen ist:

cd /scrapy scrapy startprojekt xhamster

Das dauert ein paar Sekunden sollte dann sowas ausgeben:

New Scrapy project 'xhamster', using template directory '/usr/local/lib/python3.9/dist-packages/scrapy/templates/project', created in:     /scrapy/xhamster  You can start your first spider with:     cd xhamster     scrapy genspider example example.com

Das Python Skript zum crawlen lege ich nun manuell an und gehe dazu gleich in das Verzeichnis.

cd /scrapy/xhamster/xhamster/spiders

Ich benutze vi als Editor:

vi xhamster.py

Ich möchte nun die URL, den Titel und die Beschreibung crawlen.

Inhalt sieht dann so aus:

from scrapy.spiders import CrawlSpider, Rule from scrapy.linkextractors.lxmlhtml import LxmlLinkExtractor from scrapy.selector import Selector from scrapy.item import Item, Field from scrapy.exporters import CsvItemExporter  class myItem(Item):     title = Field()     url = Field()     meta = Field()  class MySpider(CrawlSpider):   name = "youtube"   allowed_domains   = ["de.xhamster.com"]   start_urls = ["https://de.xhamster.com/videos/shan-xhrlCh9"]   rules = (Rule(LxmlLinkExtractor(allow=('de.xhamster.com/videos/shan-xhrlCh9')), callback='parse_obj', follow=True),)    def parse_obj(self,response):               item = myItem()               item['url'] = []               item['title'] = []               for link in LxmlLinkExtractor(allow=(),deny = self.allowed_domains).extract_links(response):                   item['url'].append(link.url)                   hxs = Selector(response)                   item['title'] = hxs.xpath('//title/text()').extract()                   item['url'] = response.url                   item['meta'] = hxs.xpath('//meta[@name=\'description\']/@content').extract()                   return item

Das war es grundlegend auch schon.
Scrapy startet man zum Beispiel mit diesem Befehl:

cd /scrapy/xhamster/xhamster/spiders /usr/local/bin/scrapy crawl xhamster -o xhamster.xml -s JOBDIR=/scrapy/xhamster/xhamster/spiders/jobdir/

Ich benutze gerne XML als Output. Es gäbe auch die Möglichkeit den Output in eine JSON oder CSV Datei auszugeben. Alle Formate findet ihr hier.

Der Output in der XML Datei sieht so aus: (Info: habe bestimmte Wörter durch Pünktchen ersetzt)

<?xml version="1.0" encoding="utf-8"?>
<items>
<item><url>https://de.xhamster.com/videos/shan-xhrlCh9</url><title><value>Shan: Non Nude &amp; Posing HD Po.. Video 7c - xHamster de</value></title><meta><value>Schaue Shan auf xHamster.com! xHamster ist der beste Se. Kanal um freies Po... zu erhalten!</value></meta></item>

Meta wäre die Beschreibung des Videos. Title der Titel und die URL ist selbsterklärend.

 

Nun kann man die Daten weiterverarbeiten.

Zum Beispiel die URL ändern um sie einbetten zu können und die Daten in eine Datenbank hinzuzufügen.

Beispiel:

cat xhamster.xml |grep "<item>" | sed -e 's/https:\/\/de.xhamster.com\/videos\/shan-/https:\/\/xhamster.com\/embed\//g' -e 's/<item><url>//g' -e 's/<\/url><title><value>/\t/g' -e 's/<\/value><\/title><meta><value>/\t/g' -e 's/<\/value><\/meta><\/item>//g' -e s/\'//g | while IFS=

In xhamster.sql steht dann:


insert into tabelle (url,titel,beschreibung) values ('https://xhamster.com/embed/xhrlCh9','Shan: Non Nude & Posing HD Po.. Video 7c - xHamster de','Schaue Shan auf xHamster.com! xHamster ist der beste Se. Kanal um freies Po... zu erhalten!');

Zurück zu robots.txt

In der Datei

/scrapy/xhamster/xhamster/settings.py

kann man diverse Einstellungen vornehmen.
Wenn man die robots.txt ignorieren möchte setzt man diesen Parameter:

ROBOTSTXT_OBEY = False

Man kann auch den User Agent ändern. Ich empfehle einen eigenen Agent-Namen zu verwenden. So wissen die Webseitenbetreiber wer hier scrawled und können entsprechend darauf reagieren, ob sie das zulassen möchten oder nicht.

USER_AGENT = 'scrapy (+http://hummel-web.at)'

Die komplette Dokumentation zu scrapy findet man auf https://docs.scrapy.org/en/latest/

 

{jcomments on}

\t' read aa bb cc ; do echo "insert into tabelle (url,titel,beschreibung) values ('$aa','$bb','$cc');"; done > xhamster.sql
In xhamster.sql steht dann:

Zurück zu robots.txt

In der Datei

kann man diverse Einstellungen vornehmen.
Wenn man die robots.txt ignorieren möchte setzt man diesen Parameter:

Man kann auch den User Agent ändern. Ich empfehle einen eigenen Agent-Namen zu verwenden. So wissen die Webseitenbetreiber wer hier scrawled und können entsprechend darauf reagieren, ob sie das zulassen möchten oder nicht.

Die komplette Dokumentation zu scrapy findet man auf https://docs.scrapy.org/en/latest/

 

{jcomments on}

Kommentar verfassen

Christian Hummel