将基础网址与scrapy中产生的href相结合

时间:2012-05-29 11:20:30

标签: python url scrapy

下面是我的蜘蛛代码,

class Blurb2Spider(BaseSpider):
   name = "blurb2"
   allowed_domains = ["www.domain.com"]

   def start_requests(self):
            yield self.make_requests_from_url("http://www.domain.com/bookstore/new")


   def parse(self, response):
       hxs = HtmlXPathSelector(response)
       urls = hxs.select('//div[@class="bookListingBookTitle"]/a/@href').extract()
       for i in urls:
           yield Request(urlparse.urljoin('www.domain.com/', i[1:]),callback=self.parse_url)


   def parse_url(self, response):
       hxs = HtmlXPathSelector(response)
       print response,'------->'

这里我试图将href链接与基本链接结合起来,但是我收到以下错误,

exceptions.ValueError: Missing scheme in request url: www.domain.com//bookstore/detail/3271993?alt=Something+I+Had+To+Do

任何人都可以告诉我为什么我会收到此错误以及如何使用href链接加入基本网址并提出请求

3 个答案:

答案 0 :(得分:12)

这是因为您没有添加方案,例如http://在您的基本网址中。

尝试:urlparse.urljoin('http://www.domain.com/', i[1:])

或者更简单:urlparse.urljoin(response.url, i[1:]),因为urlparse.urljoin将整理基本网址。

答案 1 :(得分:5)

另一种解决方案,如果您不想使用urlparse

response.urljoin(i[1:])

这个解决方案更进了一步:Scrapy在这里加入了域名基础。正如您所看到的,您不必提供明显的http://www.example.com加入。

如果您想要更改正在抓取的域,这将使您的代码以后可重复使用

答案 2 :(得分:1)

点击 scrapy 中的链接的最佳方式是使用 response.follow()。 scrapy 将处理其余的。

more info

引自文档:

<块引用>

scrapy.Request 不同,response.follow 直接支持相对 URL - 无需调用 urljoin

此外,您可以直接将 <a> 元素作为参数传递。