10

下面是我的蜘蛛代码,

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 链接加入基本 url 并产生请求

4

3 回答 3

22

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

response.urljoin(i[1:])

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

如果您想更改正在抓取的域,这将使您的代码在将来可重用。

于 2017-10-14T15:33:49.227 回答
15

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

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

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

于 2012-05-29T12:07:50.747 回答
2

跟随链接的最佳方式scrapy是使用response.follow(). scrapy 将处理其余部分。

更多信息

引用自文档:

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

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

于 2021-02-20T13:07:25.217 回答