Python 使用start_url(不带meta)将额外值传递给Scrapy spider
我从一个蜘蛛身上抓取了一些东西,我正在写另一个蜘蛛,它使用搜索引擎来填充一些缺失的数据。我想有项目从第一蜘蛛更新,一行一行 但是,我不知道如何从uu init_u方法传递当前行或启动url 我知道我可以将meta中的request.url传递给子请求,然后解析meta以提取公司名称,但这看起来很尴尬Python 使用start_url(不带meta)将额外值传递给Scrapy spider,python,web-scraping,scrapy,Python,Web Scraping,Scrapy,我从一个蜘蛛身上抓取了一些东西,我正在写另一个蜘蛛,它使用搜索引擎来填充一些缺失的数据。我想有项目从第一蜘蛛更新,一行一行 但是,我不知道如何从uu init_u方法传递当前行或启动url 我知道我可以将meta中的request.url传递给子请求,然后解析meta以提取公司名称,但这看起来很尴尬 class DuckDuckGoComSpider(scrapy.Spider): name = 'duckduckgo.com' def __init__(self, csv_f
class DuckDuckGoComSpider(scrapy.Spider):
name = 'duckduckgo.com'
def __init__(self, csv_file_path, *args, **kwargs):
self.csv_file_path = csv_file_path
super(DuckDuckGoComSpider, self).__init__(*args, **kwargs)
with open(csv_file_path, newline='') as csvfile:
for row in csv.DictReader(csvfile):
self.start_urls.append(
f'https://duckduckgo.com/html/?q="website" {row["name"]} {row["location"]}')
def parse(self, response):
results = list(response.css('.result__url::attr(href)'))
if len(results) > 0:
for i in range(6):
yield response.follow(results[i], callback=self.parse_item)
else:
self.logger.debug('No more products')
def parse_item(self, response):
il = DDGItemLoader(response=response)
il.add_value('url', response.url)
il.add_css('title', 'meta[property="og:title"]::attr(content)')
il.add_css('description',
'meta[property="og:description"]::attr(content)')
item = il.load_item()
yield item
有几种方法可以将值传递给解析方法,如casper所述:
start_requests()
中编写请求,并在meta
meta
如下所示:
class DuckDuckGoComBatchSpider(scrapy.Spider):
name = 'duckduckgo_batch.com'
def __init__(self, csv_file_path, *args, **kwargs):
self.csv_file_path = csv_file_path
super(DuckDuckGoComBatchSpider, self).__init__(*args, **kwargs)
def start_requests(self):
pages = []
with open(self.csv_file_path, newline='') as csvfile:
reader = csv.DictReader(csvfile)
self.fieldnames = reader.fieldnames
for row in reader:
url = f'https://duckduckgo.com/html/?q="website" {row["name"]} {row["location"]}'
meta = {}
for f in reader.fieldnames:
meta[f] = row[f]
page = scrapy.Request(url, callback=self.parse, meta=meta)
pages.append(page)
return pages
def parse(self, response):
results = list(response.css('.result__url::attr(href)'))
if len(results) > 0:
yield response.follow(results[0], callback=self.parse_item,
meta=response.meta)
else:
self.logger.debug('No more products')
def parse_item(self, response):
il = DDGItemLoader(response=response)
il.add_value('website', response.url)
il.add_css('website_title', 'meta[property="og:title"]::attr(content)')
il.add_css('website_description',
'meta[property="og:description"]::attr(content)')
il.add_value('name', response.meta["name"])
item = il.load_item()
for key in response.meta:
if key in self.fieldnames:
item[key] = response.meta[key]
yield item
您可能需要查看该函数。这将允许您自己创建请求,并选择在元数据中发送附加数据(我会这样做),或者创建一个字典,并在
parse_item
函数中查找数据。