Python Scrapy使用输入处理器获取绝对URL

时间:2018-02-19 21:20:18

标签: python web-scraping scrapy

我尝试创建一个输入处理器,根据this Stackoverflow帖子将抓取的相对网址转换为绝对网址。我正在努力使用loader_context概念,我可能会在这里混淆。有人能指出我正确的方向吗?

我在items.py

中有以下内容
import scrapy
from scrapy.loader import ItemLoader
from scrapy.loader.processors import MapCompose
from urlparse import urljoin

def convert_to_baseurl(url, loader_context):
    response = loader_context.get('response')
    return urljoin(url, response)


class Item(scrapy.Item):
    url = scrapy.Field(
        input_processor=MapCompose(convert_to_baseurl)
    )

以下是我的蜘蛛

class webscraper(scrapy.Spider):
    name = "spider"

    def start_requests(self):
        yield scrapy.Request(url=url, callback=self.parse)

    def parse(self, response):

        for entry in response.css('li.aanbodEntry'):
            loader = ItemLoader(item=Huis(), selector=entry)
            loader.add_css('url', 'a')

            yield loader.load_item()

1 个答案:

答案 0 :(得分:3)

您引用的答案中的_urljoin()是由OP编写的函数,它的签名与stdlib中的签名不同。
使用stdlib urljoin()的正确方法是:

return urljoin(response.url, url)

然而,没有必要使用它,因为您可以使用Response.urljoin()

def absolute_url(url, loader_context):
    return loader_context['response'].urljoin(url)

对于可通过context属性访问的响应,您需要在创建项加载器时将其作为参数传递,或使用item loader docs中提到的其他方法:

loader = ItemLoader(item=Huis(), selector=entry, response=response)