2017-04-14 73 views
0

我有一個scrapy蜘蛛,它從MySQL數據庫獲取start_urls。當它刮擦每個頁面時,它會返回未知數量的鏈接,這意味着它可能具有零個鏈接或每個頁面最多可鏈接10個鏈接。因爲這個數字是未知的,我不知道如何最好讓管道更新數據庫與所有可能的刮傷的鏈接,所以我倒是將start_url和scraped鏈接轉儲到一個新的數據庫。但是,如果我正在使用新的數據庫,我想將每個start_url的searchterm列值引入新數據庫。Scrapy Pipeline未知數量的結果

如果我可以爲每個start_url獲取searchterm列,那麼我可以將其傳入新數據庫,或者如果有人對如何使用未知數量的scraped鏈接更新原始數據庫有不同的想法,那可能會工作也是如此。

這是spider.py。我已將有問題的線路註釋掉

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 

回答

0

我不確定我是否正確理解您,但您可以在meta中執行多個項目。

假設你有這樣的表:

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

的每一行產量要求,並儘可能多的項目要一個新的表剖析產量:

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 

,並保存所有項目的數據庫和你將結束:

# 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

使用你的邏輯我能夠弄清楚,我可以改變我的meta行: 收率請求(行[1],self.parse,元=字典(START_URL =行[1])) 到: 收率請求(行[1],self.parse,元=字典(START_URL = row [1],searchterm = row [0])) 並獲得我想要的其他字段。謝謝您的幫助。 – SDailey