我正在构建一些Spider来进行网络抓取,并试图在开始构建它们之前弄清楚我的代码是否正确。蜘蛛程序将同时通过crontab运行,尽管它们各自写入一个单独的文件。
with open(item['store_name']+'price_list2.csv', mode='a', newline ='') as price_list2:
savepriceurl2 = csv.writer(price_list2, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL)
savepriceurl2.writerow([item['url']]+item['price'])
我不确定代码的“以price_list2打开”或“ savepriceurl2 = csv.writer”部分如何工作,并且即使它们使用相同的名称(即使对于不同的csv文件),蜘蛛也会混淆吗? ,如果它们都同时运行?
答案 0 :(得分:0)
从发布的最少代码中很难说出两个是否存在问题。假设您发布的代码将在对象的每个实例中运行(我假设),那么它们将写入要剪贴的任何存储(由您的item['store_name']
定义。
关于您对代码的疑问,open(...) as price_list2
返回一个io.TextIOWrapper
对象(详细信息here),该对象存储为变量price_list。您可以通过编写以下内容来实现相同目的:price_list2 = open(...)
但是,必须关闭文件才能不泄漏内存/数据。但是,将其写为with open(...) as file:
意味着您不必调用file.close()
,从而确保文件在使用后始终关闭。
您询问的另一行savepriceurl2 = csv.writer(...)
创建一个对象,该对象简化了对实际文件的写入。因此,您可以简单地使用对象函数writerow()
轻松地将一行写入所需的文件。有关更多信息,请参见here。
所以基本上,您的代码正在执行以下操作:
price_list2
写入文件对象','
(以及其他一些选项,请查看链接以获取详细信息)item['url']
和item['price']
的值的串联对于您的最后一个问题,鉴于您的实际设计和设置没有任何信息,我假设每个蜘蛛网都是保存此文件的类的实例。只要每个蜘蛛都去不同的站点(这意味着一个蜘蛛不会与另一个蜘蛛拥有item['store_name']
是相同的,则您应该写入不同的文件。很好(我不知道在python中“同时”将两个文件写入文件的问题)。如果不是这种情况,那么如果您的Spider尝试同时写入同一文件,则会遇到问题。
作为一个提示,谷歌搜索功能通常比这里的帖子更快地获得功能的描述和说明,并且将提供更多信息。
我希望这对您有所帮助并为您澄清一些事情。