使用scrapy 1.5.0,python 2.7.14处理URL时遇到错误。
class GoodWillOutSpider(Spider):
name = "GoodWillOutSpider"
allowded_domains = ["thegoodwillout.com"]
start_urls = [GoodWillOutURL]
def __init__(self):
logging.critical("GoodWillOut STARTED.")
def parse(self, response):
products = Selector(response).xpath('//div[@id="elasticsearch-results-container"]/ul[@class="product-list clearfix"]')
for product in products:
item = GoodWillOutItem()
item['name'] = product.xpath('//div[@class="name ng-binding"]').extract()[0]
item['link'] = "www.thegoodwillout.com" + product.xpath('//@href').extract()[0]
# item['image'] = "http:" + product.xpath("/div[@class='catalogue-product-cover']/a[@class='catalogue-product-cover-image']/img/@src").extract()[0]
# item['size'] = '**NOT SUPPORTED YET**'
yield item
yield Request(GoodWillOutURL, callback=self.parse, dont_filter=True, priority=16)
这是我的GoodWillOutSpider类,这是我得到的错误:
[scrapy.core.scraper] ERROR: Spider error processing <GET https://www.thegoodwillout.com/footwear> (referer: None)
line 1085, in parse item['name'] = product.xpath('//div[@class="name ng-binding"]').extract()[0] IndexError: list index out of range
我想知道将来,如果不再问这里每个网站的正确xpath,我怎能得到
答案 0 :(得分:1)
如果您的抓取工具无法访问您使用浏览器开发人员工具可以看到的数据,则表明您的浏览器看不到相同的数据。
这可能意味着两件事之一:
解决这两个问题最直接的方法是使用实际的浏览器。
有许多无头浏览器可供选择,您可以根据需要选择最佳浏览器 对于scrapy,scrapy-splash可能是最简单的选择。
有时,您可以弄清楚这种不同行为的原因是什么,并更改您的代码 这通常是更有效的解决方案,但可能需要您做更多的工作。
例如,如果您的刮刀被重定向,您可能只需要使用不同的用户代理字符串,传递一些额外的标头或减慢您的请求。
如果内容是由javascript生成的,您可以查看页面源(response.text
或浏览器中的查看源代码),并弄清楚发生了什么。
之后,有两种可能性:
答案 1 :(得分:0)
IndexError:列表索引超出范围
在解压缩后,您需要首先检查列表是否有任何值
item['name'] = product.xpath('//div[@class="name ng-binding"]').extract()
if item['name']:
item['name'] = item['name'][0]