Scrapy Link folgen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
evev
User
Beiträge: 27
Registriert: Dienstag 4. April 2017, 12:50

Hallo,
wie der Titel schon sagt, habe ich ein Problem mit dem folgen der links auf einer Webseite mit Hilfe von Scrapy.
Habe mir schon unzählige Beispiele angeschaut, nur hat alles nicht geholfen, daher nun meine Frage, wie der Codeschnipsel abgeändert werden muss,
um die Inhalte aus dem Links zu ziehen.
Dabei sind innerhalb der verschiedenen container einzelne Links hinterlegt, die er öffnen soll um die Informationen zu speichern.

Code: Alles auswählen

class FischSpider(scrapy.Spider):
    name = 'fish'
    start_urls = ['http://fischausnorwegen.de/Fischschule/Fischlexikon/']

    def parse (self, response):
        fishs = response.xpath('//div[@class = "recipe-teaser"]')

        for fish in fishs:
            name = fish.xpath('h3/a/text()').extract_first()
            text =  fish.xpath('p/text()').extract()
            Titel = fish.xpath('//div[@class = "article"]/h2')
            Text2 =fish.xpath('//div[@class = "article"]/p')
            relative_url = fish.xpath('h3/a/@href').extract_first()
            absolute_url = response.urljoin(relative_url)
            yield{'Name':name,'Beschreibung':text,'URL':relative_url,'URL2': absolute_url,'Titel':Titel,'Text':Text2}

        next_page = fish.xpath('h3/a/@href').extract_first()

        if next_page is not None:

        #next_page = respone.xpath('h3/a/@href').extract_first()
        #next_page = response.urljoin(next_page)
            yield response.follow(next_page, callback = self.parse)
Die Url http://fischausnorwegen.de/Fischschule/Fischlexikon/.
Vielleicht weiß einer Rat.
Zuletzt geändert von Anonymous am Montag 29. Mai 2017, 22:39, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Melewo
User
Beiträge: 320
Registriert: Mittwoch 3. Mai 2017, 16:30

Und die Seite gehört Dir oder möchtest Du Dich nur bei dieser bedienen?
Könnte ähnlich aussehen, bin mir nicht sicher. Falls ja, dann halt hochzählen.

Code: Alles auswählen

fish.xpath("//h3/a")[0]
evev
User
Beiträge: 27
Registriert: Dienstag 4. April 2017, 12:50

@ Melewo, nein die Seite ist nur zum üben gedacht, die gehört mir nicht.

Code: Alles auswählen

fish.xpath("//h3/a")[0]
Der Output bleib dadurch der selbe. Der Link wird zwar erkannt nur öffnet er ihn nicht.
Melewo
User
Beiträge: 320
Registriert: Mittwoch 3. Mai 2017, 16:30

evev hat geschrieben:Der Link wird zwar erkannt nur öffnet er ihn nicht.
Was denn öffnen?
Ein Scraper ist doch nicht dafür gedacht, dass der irgendwelche Aktionen ausführt, sondern nur um den Content aus einer Seite auszulesen. Unter anderem könntest Du den für Magazine benutzen, die keine Feeds anbieten, um die neusten Schlagzeilen zu lesen. Und dann noch für einige Dinge im Graubereich, doch das ist eine andere Seite.
Melewo
User
Beiträge: 320
Registriert: Mittwoch 3. Mai 2017, 16:30

Gut, vielleicht ließe sich auch ein Crawler daraus machen, doch dafür sollte man sich dann eine eigene Test-Domain anlegen und keine fremde benutzen. Mit Python habe ich zu wenig Erfahrung, doch vom Prinzip müsste dann jeder gefundener Link wieder in eine Liste oder Tupel gespeichert werden und zu den gespeicherten URLs dann Anfragen gesendet werden. Keine Ahnung, was dieses Modul alles ermöglicht. Du kannst Dich aber dabei auch nicht nur auf so ein Modul verlassen.
BlackJack

@Melewo: Scrapy ist ein Modul/Rahmenwerk um Spider/Crawler/Bots/… zu programmieren. Da sollte man sich also schon drauf verlassen können wenn man so etwas programmieren will, sonst könnte man die Funktionalität ja gleich komplett selber schreiben. In dem Beispiel aus dem ersten Beitrag steht ja auch ein `follow()`-Aufruf auf dem `response`-Objekt, der der angegebenen URL dann folgen sollte.
Melewo
User
Beiträge: 320
Registriert: Mittwoch 3. Mai 2017, 16:30

Gut, das war dann mein Denkfehler.
evev
User
Beiträge: 27
Registriert: Dienstag 4. April 2017, 12:50

Nach einer weiteren langen Suche und vielen gescheiterten versuchen, hat es nun doch funktioniert.
Geholfen hat mir dabei ein post auf stackoverflow genau genommen dieser hier: https://stackoverflow.com/questions/301 ... llect-data

Anscheinend war es mit dem anderem bsp nicht möglich, die generierte Liste, in einzelne Urls zu verpacken. Er hatte m.m.n immer versucht, alle mit einmal als weiterführende URL zu verwenden. Daher wahrscheinlich auch diese Fehlermeldung.

Code: Alles auswählen

2017-05-31 18:16:42 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://fischausnorwegen.de/Fischschule/Fischlexikon/> (referer: None)
2017-05-31 18:16:42 [scrapy.core.scraper] ERROR: Spider error processing <GET http://fischausnorwegen.de/Fischschule/Fischlexikon/> (referer: None)
Code:

Code: Alles auswählen

import scrapy
from scrapy.crawler import CrawlerProcess


#
class DmozItem(scrapy.Item):
    link = scrapy.Field()
    attr = scrapy.Field()
    text =scrapy.Field()

class FischSpider(scrapy.Spider):

    name = 'fish'
    start_urls = ['http://fischausnorwegen.de/Fischschule/Fischlexikon/']
    BASE_URL = 'http://fischausnorwegen.de'

    def parse (self, response):

        links = response.xpath('//div[@class = "recipe-teaser"]/a/@href').extract()
        for link in links:
            absolute_url = self.BASE_URL+link
            yield scrapy.Request(absolute_url, callback = self.parse_attr)

    def parse_attr(self,response):

            item = DmozItem()
            item["link"] = response.url
            item["attr"] = "".join(response.xpath('//div[@class ="article"]//text()').extract())
            return item
            
# runs script... no need to use..scrapy runspider fish_spider.py -o fish_3.csv.. in powershell

if __name__ == "__main__":
    process = CrawlerProcess({
        'USER_AGENT': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)',
        'FEED_FORMAT': 'csv',
        'FEED_URI': 'fish_3.csv'
    })

    process.crawl(FischSpider)
    process.start() # the script will block here until the crawling is finished
mfg evev

Edit: Wraum steht unten immer Bing[Bot], Yahoo[Bot], Google[Bot]? greift dann die jeweilige Suchmaschine auf das Forum zu?
Zuletzt geändert von Anonymous am Mittwoch 31. Mai 2017, 18:31, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Antworten