我尝试创建一个输入处理器,根据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()
答案 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)