需要抓取在线商店网站上的产品分类树形结构,以便获得产品所在的分类路径,包括主类别、子类别、孙类别等。网站上的产品分类以树形结构组织,每个类别可能有多个子类别,并且子类别可能进一步细分为孙类别。需要从网站上提取出这些产品分类并将其存储为一个包含逗号分隔的树形结构字符串。
2、解决方案
-
解析主类别:
- 使用 XPath 从网页中提取主类别列表。
- 将每个主类别名称存储在一个列表中。
-
迭代主类别:
- 对于每个主类别,构建一个请求,URL 是该主类别的页面 URL。
- 将该请求发送给 Scrapy,并指定回调函数
parse_category_page来处理响应。
-
提取子类别:
- 在回调函数
parse_category_page中,使用 XPath 从网页中提取子类别列表。 - 将每个子类别名称存储在一个列表中。
- 在回调函数
-
迭代子类别:
- 对于每个子类别,构建一个请求,URL 是该子类别的页面 URL。
- 将该请求发送给 Scrapy,并指定回调函数
parse_category_page来处理响应。
-
递归处理:
- 在回调函数
parse_category_page中,检查当前类别是否还有子类别。 - 如果有,则迭代子类别并继续提取子类别。
- 如果没有,则将当前类别及其父类别的名称存储在一个字符串中,并将其作为结果返回。
- 在回调函数
-
构建分类树形结构:
- 将所有从网站上提取出的分类名称存储在一个列表中。
- 使用列表推导式将每个分类名称转换为一个逗号分隔的字符串。
- 将这些逗号分隔的字符串连接成一个换行符分隔的字符串,并将该字符串作为最终结果返回。
代码例子:
import scrapy
from scrapy.selector import HtmlXPathSelector
class CategoriesSpider(scrapy.Spider):
name = "categories"
allowed_domains = ["myshop.com"]
start_urls = ['http://www.myshop.com/']
def parse(self, response):
hxs = HtmlXPathSelector(response)
main_categories = hxs.select('//ul[@id="cat"]/li/a/@href').extract()
for main_category in main_categories:
yield Request(urlparse.urljoin(response.url, main_category), callback=self.parse_category_page)
def parse_category_page(self, response):
hxs = HtmlXPathSelector(response)
sub_categories = hxs.select('//div[@class="block-layered-content"]/ul/li/a/@href').extract()
if sub_categories:
for sub_category in sub_categories:
yield Request(urlparse.urljoin(response.url, sub_category), callback=self.parse_category_page)
else:
category_tree = self.get_category_tree(response)
yield {'category_tree': category_tree}
def get_category_tree(self, response):
hxs = HtmlXPathSelector(response)
category_names = hxs.select('//ul[@id="cat"]/li/a/text()').extract()
category_names.reverse()
category_tree = ', '.join(category_names)
return category_tree
运行此scrapy爬虫,可以获得网站上产品分类的树形结构。