scrapy 蜘蛛中的多重继承
Multiple inheritance in scrapy spiders
是否可以创建一个从两个基本蜘蛛(即 SitemapSpider 和 CrawlSpider)继承功能的蜘蛛?
我一直在尝试从各个站点抓取数据,并意识到并非所有站点都有网站上每个页面的列表,因此需要使用 CrawlSpider。但是 CrawlSpider 浏览了很多垃圾页面,有点矫枉过正。
我想做的是这样的:
启动我的 Spider,它是 SitemapSpider 的子类并传递正则表达式
匹配响应 parse_products 以提取有用的
信息法.
从产品页面转到 links 匹配正则表达式:/reviews/,
并将数据发送到 parse_review 函数。
注意:站点地图中未列出“/reviews/”类型的页面
从/reviews/页面提取信息
CrawlSpider 主要用于递归抓取和抓取
--------更多详细信息--------
相关站点是 www.flipkart.com
该网站有很多产品的列表,每个页面都有自己的详细信息页面。
与详细信息页面一起,它们是产品的相应 "review" 页面。评论页面的 link 也可以在产品详细信息页面上找到。
注意:站点地图上未列出评论页面。
class WebCrawler(SitemapSpider, CrawlSpider):
name = "flipkart"
allowed_domains = ['flipkart.com']
sitemap_urls = ['http://www.flipkart.com/robots.txt']
sitemap_rules = [(regex('/(.*?)/p/(.*?)'), 'parse_product')]
start_urls = ['http://www.flipkart.com/']
rules = [Rule(LinkExtractor(allow=['/(.*?)/product-reviews/(.*?)']), 'parse_reviews'),
Rule(LinkExtractor(restrict_xpaths='//div[@class="fk-navigation fk-text-center tmargin10"]'), follow=True)]
def parse_product(self, response):
loader = FlipkartItemLoader(response=response)
loader.add_value('pid', 'value of pid')
loader.add_xpath('name', 'xpath to name')
yield loader.load_item()
def parse_reviews(self, response):
loader = ReviewItemLoader(response=response)
loader.add_value('pid','value of pid')
loader.add_xpath('review_title', 'xpath to review title')
loader.add_xpath('review_text', 'xpath to review text')
yield loader.load_item()
你在正确的轨道上,唯一剩下的就是你的parse_product
函数的末尾,你必须像这样产生爬虫提取的所有网址
def parse_product(self, response):
loader = FlipkartItemLoader(response=response)
loader.add_value('pid', 'value of pid')
loader.add_xpath('name', 'xpath to name')
yield loader.load_item()
# CrawlSpider defines this method to return all scraped urls.
yield from self.parse(response)
如果您没有 yield from
语法,那么只需使用
for req in self.parse(response):
yield req
是否可以创建一个从两个基本蜘蛛(即 SitemapSpider 和 CrawlSpider)继承功能的蜘蛛?
我一直在尝试从各个站点抓取数据,并意识到并非所有站点都有网站上每个页面的列表,因此需要使用 CrawlSpider。但是 CrawlSpider 浏览了很多垃圾页面,有点矫枉过正。
我想做的是这样的:
启动我的 Spider,它是 SitemapSpider 的子类并传递正则表达式 匹配响应 parse_products 以提取有用的 信息法.
从产品页面转到 links 匹配正则表达式:/reviews/, 并将数据发送到 parse_review 函数。
注意:站点地图中未列出“/reviews/”类型的页面从/reviews/页面提取信息
CrawlSpider 主要用于递归抓取和抓取
--------更多详细信息--------
相关站点是 www.flipkart.com 该网站有很多产品的列表,每个页面都有自己的详细信息页面。 与详细信息页面一起,它们是产品的相应 "review" 页面。评论页面的 link 也可以在产品详细信息页面上找到。
注意:站点地图上未列出评论页面。
class WebCrawler(SitemapSpider, CrawlSpider):
name = "flipkart"
allowed_domains = ['flipkart.com']
sitemap_urls = ['http://www.flipkart.com/robots.txt']
sitemap_rules = [(regex('/(.*?)/p/(.*?)'), 'parse_product')]
start_urls = ['http://www.flipkart.com/']
rules = [Rule(LinkExtractor(allow=['/(.*?)/product-reviews/(.*?)']), 'parse_reviews'),
Rule(LinkExtractor(restrict_xpaths='//div[@class="fk-navigation fk-text-center tmargin10"]'), follow=True)]
def parse_product(self, response):
loader = FlipkartItemLoader(response=response)
loader.add_value('pid', 'value of pid')
loader.add_xpath('name', 'xpath to name')
yield loader.load_item()
def parse_reviews(self, response):
loader = ReviewItemLoader(response=response)
loader.add_value('pid','value of pid')
loader.add_xpath('review_title', 'xpath to review title')
loader.add_xpath('review_text', 'xpath to review text')
yield loader.load_item()
你在正确的轨道上,唯一剩下的就是你的parse_product
函数的末尾,你必须像这样产生爬虫提取的所有网址
def parse_product(self, response):
loader = FlipkartItemLoader(response=response)
loader.add_value('pid', 'value of pid')
loader.add_xpath('name', 'xpath to name')
yield loader.load_item()
# CrawlSpider defines this method to return all scraped urls.
yield from self.parse(response)
如果您没有 yield from
语法,那么只需使用
for req in self.parse(response):
yield req