如何在Scrapy中获取初始URL

eivnm1vs  于 2023-06-06  发布在  其他
关注(0)|答案(2)|浏览(219)

我需要获得Scrapy蜘蛛当前处理的第一个URL,以将结果Map到它。更辣。如果用于抓取的URL是abc.de,并且它被重定向到https://www.abc.de/en,我想将https://www.abc.de/en作为url,将abc.de作为initial_url。我的代码是:

class SpiderTst(scrapy.Spider):
    name = 'spider_tst'
    start_urls = ['vrgroup.fi']

    def parse(self, response):
        tst_item = TstItem()
        tst_item['url'] = response.url
        ...
        tst_item['initial_url'] = response.request.url
        yield tst_item

但是'url'和'initial_url'的值是相等的。

polkgigr

polkgigr1#

如果您的初始起始URL不是一个具有适当方案的完整URI,那么真的没有办法通过请求和响应对象获得它,您最好的选择是评论中的超级用户建议。
但是,如果您的初始URL确实有一个方案,那么重定向链在响应 meta字典中可用。
要使用scrapy shell演示:

>>> fetch('http://vrgroup.fi')
2023-06-01 13:07:26 [scrapy.downloadermiddlewares.redirect] DEBUG: Redirecting (301) to <GET https://www.vrgroup.fi/> from <GET http://vrgroup.fi>
2023-06-01 13:07:26 [scrapy.downloadermiddlewares.redirect] DEBUG: Redirecting (301) to <GET https://www.vrgroup.fi/fi/> from <GET https://www.vrgroup.fi/>
2023-06-01 13:07:27 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://www.vrgroup.fi/fi/> (referer: None)
>>> response.url
'https://www.vrgroup.fi/fi/'
>>> response.request.url
'https://www.vrgroup.fi/fi/'
>>> response.meta['redirect_urls']
['http://vrgroup.fi', 'https://www.vrgroup.fi/']
jm2pwxwz

jm2pwxwz2#

我按照@SuperUser的建议做了,因为@ Alexandria 提到的问题--在我的情况下,URL并不总是“满”的。因此,我将URL作为调用参数传递:

def parse(self, response):
        for ...:
            # here initial_url is passed
            yield response.follow(url, functools.partial(self.parse_sublink, initial_url=url))

    def parse_sublink(self, response, initial_url):
        # here initial_url is used

主解析函数的调用方式与传递初始URL作为附加参数的方式相同。要将参数传递给回调,您需要使用functools.partial,否则每次迭代都会传递相同的URL。

相关问题