簡體   English   中英

Scrapy 無法到達 start_urls:調試:已爬網 (200) 和錯誤

[英]Scrapy cannot reach start_urls: DEBUG: Crawled (200) and ERROR

我正在嘗試使用 Scrapy 從運動鞋網站為大學項目抓取信息。 這個想法是告訴 Scrapy 跟蹤每只鞋的每個鏈接並抓取四個信息點(名稱、發布日期、零售價格、轉售價格)。 然后 go 返回上一個站點並單擊下一個鏈接並再次進行相同的抓取。 在頁面末尾,單擊下一頁並重復,直到沒有更多鏈接為止。

但是,當 Scrapy 嘗試訪問給定的 start_url 時,我總是遇到DEBUG 和 ERROR消息。

2020-04-06 11:59:56 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://stockx.com/sneakers/release-date?page=1> (referer: None)
2020-04-06 11:59:56 [scrapy.core.scraper] ERROR: Spider error processing <GET https://stockx.com/sneakers/release-date?page=1> (referer: None)

這是代碼:

import scrapy

class Spider200406Item(scrapy.Item):
    link = scrapy.Field()
    name = scrapy.Field()
    release_date = scrapy.Field()
    retail_price = scrapy.Field()
    resell_price = scrapy.Field()


class Spider200406Spider(scrapy.Spider):
    name = 'spider_200406'
    allowed_domains = ['www.stockx.com']
    start_urls = ['https://stockx.com/sneakers/release-date?page=1']

    BASE_URL = 'https://stockx.com/sneakers/release-date'

    def parse(self, response):
        links = response.xpath('//a[@class="TileBody-sc-1d2ws1l-0 bKAXcS"/@href').extract()
        for link in links:
            absolute_url = self.BASE_URL + link
            yield scrapy.Request(absolute_url, callback=self.parse_info)

    def parse_info(self, response):
        item = Spider200406Item()
        item["link"] = response.url
        item["name"] = "".join(response.xpath("//h1[@class='name']//text()").extract())
        item["release_date"] = "".join(response.xpath("//span[@data-testid='product-detail-release date']//text()").extract())
        item["retail_price"] = "".join(response.xpath("//span[@data-testid='product-detail-retail price']//text()").extract())
        item["resell_price"] = "".join(response.xpath("//div[@class='gauge-value']//text()").extract())
        return item
  • 到目前為止我已經嘗試過
    • 將用戶代理更改為非默認值
    • 在 settings.py 中將 ROBOTSTXT_OBEY 更改為 False
    • 在 settings.py 中將 DOWNLOAD_DELAY 更改為 7
    • 使用 Scrapy Shell 獲取更多信息,在告訴查看時產生空白鏈接(響應)
    • 檢查要抓取的信息是否為 JavaScript 加密(不應該)
    • 將 start_urls 更改為 start_url,Scrapy 不接受
    • 通過VPN連接

我還嘗試了使用更簡單的網站的相同代碼結構。 但是,我收到了相同的錯誤消息,這使我得出結論,代碼中的某些內容一定是錯誤的。

整個跟蹤:

2020-04-06 14:33:02 [scrapy.core.engine] INFO: Spider opened
2020-04-06 14:33:02 [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)
2020-04-06 14:33:02 [scrapy.extensions.telnet] INFO: Telnet console listening on 127.0.0.1:6023
2020-04-06 14:33:03 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://stockx.com/sneakers/release-date?page=1> (referer: None)
2020-04-06 14:33:03 [scrapy.core.scraper] ERROR: Spider error processing <GET https://stockx.com/sneakers/release-date?page=1> (referer: None)
Traceback (most recent call last):
  File "/Applications/anaconda3/lib/python3.7/site-packages/parsel/selector.py", line 238, in xpath
    **kwargs)
  File "src/lxml/etree.pyx", line 1581, in lxml.etree._Element.xpath
  File "src/lxml/xpath.pxi", line 305, in lxml.etree.XPathElementEvaluator.__call__
  File "src/lxml/xpath.pxi", line 225, in lxml.etree._XPathEvaluatorBase._handle_result
