我尝试通过源导出将各个属性的图像URL保存在其各自的csv文件中,为了使其正常工作,每次在start_requests
中生成scrapy.Request
时,都必须更改custom_settings中的FEEDs csv_path。每次生成scrapy.Request
时,都会为__init__
中的self.get_csv_path
分配一个与属性ID对应的新csv文件路径,然后def get_feeds_csv_path
将其提取到FEEDS
,如下面的代码所示。custom_settings
中的self.feeds_csv_path
似乎无法访问def get_feeds_csv_path
,此处的错误在哪里?
import asyncio
from configparser import ConfigParser
import os
import pandas as pd
import scrapy
import requests
import json
class GetpropertyimgurlsSpider(scrapy.Spider):
name = 'GetPropertyImgUrls'
custom_settings = {
"FEEDS": {
self.feeds_csv_path: {
"format": "csv",
"overwrite": True
}
}
}
def __init__(self, *args,**kwargs):
self.feeds_csv_path = None
super(GetpropertyimgurlsSpider, self).__init__(*args,**kwargs)
def start_requests(self):
files = self.get_html_files() # List of html file full paths
for file in files[:2]:
self.feeds_csv_path = self.get_feeds_csv_path(file)
yield scrapy.Request(file, callback=self.parse)
def parse(self, response):
texts = response.xpath("//text()").getall()
text = texts[1]
json_text = json.loads(text)
#print(text)
photos = json_text["@graph"][3]["photo"]
for photo in photos:
yield photo["contentUrl"]
def get_feeds_csv_path(self, html_file_path):
property_id = html_file_path.split("/")[-2].split("_")[1]
feeds_csv_path = f"{html_file_path}/images/Property_{property_id}_ImgSrcs.csv"
return feeds_csv_path
def get_path(self):
config = ConfigParser()
config.read("config.ini") # Location relative to main.py
path = config["scrapezoopla"]["path"]
return path
#Returns a list of html file dirs
def get_html_files(self):
path = self.get_path()
dir = f"{path}/data/properties/"
dir_list = os.listdir(dir)
folders = []
for ins in dir_list:
if os.path.isdir(f"{dir}{ins}") == True:
append_ins = folders.append(ins)
html_files = []
for folder in folders:
html_file = f"{dir}{folder}/{folder}.html"
if os.path.isfile(html_file) == True:
append_html_file = html_files.append(f"file:///{html_file}")
return html_files
1条答案
按热度按时间gc0ot86w1#
我看到的第一个问题是,您在spider类的命名空间作用域中使用了
self
关键字。self
关键字仅在示例方法中可用,其中您将该关键字作为第一个参数传入。例如,def __init__(self...)
。即使
self
是可用的,它仍然不会工作,因为一旦创建了custom_settings字典,self.feeds_csv_path
在运行时会立即转换为它的字符串值,因此更新示例变量对custom_settings
属性没有影响。另一个问题是scrapy收集了所有的自定义设置,并在爬行真正开始之前将它们存储在内部,在爬行过程中更新
custom_settings
字典可能不会真正产生效果,但我不确定。尽管如此,您的目标仍然是可以实现的。我能想到的一种方法是创建FEEDS字典运行时,但在启动爬网和过滤之前,使用自定义
scrapy.Item
类来过滤哪个项属于哪个输出。我没有办法测试它,所以它可能是错误的,但这里是一个例子,我指的是: