使用Scrapy获取每个请求的URL跟踪

ubbxdtey  于 2022-11-09  发布在  其他
关注(0)|答案(1)|浏览(189)

我尝试存储蜘蛛每次访问目标页面时访问的URL的踪迹。我在阅读每个请求的起始URL和结束URL时遇到了麻烦。我已经阅读了文档,这是我使用文档中的示例所能达到的最大程度。
这是我的蜘蛛类

class MinistryProductsSpider(CrawlSpider):
    name = "ministryproducts"
    allowed_domains = ["www.ministryofsupply.com"]
    start_urls = ["https://www.ministryofsupply.com/"]
    base_url = "https://www.ministryofsupply.com/"
    rules = [
        Rule(
            LinkExtractor(allow="products/"),
            callback="parse_products",
            follow=True,
            process_request="main",
        )
    ]

我有一个单独的callback函数,它解析每个产品页面上的数据。文档没有说明我是否可以在同一个Rule中使用callbackprocess_request at。

def main(self, request, response):
        trail = [link for link in response.url]
        return Request(response.url, callback=self.parse_products, meta=dict(trail))

def parse_products(self, response, trail):
        self.logger.info("Hi this is a product page %s", response.url)
        parser = Parser()
        item = parser.parse_product(response, trail)

        yield item

在过去的4个小时里,我一直被困在这一点上。我的Parser类运行得绝对正常。我也在寻找这种情况下最佳实践的解释。

inb24sb2

inb24sb21#

我通过迭代目录页面上a标签上的href值来创建一个新的scrapy.request对象,从而解决了这个问题。

parser = Parser()

    def main(self, response):
        href_list = response.css("a.CardProduct__link::attr(href)").getall()
        for link in href_list:
            product_url = self.base_url + link
            request = Request(product_url, callback=self.parse_products)
            visited_urls = [request.meta.get("link_text", "").strip(), request.url]
            trail = copy.deepcopy(response.meta.get("visited_urls", [])) + visited_urls
            request.meta["trail"] = trail
            yield request

    def parse_products(self, response):
        self.logger.info("Hi this is a product page %s", response.url)
        item = self.parser.parse_product(response)

        yield item

相关问题