【问题标题】:Unable to crawl multiple pages无法抓取多个页面
【发布时间】: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


【解决方案1】:

您必须解决两个问题才能使您的下一页链接正常工作。除了@pako 指出的内容之外,您还可以使用.extract_first().get() 来获取数组的第一项。更正后的应该更像.xpath('//a[@class="next_page"]/@href').get()。我已经重写了你的一些 xpath 以从输出中剔除空格。

class goodReadsSpider(scrapy.Spider):
    name='goodreads'

    start_urls = ['https://www.goodreads.com/quotes?page=1']

    def parse(self,response):
        for quote in response.xpath('//div[@class="quote"]'):
            yield {
                'text':quote.xpath('normalize-space(.//div[@class="quoteText"]/text())').getall(),
                'author':quote.xpath('normalize-space(.//span[@class="authorOrTitle"]/text())').get(),
                'tags':quote.xpath('.//div[contains(@class,"greyText")]/a/text()').getall()
            }

        next_page = response.xpath('//a[@class="next_page"]/@href').get()
        if next_page:
            nlink = response.urljoin(next_page)
            yield scrapy.Request(url=nlink,callback=self.parse)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多