lxml.etree.XPathEvalError: Invalid predicate

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/Applications/anaconda3/lib/python3.7/site-packages/scrapy/utils/defer.py", line 117, in iter_errback
    yield next(it)
  File "/Applications/anaconda3/lib/python3.7/site-packages/scrapy/utils/python.py", line 345, in __next__
    return next(self.data)
  File "/Applications/anaconda3/lib/python3.7/site-packages/scrapy/utils/python.py", line 345, in __next__
    return next(self.data)
  File "/Applications/anaconda3/lib/python3.7/site-packages/scrapy/core/spidermw.py", line 64, in _evaluate_iterable
    for r in iterable:
  File "/Applications/anaconda3/lib/python3.7/site-packages/scrapy/spidermiddlewares/offsite.py", line 29, in process_spider_output
    for x in result:
  File "/Applications/anaconda3/lib/python3.7/site-packages/scrapy/core/spidermw.py", line 64, in _evaluate_iterable
    for r in iterable:
  File "/Applications/anaconda3/lib/python3.7/site-packages/scrapy/spidermiddlewares/referer.py", line 338, in <genexpr>
    return (_set_referer(r) for r in result or ())
  File "/Applications/anaconda3/lib/python3.7/site-packages/scrapy/core/spidermw.py", line 64, in _evaluate_iterable
    for r in iterable:
  File "/Applications/anaconda3/lib/python3.7/site-packages/scrapy/spidermiddlewares/urllength.py", line 37, in <genexpr>
    return (r for r in result or () if _filter(r))
  File "/Applications/anaconda3/lib/python3.7/site-packages/scrapy/core/spidermw.py", line 64, in _evaluate_iterable
    for r in iterable:
  File "/Applications/anaconda3/lib/python3.7/site-packages/scrapy/spidermiddlewares/depth.py", line 58, in <genexpr>
    return (r for r in result or () if _filter(r))
  File "/Applications/anaconda3/lib/python3.7/site-packages/scrapy/core/spidermw.py", line 64, in _evaluate_iterable
    for r in iterable:
  File "/Users/ritterm/Desktop/Data2Dollar_Coding/Group_project/stockx_200406/stockx_200406/spiders/spider_200406.py", line 20, in parse
    links = response.xpath('//a[@class="TileBody-sc-1d2ws1l-0 bKAXcS"/@href').extract()
  File "/Applications/anaconda3/lib/python3.7/site-packages/scrapy/http/response/text.py", line 117, in xpath
    return self.selector.xpath(query, **kwargs)
  File "/Applications/anaconda3/lib/python3.7/site-packages/parsel/selector.py", line 242, in xpath
    six.reraise(ValueError, ValueError(msg), sys.exc_info()[2])
  File "/Applications/anaconda3/lib/python3.7/site-packages/six.py", line 692, in reraise
    raise value.with_traceback(tb)
  File "/Applications/anaconda3/lib/python3.7/site-packages/parsel/selector.py", line 238, in xpath
    **kwargs)
  File "src/lxml/etree.pyx", line 1581, in lxml.etree._Element.xpath
  File "src/lxml/xpath.pxi", line 305, in lxml.etree.XPathElementEvaluator.__call__
  File "src/lxml/xpath.pxi", line 225, in lxml.etree._XPathEvaluatorBase._handle_result
ValueError: XPath error: Invalid predicate in //a[@class="TileBody-sc-1d2ws1l-0 bKAXcS"/@href
2020-04-06 14:33:03 [scrapy.core.engine] INFO: Closing spider (finished)

任何建議和想法都將受到高度贊賞。 先生

您的代碼中有多個錯誤會阻止 scrapy 成功。

首先,正如這里所指出的,將您的 allowed_domains 更正為allowed_domains = ['stockx.com']或完全刪除該行。

此外,您的 BASE_URL 是錯誤的。 將其更改為: BASE_URL = 'https://stockx.com'

此外,正如堆棧跟蹤所暗示的,您的 xpath 中存在錯誤。 我通過使用一個非常簡單的 css 選擇器來獲取每個鞋子頁面的鏈接來解決它: response.css('.browse-grid a::attr(href)').extract()

總而言之,以下代碼應該完全符合您的要求:

import scrapy

class Spider200406Item(scrapy.Item):
    link = scrapy.Field()
    name = scrapy.Field()
    release_date = scrapy.Field()
    retail_price = scrapy.Field()
    resell_price = scrapy.Field()


class Spider200406Spider(scrapy.Spider):
    name = 'spider_200406'
    start_urls = ['https://stockx.com/sneakers/release-date?page=1']
    allowed_domains = ['stockx.com']
    BASE_URL = 'https://stockx.com'

    def parse(self, response):
        links = response.css('.browse-grid a::attr(href)').extract()
        for link in links:
            absolute_url = self.BASE_URL + link
            yield scrapy.Request(absolute_url, callback=self.parse_info)

    def parse_info(self, response):
        item = Spider200406Item()
        item["link"] = response.url
        item["name"] = "".join(response.xpath("//h1[@class='name']//text()").extract())
        item["release_date"] = "".join(response.xpath("//span[@data-testid='product-detail-release date']//text()").extract())
        item["retail_price"] = "".join(response.xpath("//span[@data-testid='product-detail-retail price']//text()").extract())
        item["resell_price"] = "".join(response.xpath("//div[@class='gauge-value']//text()").extract())
        return item

確保您在設置中使用了用戶代理,例如USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.95 Safari/537.36'

allowed_domains = ['stockx.com']

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM