Scrapy Pipeline 未知数量的结果

Scrapy Pipeline unknown number of results

我有一个 scrapy 蜘蛛,它从 MySQL 数据库中获取 start_urls。当它抓取每个页面时,它会返回未知数量的 links,这意味着它可以从它抓取的每个页面中获得零个 links 或最多 10 个 links。因为这个数字是未知的,所以我不知道如何最好地让管道用所有可能被刮掉的 link 更新数据库,所以我让它转储 start_url 并被刮掉 link 到一个新的数据库。但是,如果我使用的是新数据库,我想将每个 start_url 的 searchterm 列值带入新数据库。

如果我可以获取每个 start_url 的 searchterm 列,我可以将其通过管道传输到新数据库中,或者如果有人对如何使用未知数量的更新原始数据库有不同的想法刮了 links,这也可以。

这里是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

我不确定我是否理解正确,但你可以在 meta 中携带多个项目。

假设你有这个 table:

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

每一行的 Yield 请求和解析 yield 你想要的新项目 table:

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    |