2017-04-14 75 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