Skip to main content
 首页 » 编程设计

python之Scrapy: ValueError ('Missing scheme in request url: %s' % self._url)

2025年05月04日13dyllove98

我正在尝试从网页中抓取数据。该网页只是一个包含 2500 个 URL 的项目符号列表。 Scrapy 获取并转到每个 URL 并获取一些数据......

这是我的代码

class MySpider(CrawlSpider): 
    name = 'dknews' 
    start_urls = ['http://www.example.org/uat-area/scrapy/all-news-listing'] 
    allowed_domains = ['example.org'] 
 
    def parse(self, response): 
        hxs = Selector(response) 
        soup = BeautifulSoup(response.body, 'lxml') 
        nf = NewsFields() 
        ptype = soup.find_all(attrs={"name":"dkpagetype"}) 
        ptitle = soup.find_all(attrs={"name":"dkpagetitle"}) 
        pturl = soup.find_all(attrs={"name":"dkpageurl"}) 
        ptdate = soup.find_all(attrs={"name":"dkpagedate"}) 
        ptdesc = soup.find_all(attrs={"name":"dkpagedescription"}) 
         for node in soup.find_all("div", class_="module_content-panel-sidebar-content"): 
           ptbody = ''.join(node.find_all(text=True))   
           ptbody = ' '.join(ptbody.split()) 
           nf['pagetype'] = ptype[0]['content'].encode('ascii', 'ignore') 
           nf['pagetitle'] = ptitle[0]['content'].encode('ascii', 'ignore') 
           nf['pageurl'] = pturl[0]['content'].encode('ascii', 'ignore') 
           nf['pagedate'] = ptdate[0]['content'].encode('ascii', 'ignore') 
           nf['pagedescription'] = ptdesc[0]['content'].encode('ascii', 'ignore') 
           nf['bodytext'] = ptbody.encode('ascii', 'ignore') 
         yield nf 
            for url in hxs.xpath('//ul[@class="scrapy"]/li/a/@href').extract(): 
             yield Request(url, callback=self.parse) 

现在的问题是上面的代码从 2500 篇文章中抓取了大约 215 篇。它通过给出这个错误关闭...

ValueError('Missing scheme in request url: %s' % self._url)

我不知道是什么导致了这个错误....

非常感谢任何帮助。

谢谢

请您参考如下方法:

更新 01/2019

现在 Scrapy 的 Response 实例有非常方便的方法 response.follow 它从给定的 URL 生成请求(绝对或相对甚至 LinkExtractor 生成的 Link 对象) 使用 response.url 作为基础:

yield response.follow('some/url', callback=self.parse_some_url, headers=headers, ...) 

文档:http://doc.scrapy.org/en/latest/topics/request-response.html#scrapy.http.Response.follow


下面的代码看起来像问题:

 for url in hxs.xpath('//ul[@class="scrapy"]/li/a/@href').extract(): 
     yield Request(url, callback=self.parse) 

如果任何 url 不是完全限定的,例如看起来像 href="/path/to/page" 而不是 href="http://example.com/path/to/page" 你会得到错误。为确保产生正确的请求,您可以使用 urljoin:

    yield Request(response.urljoin(url), callback=self.parse) 

Scrapy 的方法是使用 LinkExtractor 虽然 https://doc.scrapy.org/en/latest/topics/link-extractors.html