我正在尝试从this website获取所有数据,以便以后在某些模型训练项目(ML)中使用它们。
我选择使用Scrapy + Python 3.7来做到这一点。到目前为止,一切都很好。我已经建立了Scrapy项目结构,并开始研究刮板。为此,我创建了一些步骤,必须遵循这些步骤才能相应地获取所需的数据。
effectime_time
类)我试图通过使用以下代码来重现以上内容:
Product
我的代码存在的问题是,并非所有产品都被解析,只有70k中只有3k。现在,我认为问题出在148-165行之间。我已经通过调试器运行了它,但是我仍然不知道出了什么问题。
有人可以解释一下我的代码逻辑有什么问题吗?
答案 0 :(得分:3)
不确定这是否是唯一的问题,因为我没有时间进行进一步的测试,但是当您在此处加载8批量数据时,您似乎只是在解析第一个产品:
# ...
product_url = scrapy.selector.Selector(text=products_str_html).xpath(
'//div[@class="product-image-container"]//a/@href'
).get()
# ...
.get()
方法不会返回所有网址。您可以改用getall()
方法,该方法返回包含所有网址的列表:
# ...
product_url = scrapy.selector.Selector(text=products_str_html).xpath(
'//div[@class="product-image-container"]//a/@href'
).getall()
# ...
然后循环遍历返回的列表并产生您之前产生的结果:
# ...
products_urls = scrapy.selector.Selector(text=products_str_html).xpath(
'//div[@class="product-image-container"]//a/@href'
).getall()
for product_url in products_urls:
yield scrapy.Request(
f'https://bannersolutions.com{product_url}',
callback=self.parse_product,
meta={'product_category': response.meta.get('product_category')}
)
答案 1 :(得分:1)
您在parse
类的BannerSolutionsSpider
方法中犯了同样的错误,就像在parse_plm
方法中一样(由@Cajuu'突出显示)。而不是使用getall
方法来获取所有超链接,而是使用了get
方法,该方法仅返回每个子类别的第一个URL。
您可以尝试以下解决方案,它提供了所有子类别的URL进行解析。
for category in response.xpath('(//div[@class="col-md-3"])[1]/ul/li'):
main_category_name = category.xpath('./a/text()').get()
for sub_category in category.xpath('./ul/li'):
sub_category_name = sub_category.xpath('./a/text()').get()
sub_category_url = sub_category.xpath('./a/@href').get()
yield scrapy.Request(f'https://bannersolutions.com{sub_category_url}', callback=self.parse_categories, meta={'product_category': f'{main_category_name}/{sub_category_name}'})