cor*_*org 5 python signals web-crawler scrapy
我使用scrapy编写了一个蜘蛛,它将一大堆HtmlXPathSelector请求分离到各个站点.在每个请求(异步)满足后,它会在.csv文件中创建一行数据.不可能看到最后满足哪个请求,因为如果还没有提取数据则重复请求(偶尔会错过几次数据).即使我从一个整洁的列表开始,输出也是混乱的,因为在提取数据后立即写入行.
现在我想基于一列对该列表进行排序,但是在每个请求完成之后.'spider_closed'信号可以用来触发真正的功能吗?如下所示,我尝试将信号与调度程序连接,但这个函数似乎只打印出来的东西,而不是使用变量甚至调用其他函数.
def start_requests(self)
... dispatcher.connect(self.spider_closed, signal=signals.engine_stopped) ....
def spider_closed(spider):
print 'this gets printed alright' # <-only if the next line is omitted...
out = self.AnotherFunction(in) # <-This doesn't seem to run
Run Code Online (Sandbox Code Playgroud)
我拼凑了一个管道来为您解决这个问题。
文件:Project.middleware_module.SortedCSVPipeline
import csv
from scrapy import signals
class SortedCSVPipeline(object):
def __init__(self):
self.items = []
self.file_name = r'YOUR_FILE_PATH_HERE'
self.key = 'YOUR_KEY_HERE'
@classmethod
def from_crawler(cls, crawler):
pipeline = cls()
crawler.signals.connect(pipeline.spider_closed, signals.spider_closed)
return pipeline
def spider_closed(self, spider):
for item in sorted(self.items, key=lambda k: k[self.key]):
self.write_to_csv(item)
def process_item(self, item, spider):
self.items.append(item)
return item
def write_to_csv(self, item):
writer = csv.writer(open(self.file_name, 'a'), lineterminator='\n')
writer.writerow([item[key] for key in item.keys()])
Run Code Online (Sandbox Code Playgroud)
文件:设置.py
ITEM_PIPELINES = {"Project.middleware_module.SortedCSVPipeline.SortedCSVPipeline" : 1000}
Run Code Online (Sandbox Code Playgroud)
运行此程序时,您将不再需要使用项目导出器,因为该管道将为您执行 csv 写入操作。此外,您设置中的管道条目中的 1000 需要比您要在此之前运行的所有其他管道更高的值。我在我的项目中对此进行了测试,结果生成了一个按我指定的列排序的 csv 文件!华泰
干杯
| 归档时间: |
|
| 查看次数: |
882 次 |
| 最近记录: |