【问题标题】:Scrapy Crawler gets terminated at random pagesScrapy Crawler 在随机页面终止
【发布时间】:2018-04-28 18:41:38
【问题描述】:

我是 Scrapy 的新手。我正在使用递归解析器抓取 r/india subreddit 以存储每个线程的标题、赞成票和 URL。一切正常,但 Scraper 意外以一个奇怪的错误结束,显示:

2018-04-29 00:01:12 [scrapy.core.scraper] ERROR: Spider error processing 
<GET https://www.reddit.com/r/india/?count=50&after=t3_8fh5nv> (referer: 
https://www.reddit.com/r/india/?count=25&after=t3_8fiqd5)
Traceback (most recent call last):
File "Z:\Anaconda\lib\site-packages\scrapy\utils\defer.py", line 102, in 
iter_errback
yield next(it)
File "Z:\Anaconda\lib\site-packages\scrapy\spidermiddlewares\offsite.py", 
line 30, in process_spider_output
for x in result:
File "Z:\Anaconda\lib\site-packages\scrapy\spidermiddlewares\referer.py", 
line 339, in <genexpr>
    return (_set_referer(r) for r in result or ())
File "Z:\Anaconda\lib\site-packages\scrapy\spidermiddlewares\urllength.py", 
line 37, in <genexpr>
    return (r for r in result or () if _filter(r))
File "Z:\Anaconda\lib\site-packages\scrapy\spidermiddlewares\depth.py", line 
58, in <genexpr>
    return (r for r in result or () if _filter(r))
File 
"C:\Users\jayes\myredditscraper\myredditscraper\spiders\scrapereddit.py", 
line 28, in parse
   yield Request(url=(next_page),callback=self.parse)
File "Z:\Anaconda\lib\site-packages\scrapy\http\request\__init__.py", line 
25, in __init__
   self._set_url(url)
File "Z:\Anaconda\lib\site-packages\scrapy\http\request\__init__.py", line 
62, in _set_url
    raise ValueError('Missing scheme in request url: %s' % self._url)
ValueError: Missing scheme in request url:
2018-04-29 00:01:12 [scrapy.core.engine] INFO: Closing spider (finished)

每次运行蜘蛛时,错误都会随机出现在页面上,这使我无法检测到导致问题的原因。这是我的 redditscraper.py 文件,其中包含代码(我也使用过 Pipeline 和 Items.py,但我觉得没有任何问题)

import scrapy
import time
from scrapy.http.request import Request
from myredditscraper.items import MyredditscraperItem
class ScraperedditSpider(scrapy.Spider):

name = 'scrapereddit'
allowed_domains = ['www.reddit.com']
start_urls = ['http://www.reddit.com/r/india/']
def parse(self,response):
    next_page=''
    titles=response.css("a.title::text").extract()
    links=response.css("a.title::attr(href)").extract()
    votes=response.css("div.score.unvoted::attr(title)").extract()
    for item in zip(titles,links,votes):

        new_item = MyredditscraperItem()
        new_item['title']=item[0]
        new_item['link']=item[1]
        new_item['vote']=item[2]
        yield new_item

        next_page = response.css("span.next- 
button").css('a::attr(href)').extract()[0]

    if next_page is not None:

        yield Request(url=(next_page),callback=self.parse)

【问题讨论】:

  • href 属性包含相对路径时,使用Request(url=response.urljoin(next_page), callback=self.parse) 确保您获得绝对url。
  • 试过但又出现同样的错误。使用 shell 发现它正在发生,因为 reddit 要求登录,我尝试使用请求但没有成功。

标签: python-3.x web web-scraping scrapy scrapy-spider


【解决方案1】:

正如你的例外所说

ValueError:请求 url 中缺少方案:

这意味着您尝试废弃无效的网址 - 网址中缺少 http://https://

我猜问题不在于start_urls,否则解析函数将不会被调用。问题出在解析函数上。

yield Request 被调用时,您需要检查next_page 是否包含架构。您解析的网址似乎是相对链接,因此您有两个选项可以继续废弃这些链接而不会遇到此异常:

  1. 传递绝对网址。
  2. 跳过相对网址。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-12
    相关资源
    最近更新 更多