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链接加入基本网址并提出请求
答案 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 将处理其余的。
引自文档:
<块引用>与 scrapy.Request
不同,response.follow
直接支持相对 URL - 无需调用 urljoin
。
此外,您可以直接将 <a>
元素作为参数传递。