【问题标题】:Scrapy parse pagination without next linkScrapy解析分页没有下一个链接
【发布时间】:2020-08-04 09:43:51
【问题描述】:

我正在尝试解析没有下一个链接的分页。 html是亲爱的:

<div id="pagination" class="pagination">
    <ul>
        <li>
            <a href="//www.demopage.com/category_product_seo_name" class="page-1 ">1</a>
        </li>
        <li>
            <a href="//www.demopage.com/category_product_seo_name?page=2" class="page-2 ">2</a>
        </li>
        <li>
            <a href="//www.demopage.com/category_product_seo_name?page=3" class="page-3 ">3</a>
        </li>
        <li>
            <a href="//www.demopage.com/category_product_seo_name?page=4" class="page-4 active">4</a>
        </li>
        <li>
            <a href="//www.demopage.com/category_product_seo_name?page=5" class="page-5">5</a>
        </li>
        <li>
            <a href="//www.demopage.com/category_product_seo_name?page=6" class="page-6 ">6</a>
        </li>
        <li>
                <span class="page-... three-dots">...</span>
        </li>
        <li>
           <a href="//www.demopage.com/category_product_seo_name?page=50" class="page-50 ">50</a>
        </li>
    </ul>   
</div>

对于这个 html,我尝试了这个 xpath:

response.xpath('//div[@class="pagination"]/ul/li/a/@href').extract()
or 
response.xpath('//div[@class="pagination"]/ul/li/a/@href/following-sibling::a[1]/@href').extract()

有没有好方法来解析这个分页?谢谢大家。

PS:我也检查了这个答案:

Answer 1

Answer 2

【问题讨论】:

    标签: parsing scrapy web-crawler


    【解决方案1】:

    一种解决方案是抓取 x 个页面,但如果页面总数不恒定,这并不总是一个好的解决方案:

    class MySpider(scrapy.spider):
        num_pages = 10
        def start_requests(self):
            requests = []
            for i in range(1, self.num_pages)
                requests.append(scrapy.Request(
                    url='www.demopage.com/category_product_seo_name?page={0}'.format(i)
                ))
            return requests
    
        def parse(self, response):
            #parse pages here.
    

    更新

    您还可以跟踪页数并执行类似的操作。 a[href~="?page=2"]::attr(href) 将针对 a 元素,其中 href 属性包含指定的字符串。 (我目前无法测试这段代码是否有效,但这种风格的东西应该可以)

    class MySpider(scrapy.spider):
        start_urls = ['https://demopage.com/search?p=1']
        page_count = 1
    
    
    def parse(self, response):
         self.page_count += 1
         #parse response
    
         next_url = response.css('#pagination > ul > li > a[href~="?page={0}"]::attr(href)'.format(self.page_count))
         if next_url:
             yield scrapy.Request(
                 url = next_url
             )
    

    【讨论】:

    • 感谢您的回复,但正如您所说,这不是一个好的解决方案。这只是一个结果。我有几个这样的结果,有些完成了 50 页,有些完成了 5 页。
    • 我已经测试过了,next_url 返回为空。
    • 您好,我忘记为您的解决方案提供反馈。稍作修改,它就对我有用。谢谢
    【解决方案2】:

    您可以简单地获取所有分页链接并在每次必须调用以下代码时在循环中运行它,并且选择器将返回可用的分页链接。您无需担心重复的 URL,因为 scrapy 会为您处理这个。您也可以使用 scrapy 规则。

     response.css('.pagination ::attr(href)').getall()
    

    【讨论】:

    • 感谢您的回复,但我认为必须有另一种方法来做到这一点。在我问这个问题之前,我对这个 response.css('div.pagination ul li a::attr(href)').extract() 有相同的解决方案
    猜你喜欢
    • 2021-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-18
    • 2023-03-24
    • 2021-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多