我有一个scrapy蜘蛛从MySQL数据库中获取start_urls。当它刮擦每个页面时,它会返回一个未知数量的链接,这意味着它可以有零链接或每个页面最多10个链接。因为这个数字是未知的,所以我不知道如何最好地让管道用所有可能的被删除链接更新数据库,所以我把它转储到新数据库的start_url和scraped链接。但是,如果我使用新数据库,我想将每个start_url的searchterm列值带入新数据库。
如果我可以获取每个start_url的searchterm列,我可以将其输入到新数据库中,或者如果有人对如何使用未知数量的已删除链接更新原始数据库有不同的想法,那可能会有效同样。
这是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 :(得分:0)
我不确定我是否理解正确,但您可以在meta中携带多个项目。
假设您有此表:
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 |
并将所有项目保存到数据库中,您最终会得到:
enableHighAccuracy