2017-05-27 2 views
0

Diese Spinne zieht Titel aus den Funny subreddit Seiten. Ich denke, das Problem könnte mit der erlaubten URL sein, da die/funny home page nicht mit dieser übereinstimmt. Wenn ich "/ r/funny /" zur erlaubten Liste hinzufüge, wird es zu wild und kriecht zu viel. Auch nicht sicher, was den ersten Punktes von jeder Seite zu machen, falsch zu sein (kann der letzte Punkt auf der vorherige Seite manchmal sein.Scrapy Spider sammelt nicht die erste Seite von Daten und erste Artikel auf jeder Seite möglicherweise nicht richtig

from scrapy.spiders import CrawlSpider, Rule 
from scrapy.linkextractors import LinkExtractor 
from scrapy.http.response import Response 

class Lesson1Spider(CrawlSpider): 
    name = 'lesson1' 
    allowed_domains = ['www.reddit.com'] 
    start_urls = ['http://www.reddit.com/r/funny/'] 

    rules = [ 
     Rule(LinkExtractor(
      allow=['/r/funny/\?count=\d*&after=\w*',]), 
      callback='parse_item', 
      follow=True), 
    ] 

    def parse_item (self, response): 
     print(response.xpath('//p[@class="title"]/a/text()').extract()) 

Antwort

0

Zum ersten Teil Ihrer Frage, es sieht aus wie die Regel ist Ihre Start-uRL im Widerspruch zu der ersten Seite -. http://www.reddit.com/r/funny/ - hat nicht /r/funny/\?count=\d*&after=\w*, so kann es das Überspringen es eine nächste Seite mit den prev/next Tasten am unteren Rand jeder Seite angeben können Sie bessere Ergebnisse geben

.. Was den zweiten Teil anbelangt, kann es sein, dass Rankings sich zwischen dem Scrappen und der Überprüfung ändern, oder dass etwas im Quellcode ist (haben andere Elemente th e Klassentitel?), die Sie nicht berücksichtigen.

+0

ja. ich stimme zu. Die Regel basiert auf der nächsten Schaltfläche am unteren Rand der Seite. Ich gehe davon aus, dass die Startseite nicht gelesen wird (weil sie der Regel nicht folgt. Ich denke, ich brauche eine Ergänzung zu der Regel, die besagt "akzeptiere immer die erste Seite und gehe dann nach der bestehenden Regel. –

+0

Du kann auch eine neue Anfrage für die nächste Seite "ergeben", siehe den Abschnitt "Folgender Link" im [Scrapy Tutorial] (https://doc.scrapy.org/en/latest/intro/tutorial.html). – FiscalTwinkie

+0

(Bitte akzeptieren Sie diese Antwort auch, wenn Sie Ihr Problem gelöst haben) – FiscalTwinkie

0

Die beste Lösung, die ich finden konnte, war, zwei unabhängige Spider in derselben Datei auszuführen. Eine für die erste Seite und eine für die zweite Seite. Dies ist vielleicht nicht der effizienteste Code, aber da ich neu bin, bin ich froh, dass alle Komponenten funktionieren. Vorschläge zur Reinigung wären willkommen.

import scrapy 
from scrapy.crawler import CrawlerProcess 
from scrapy.spiders import CrawlSpider, Rule 
from scrapy.linkextractors import LinkExtractor 
from scrapy.http.response import Response 
import csv 
import sys 

print("Which subreddit do you want to scrape?") 
subreddit = sys.stdin.readline() 
subreddit = subreddit.strip() 

class Lesson1Spider(scrapy.Spider): 
    name = "lesson1" 
    allowed_domains = ['www.reddit.com'] 
    start_urls = ['http://www.reddit.com/r/%s/' % subreddit] 

    def parse(self, response): 
     SET_SELECTOR = '//p[@class="title"]/a/text()' 
     with open('redditscan8.csv', 'a', encoding='utf-8') as csvfile: 
      kelly = csv.writer(csvfile, dialect ='excel') 

kelly.writerow(response.xpath('//p[@class="title"]/a/text()').extract()) 


class Lesson2Spider(CrawlSpider): 
    name = 'lesson1x' 
    allowed_domains = ['www.reddit.com'] 
    start_urls = ['http://www.reddit.com/r/%s/' % subreddit] 

    rules = [ 
     Rule(LinkExtractor(
      allow=['/r/%s/\?count=\d*&after=\w*' % subreddit, ]), 
      callback='parse_item', 
      follow=True), 
    ] 

    def parse_item(self, response): 
     with open('redditscan8.csv', 'a', encoding='utf-8') as csvfile: 
      joe = csv.writer(csvfile, dialect ='excel') 

joe.writerow(response.xpath('//p[@class="title"]/a/text()').extract()) 

process = CrawlerProcess() 
process.crawl(Lesson1Spider) 
process.crawl(Lesson2Spider) 
process.start() 
+0

[Scrapy tutorial] (https://doc.scrapy.org/en/latest/intro/tutorial.html), um eine nächste Seite zu erhalten: Das folgende Beispiel: 'next_page = response.css ('li.next a :: attr (href) '). extract_first() wenn next_page nicht ist None: next_page = response.urljoin (next_page) Ausbeute scrapy.Request (next_page, callback = self.parse) ' – FiscalTwinkie

Verwandte Themen