【发布时间】:2020-07-30 11:00:28
【问题描述】:
简介
由于我必须更深入地抓取,我面临下一个问题:抓取嵌套页面,例如:https://www.karton.eu/Faltkartons
我的爬虫必须从这个页面开始,转到https://www.karton.eu/Einwellige-Kartonagen 并访问该类别中列出的每个产品。
它应该对每个类别中包含的每个产品的“Faltkartons”的每个子类别都这样做。
已编辑
我的代码现在如下所示:
import scrapy
from ..items import KartonageItem
class KartonSpider(scrapy.Spider):
name = "kartons12"
allow_domains = ['karton.eu']
start_urls = [
'https://www.karton.eu/Faltkartons'
]
custom_settings = {'FEED_EXPORT_FIELDS': ['SKU', 'Title', 'Link', 'Price', 'Delivery_Status', 'Weight', 'QTY', 'Volume'] }
def parse(self, response):
url = response.xpath('//div[@class="cat-thumbnails"]')
for a in url:
link = a.xpath('a/@href')
yield response.follow(url=link.get(), callback=self.parse_category_cartons)
def parse_category_cartons(self, response):
url2 = response.xpath('//div[@class="cat-thumbnails"]')
for a in url2:
link = a.xpath('a/@href')
yield response.follow(url=link.get(), callback=self.parse_target_page)
def parse_target_page(self, response):
card = response.xpath('//div[@class="text-center articelbox"]')
for a in card:
items = KartonageItem()
link = a.xpath('a/@href')
items ['SKU'] = a.xpath('.//div[@class="delivery-status"]/small/text()').get()
items ['Title'] = a.xpath('.//h5[@class="title"]/a/text()').get()
items ['Link'] = a.xpath('.//h5[@class="text-center artikelbox"]/a/@href').extract()
items ['Price'] = a.xpath('.//strong[@class="price-ger price text-nowrap"]/span/text()').get()
items ['Delivery_Status'] = a.xpath('.//div[@class="signal_image status-2"]/small/text()').get()
yield response.follow(url=link.get(),callback=self.parse_item, meta={'items':items})
def parse_item(self,response):
table = response.xpath('//div[@class="product-info-inner"]')
items = KartonageItem()
items = response.meta['items']
items['Weight'] = a.xpath('.//span[@class="staffelpreise-small"]/text()').get()
items['Volume'] = a.xpath('.//td[@class="icon_contenct"][7]/text()').get()
yield items
在我的脑海中,它从 start_url 开始,然后我访问 https://www.karton.eu/Einwellige-Kartonagen,寻找链接并关注它们 https://www.karton.eu/einwellig-ab-100-mm。在该页面上,它会检查卡片以获取一些信息,然后点击指向特定产品页面的链接以获取最后的项目。
我的方法的哪些部分是错误的? 我应该将我的课程从“scrapy.Spider”改为“crawl.spider”吗?还是只有在我想设置一些规则时才需要?
仍有可能,我的标题、sku 等的 xpath 可能是错误的,但首先,我只想建立我的基础知识,以抓取这些嵌套页面
我的控制台输出:
最后我设法浏览了所有这些页面,但不知何故我的 .csv 文件仍然是空的
【问题讨论】:
-
我执行了你的蜘蛛,在这里它对我的表现如何:爬取了
start_urls页面,在 varcard中选择了 6 个对象,每个对象都有一个链接。产生并爬取了 6 个请求,parse_item中的每个选择器都返回空,没有任何项目产生。 -
你能给我一个提示吗,我首先要纠正什么?递归爬虫是否总是必须使用规则,还是没有规则仍然可能?
-
我不清楚蜘蛛应该做什么。例如,您的蜘蛛到达此页面karton.eu/Zweiwellige-Kartons,但无法抓取任何内容,因为 XPath(在
parse_item方法中)与页面上的任何路径都不匹配(至少对我来说不匹配)。他们应该从那里抓取内容还是继续浏览更多页面,例如karton.eu/zweiwellig-ab-500-mm -
我的计划是这样设置的:它从karton.eu/Faltkartons>开始它的第一个目的地是karton.eu/Einwellige-Kartonagen>访问该页面后它应该从karton.eu/einwellig-ab-100-mm>的所有文章开始并保存标题、链接、价格等值。之后,它应该转到 karton.eu/einwellig-ab-200-mm> 并重复它的工作。我的完整目标是它对每个类别的所有产品都执行此操作。现在我开始重新检查我的 xpaths
标签: python python-3.x xpath web-scraping scrapy