scrapy " отсутствует схема в url запроса"
Вот мой код ниже -
import scrapy
from scrapy.http import Request
class lyricsFetch(scrapy.Spider):
name = "lyricsFetch"
allowed_domains = ["metrolyrics.com"]
print "nEnter the name of the ARTIST of the song for which you want the lyrics for. Minimise the spelling mistakes, if possible."
artist_name = raw_input('>')
print "nNow comes the main part. Enter the NAME of the song itself now. Again, try not to have any spelling mistakes."
song_name = raw_input('>')
artist_name = artist_name.replace(" ", "_")
song_name = song_name.replace(" ","_")
first_letter = artist_name[0]
print artist_name
print song_name
start_urls = ["www.lyricsmode.com/lyrics/"+first_letter+"/"+artist_name+"/"+song_name+".html" ]
print "nParsing this linkt "+ str(start_urls)
def start_requests(self):
yield Request("www.lyricsmode.com/feed.xml")
def parse(self, response):
lyrics = response.xpath('//p[@id="lyrics_text"]/text()').extract()
with open ("lyrics.txt",'wb') as lyr:
lyr.write(str(lyrics))
#yield lyrics
print lyrics
Я получаю правильный вывод, когда использую оболочку scrapy, однако всякий раз, когда я пытаюсь запустить скрипт с помощью scrapy crawl, я получаю ValueError. Что я делаю не так? Я прошелся по этому сайту и другим, но ничего не нашел. У меня возникла идея передать просьбу через другой вопрос, но это все равно не сработало. Помощь есть?
Мое возвращение -
Enter the name of the ARTIST of the song for which you want the lyrics for. Minimise the spelling mistakes, if possible.
>bullet for my valentine
Now comes the main part. Enter the NAME of the song itself now. Again, try not to have any spelling mistakes.
>your betrayal
bullet_for_my_valentine
your_betrayal
Parsing this link ['www.lyricsmode.com/lyrics/b/bullet_for_my_valentine/your_betrayal.html']
2016-01-24 19:58:25 [scrapy] INFO: Scrapy 1.0.3 started (bot: lyricsFetch)
2016-01-24 19:58:25 [scrapy] INFO: Optional features available: ssl, http11
2016-01-24 19:58:25 [scrapy] INFO: Overridden settings: {'NEWSPIDER_MODULE': 'lyricsFetch.spiders', 'SPIDER_MODULES': ['lyricsFetch.spiders'], 'BOT_NAME': 'lyricsFetch'}
2016-01-24 19:58:27 [scrapy] INFO: Enabled extensions: CloseSpider, TelnetConsole, LogStats, CoreStats, SpiderState
2016-01-24 19:58:28 [scrapy] INFO: Enabled downloader middlewares: HttpAuthMiddleware, DownloadTimeoutMiddleware, UserAgentMiddleware, RetryMiddleware, DefaultHeadersMiddleware, MetaRefreshMiddleware, HttpCompressionMiddleware, RedirectMiddleware, CookiesMiddleware, ChunkedTransferMiddleware, DownloaderStats
2016-01-24 19:58:28 [scrapy] INFO: Enabled spider middlewares: HttpErrorMiddleware, OffsiteMiddleware, RefererMiddleware, UrlLengthMiddleware, DepthMiddleware
2016-01-24 19:58:28 [scrapy] INFO: Enabled item pipelines:
2016-01-24 19:58:28 [scrapy] INFO: Spider opened
2016-01-24 19:58:28 [scrapy] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)
2016-01-24 19:58:28 [scrapy] DEBUG: Telnet console listening on 127.0.0.1:6023
2016-01-24 19:58:28 [scrapy] ERROR: Error while obtaining start requests
Traceback (most recent call last):
File "C:UsersNishankMiniconda2libsite-packagesscrapycoreengine.py", line 110, in _next_request
request = next(slot.start_requests)
File "C:UsersNishankDesktopSNUPythonlyricsFetchlyricsFetchspiderslyricsFetch.py", line 26, in start_requests
yield Request("www.lyricsmode.com/feed.xml")
File "C:UsersNishankMiniconda2libsite-packagesscrapyhttprequest__init__.py", line 24, in __init__
self._set_url(url)
File "C:UsersNishankMiniconda2libsite-packagesscrapyhttprequest__init__.py", line 59, in _set_url
raise ValueError('Missing scheme in request url: %s' % self._url)
ValueError: Missing scheme in request url: www.lyricsmode.com/feed.xml
2016-01-24 19:58:28 [scrapy] INFO: Closing spider (finished)
2016-01-24 19:58:28 [scrapy] INFO: Dumping Scrapy stats:
{'finish_reason': 'finished',
'finish_time': datetime.datetime(2016, 1, 24, 14, 28, 28, 231000),
'log_count/DEBUG': 1,
'log_count/ERROR': 1,
'log_count/INFO': 7,
'start_time': datetime.datetime(2016, 1, 24, 14, 28, 28, 215000)}
2016-01-24 19:58:28 [scrapy] INFO: Spider closed (finished)
1 ответ:
Как сказал @tintin, в URL-адресах отсутствует схема
http
. Scrapy нужен полный URL-адрес для того, чтобы обрабатывать запросы.Насколько я вижу, вы пропускаете схему в:
start_urls = ["www.lyricsmode.com/lyrics/ ...
И
yield Request("www.lyricsmode.com/feed.xml")
В случае, если вы анализируете URL-адреса из содержимого HTML, вы должны использовать
urljoin
, чтобы гарантировать, что вы получите полный URL-адрес, например:next_url = response.urljoin(href)