2017-04-14 7 views
0

Ich habe eine Scrapy Spinne, die die start_urls aus einer MySQL-Datenbank bekommt. Wenn es jede Seite abkratzt, kommt es mit einer unbekannten Anzahl von Links zurück, was bedeutet, dass es null Links oder bis zu 10 Links von jeder Seite, die es kratzt, haben kann. Da diese Nummer unbekannt ist, weiß ich nicht, wie die Pipeline am besten mit allen möglichen Scraped-Links aktualisiert werden soll. Stattdessen lasse ich die start_url und den Scraped-Link auf eine neue Datenbank ablegen. Wenn ich jedoch eine neue Datenbank verwende, möchte ich einen Suchbegriff-Spaltenwert für jede start_url in der neuen Datenbank bringen.Scrapy Pipeline unbekannte Anzahl von Ergebnissen

Wenn ich die Searchterm-Spalte für jede start_url abrufen könnte, könnte ich es in die neue Datenbank pipen oder wenn jemand eine andere Idee haben würde, wie die ursprüngliche Datenbank mit einer unbekannten Menge von verkratzten Links aktualisieren könnte arbeite auch.

Hier ist die spider.py. Ich habe die beanstandeten Zeilen auskommentiert

import scrapy 
import MySQLdb 
import MySQLdb.cursors 
from scrapy.http.request import Request 

from youtubephase2.items import Youtubephase2Item 

class youtubephase2(scrapy.Spider): 
    name = 'youtubephase2' 

    def start_requests(self): 
     conn = MySQLdb.connect(user='uname', passwd='password', db='YouTubeScrape', host='localhost', charset="utf8", use_unicode=True) 
     cursor = conn.cursor() 
     cursor.execute('SELECT * FROM SearchResults;') 
     rows = cursor.fetchall() 

     for row in rows: 
      if row: 
       #yield Request(row[0], self.parse, meta=dict(searchterm=row[0])) 
       yield Request(row[1], self.parse, meta=dict(start_url=row[1])) 
     cursor.close() 

    def parse(self, response): 
     for sel in response.xpath('//a[contains(@class, "yt-uix-servicelink")]'): 
      item = Youtubephase2Item() 
      #item['searchterm'] = response.meta['searchterm'] 
      item['start_url'] = response.meta['start_url'] 
      item['affiliateurl'] = sel.xpath('@href').extract_first() 
      yield item 

Antwort

0

Ich bin mir nicht sicher, ob ich Sie richtig verstehe, aber Sie können mehrere Elemente in Meta tragen.

Vorausgesetzt, dass Sie in dieser Tabelle haben:

# table1 
ID|URLS  | NAME  | ADDRESS | 
0 |foo.com | foo  | foo 1  | 
1 |bar.com | bar  | bar 1  | 

Yield Anfrage für jede Zeile und analysieren Ausbeute so viele Elemente, die Sie in eine neue Tabelle wollen:

def start_requests(self): 
    rows = ... 
    for row in rows: 
     url = row[1] 
     yield Request(url, meta={'row' row}) 

def parse(self, response): 
    links = ... 
    row = response.meta['row'] 
    for link in links: 
     item = dict() 
     item['urls'] = row[1] 
     item['name'] = row[2] 
     item['address'] = row[3] 
     # add some stuff... 
     item['link'] = link 
     yield item 

Und alle Einzelteile zu Datenbank speichern und Sie Am Ende:

# table2 
ID|URLS  | NAME  | ADDRESS | LINK  | 
0 |foo.com | foo  | foo 1  | link1 | 
1 |foo.com | foo  | foo 1  | link2 | 
2 |foo.com | foo  | foo 1  | link3 | 
3 |bar.com | bar  | bar 1  | link1 | 
4 |bar.com | bar  | bar 1  | link2 | 
5 |bar.com | bar  | bar 1  | link3 | 
+0

Mit Ihrer Logik konnte ich herausfinden, dass ich meine Meta-Zeile ändern konnte von: Ausbeute Request (row [1], self.parse, meta = dict (START_URL = row [1])) zu: Ausbeute Request (row [1], self.parse, meta = dict (= START_URL Zeile [1], Suchbegriff = Zeile [0])) und bekomme das andere Feld, das ich wollte. Danke für die Hilfe. – SDailey

Verwandte Themen