Scrapy - 删除重复项并将数据输出为单个列表?
Scrapy - remove duplicates and output data as a single list?
我正在使用下面的代码在一个页面上抓取多个 link 并从每个对应的 link 中获取数据列表:
import scrapy
class testSpider(scrapy.Spider):
name = "quotes"
start_urls = ['http://www.website.com']
def parse(self, response):
urls = response.css('div.subject_wrapper > a::attr(href)').extract()
for url in urls:
url = response.urljoin(url)
yield scrapy.Request(url=url, callback=self.getData)
def getData(self, response):
data = {'data': response.css('strong.data::text').extract()}
yield data
它工作正常,但由于它返回每个 link 的数据列表,当我输出到 CSV 时,它看起来如下所示:
"dalegribel,Chad,Ninoovcov,dalegribel,Gotenks,sillydog22"
"kaylachic,jmargerum,kaylachic"
"Kempodancer,doctordbrew,Gotenks,dalegribel"
"Gotenks,dalegribel,jmargerum"
...
有没有什么simple/efficient方法可以将数据输出为单个行列表,不重复(相同的数据可以出现在多个页面上),类似于下面?
dalegribel
Chad
Ninoovcov
Gotenks
...
我试过使用一个数组然后遍历每个元素来获得输出,但是得到一个错误说 yield 只支持 'Request, BaseItem, dict or None'。另外,正如我 运行 这超过大约 10k 个条目,我不确定将数据存储在数组中是否会减慢抓取速度。谢谢
不确定是否可以使用 Scrapy 内置方法以某种方式完成,但 python 方法是创建一组独特的元素,检查重复项,并仅生成独特的元素:
class testSpider(scrapy.Spider):
name = "quotes"
start_urls = ['http://www.website.com']
unique_data = set()
def parse(self, response):
urls = response.css('div.subject_wrapper > a::attr(href)').extract()
for url in urls:
url = response.urljoin(url)
yield scrapy.Request(url=url, callback=self.getData)
def getData(self, response):
data_list = response.css('strong.data::text').extract()
for elem in data_list:
if elem and (elem not in self.unique_data):
self.unique_data.add(elem)
yield {'data': elem}
我正在使用下面的代码在一个页面上抓取多个 link 并从每个对应的 link 中获取数据列表:
import scrapy
class testSpider(scrapy.Spider):
name = "quotes"
start_urls = ['http://www.website.com']
def parse(self, response):
urls = response.css('div.subject_wrapper > a::attr(href)').extract()
for url in urls:
url = response.urljoin(url)
yield scrapy.Request(url=url, callback=self.getData)
def getData(self, response):
data = {'data': response.css('strong.data::text').extract()}
yield data
它工作正常,但由于它返回每个 link 的数据列表,当我输出到 CSV 时,它看起来如下所示:
"dalegribel,Chad,Ninoovcov,dalegribel,Gotenks,sillydog22"
"kaylachic,jmargerum,kaylachic"
"Kempodancer,doctordbrew,Gotenks,dalegribel"
"Gotenks,dalegribel,jmargerum"
...
有没有什么simple/efficient方法可以将数据输出为单个行列表,不重复(相同的数据可以出现在多个页面上),类似于下面?
dalegribel
Chad
Ninoovcov
Gotenks
...
我试过使用一个数组然后遍历每个元素来获得输出,但是得到一个错误说 yield 只支持 'Request, BaseItem, dict or None'。另外,正如我 运行 这超过大约 10k 个条目,我不确定将数据存储在数组中是否会减慢抓取速度。谢谢
不确定是否可以使用 Scrapy 内置方法以某种方式完成,但 python 方法是创建一组独特的元素,检查重复项,并仅生成独特的元素:
class testSpider(scrapy.Spider):
name = "quotes"
start_urls = ['http://www.website.com']
unique_data = set()
def parse(self, response):
urls = response.css('div.subject_wrapper > a::attr(href)').extract()
for url in urls:
url = response.urljoin(url)
yield scrapy.Request(url=url, callback=self.getData)
def getData(self, response):
data_list = response.css('strong.data::text').extract()
for elem in data_list:
if elem and (elem not in self.unique_data):
self.unique_data.add(elem)
yield {'data': elem}