【发布时间】:2019-10-14 16:24:57
【问题描述】:
我正在尝试从goodreads 抓取引号、作者姓名和标签。我可以使用以下代码抓取单个页面
import scrapy
class goodReadsSpider(scrapy.Spider):
#identity
name='goodreads'
#requests
def start_requests(self):
url = 'https://www.goodreads.com/quotes?page=1'
yield scrapy.Request(url=url,callback=self.parse)
#reponse
def parse(self,response):
for quote in response.selector.xpath('//div[@class="quote"]'):
yield{
'text':quote.xpath('.//div[@class = "quoteText"]/text()[1]').extract(),
'author':quote.xpath('.//span[@class = "authorOrTitle"]').extract_first(),
'tags':quote.xpath('.//div[@class="greyText smallText left"]/a/text()').extract()
}
但是当我尝试通过添加以下代码来抓取同一个蜘蛛时
next_page = response.selector.xpath('//a[@class = "next_page"/@href').extract()
if next_page is not None:
next_page_link = response.urljoin(next_page)
yield scrapy.request(url=next_page_link, callback=self.parse)
我收到以下错误。
2019-05-29 10:47:14 [scrapy.core.engine] 信息:Spider 打开
2019-05-29 10:47:14 [scrapy.extensions.logstats] 信息:已爬取 0 页 (以 0 页/分钟),刮 0 项(以 0 项/分钟) 2019-05-29 10:47:14 [scrapy.extensions.telnet] 信息:Telnet 控制台正在监听 127.0.0.1:6023 2019-05-29 10:47:15 [scrapy.core.engine] 调试:已爬网 (200) https://www.goodreads.com/robots.txt>(参考: 无)2019-05-29 10:47:16 [scrapy.core.engine] 调试:已爬网(200) https://www.goodreads.com/quotes?page=1>(推荐人:无)
2019-05-29 10:47:16 [scrapy.core.scraper] 调试:从 https://www.goodreads.com/quotes?page=1> {'text': ["\n "不要 因为结束而哭泣,因为发生而微笑。”\n "], 'author': '\n 苏斯博士\n ', '标签': ['归因-无源','哭','哭','经验','幸福', “快乐”、“生活”、“错误的苏斯博士”、“乐观”、“悲伤”、 '微笑','微笑']} 2019-05-29 10:47:16 [scrapy.core.scraper] ERROR: Spider 错误处理 https://www.goodreads.com/quotes?page=1> (referer: None) Traceback (最近一次通话最后):文件 “c:\programdata\anaconda3\lib\site-packages\parsel\selector.py”,行 238,在 xpath
**kwargs) 文件“src/lxml/etree.pyx”,第 1586 行,在 lxml.etree._Element.xpath 文件“src/lxml/xpath.pxi”,第 307 行,在 lxml.etree.XPathElementEvaluator.调用文件 “src/lxml/xpath.pxi”,第 227 行,在 lxml.etree._XPathEvaluatorBase._handle_result
lxml.etree.XPathEvalError:无效的谓词在处理上述异常的过程中,又发生了一个异常:
Traceback(最近一次调用最后一次):文件 "c:\programdata\anaconda3\lib\site-packages\scrapy\utils\defer.py", 第 102 行,在 iter_errback
产生下一个(它)文件“c:\programdata\anaconda3\lib\site-packages\scrapy\spidermiddlewares\offsite.py”, 第 29 行,在 process_spider_output
对于 x 结果:文件“c:\programdata\anaconda3\lib\site-packages\scrapy\spidermiddlewares\referer.py”, 第 339 行,在
return (_set_referer(r) for r in result or ()) File "c:\programdata\anaconda3\lib\site-packages\scrapy\spidermiddlewares\urllength.py", 第 37 行,在
return (r for r in result or () if _filter(r)) File "c:\programdata\anaconda3\lib\site-packages\scrapy\spidermiddlewares\depth.py", 第 58 行,在
return (r for r in result or () if _filter(r)) File "C:\Users\Zona\Documents\Visual\demo_project\demo_project\spiders\goodreads.py", 第 23 行,解析中
next_page = response.selector.xpath('//a[@class= "next_page"/@href').extract() 文件 “c:\programdata\anaconda3\lib\site-packages\parsel\selector.py”,行 242,在 xpath
Six.reraise(ValueError, ValueError(msg), sys.exc_info()[2]) 文件“c:\programdata\anaconda3\lib\site-packages\six.py”,第 692 行,在 再加注
raise value.with_traceback(tb) 文件“c:\programdata\anaconda3\lib\site-packages\parsel\selector.py”,行 238,在 xpath
**kwargs) 文件“src/lxml/etree.pyx”,第 1586 行,在 lxml.etree._Element.xpath 文件“src/lxml/xpath.pxi”,第 307 行,在 lxml.etree.XPathElementEvaluator.调用文件 “src/lxml/xpath.pxi”,第 227 行,在 lxml.etree._XPathEvaluatorBase._handle_result ValueError: XPath 错误: //a[@class= "next_page"/@href
中的谓词无效 2019-05-29 10:47:16 [scrapy.core.engine] 信息:关闭蜘蛛 (已完成)2019-05-29 10:47:16 [scrapy.statscollectors] 信息: 转储 Scrapy 统计信息:{'downloader/request_bytes': 621,
'downloader/request_count': 2,
'downloader/request_method_count/GET': 2,
'downloader/response_bytes': 29812, 'downloader/response_count': 2, 'downloader/response_status_count/200': 2, 'finish_reason': “完成”、“完成时间”:datetime.datetime(2019, 5, 29, 5, 47, 16, 767370), 'item_scraped_count': 1, 'log_count/DEBUG': 3,
“日志计数/错误”:1,“日志计数/信息”:9,
'response_received_count': 2, 'robotstxt/request_count': 1,
'robotstxt/response_count': 1,
“robotstxt/response_status_count/200”:1,“调度程序/出队”:1, “调度程序/出队/内存”:1,“调度程序/入队”:1,
'调度程序/排队/内存':1,'spider_exceptions/ValueError':1, 'start_time': datetime.datetime(2019, 5, 29, 5, 47, 14, 108786)}
2019-05-29 10:47:16 [scrapy.core.engine] 信息:蜘蛛关闭 (完)
我不确定问题出在 xpath 上,因为在第一次尝试时我得到了
'item_scraped_count':30
但这里是 1,这意味着蜘蛛甚至没有抓取第一页。
【问题讨论】:
-
next_page = response.selector.xpath('//a[@class = "next_page"/@href').extract()这是您的问题,缺少]。 xpath 应该是'//a[@class = "next_page"]/@href
标签: python xpath web-scraping scrapy