【问题标题】:Getting to the next page using scrapy使用scrapy进入下一页
【发布时间】:2019-05-29 00:11:59
【问题描述】:

我正在尝试制作网页抓取工具,但无法获取下一页的链接。我尝试了一些组合,但它们都不起作用。 scrapy.org 上的教程格式更简单,因此无法解决我的问题

我正在抓取的网站具有以下布局:

<nav class="nav_class">
    <a class="class_1" href="1.html">
    <a class="class_2" href="2.html">
    <a class="class_3" href="3.html">

我想使用 css 选择器获取 3.html 链接

import scrapy


class MySpider(scrapy.Spider):
    name = "flip_spider"

    def start_requests(self):
        urls = [
            "https://www.flipkart.com/mobiles/pr?sid=tyy%2C4io&p%5B%5D=facets.processor_brand%255B%255D%3DSnapdragon&p%5B%5D=facets.serviceability%5B%5D%3Dfalse&p%5B%5D=facets.offer_type%255B%255D%3DExchange%2BOffer&otracker=clp_banner_1_10.bannerX3.BANNER_mobile-phones-store_HPUGCU9BYBF6&fm=neo%2Fmerchandising&iid=M_934db066-154e-4074-a4b1-96f56a0af28e_6.HPUGCU9BYBF6&ppt=HomePage&ppn=Home&ssid=85m4yqvgzk0000001558978084715&page=1",
        ]

        for url in urls:
            yield scrapy.Request(url, callback=self.parse)

    def parse(self, response):
        # page_id=response.url.split("=")[-1]
        phone_details = response.css("div._1-2Iqu.row")

        for ph in phone_details:
            phone = ph.css("div._3wU53n::text").get()
            rating = ph.css("div.hGSR34::text").get()
            price = ph.css("div._1vC4OE._2rQ-NK::text").get()

            yield{
                "name": phone,
                "rating": rating,
                "price": price,
            }
        final = "https://www.flipkart.com/mobiles/pr?sid=tyy%2C4io&p%5B%5D=facets.processor_brand%255B%255D%3DSnapdragon&p%5B%5D=facets.serviceability%5B%5D%3Dfalse&p%5B%5D=facets.offer_type%255B%255D%3DExchange%2BOffer&otracker=clp_banner_1_10.bannerX3.BANNER_mobile-phones-store_HPUGCU9BYBF6&fm=neo%2Fmerchandising&iid=M_934db066-154e-4074-a4b1-96f56a0af28e_6.HPUGCU9BYBF6&ppt=HomePage&ppn=Home&ssid=85m4yqvgzk0000001558978084715&page=6"
        next_page_id = response.css("nav._1ypTlJ a._3fVaIS::attr(href)").get()

        # ^This is the line I need help with

        if next_page_id is not final:
            next_page = response.urljoin(next_page_id)
            yield scrapy.Request(next_page, callback=self.parse)

它只抓取第一页然后停止

【问题讨论】:

  • 您确定这些类存在于 HTML 代码中吗?尝试将页面下载到本地文件并使用文本编辑器打开它,然后尝试找到那些 HTML 类(例如_1ypTlJ)。另外,考虑先使用scrapy shell 来测试你的XPath 表达式,这个问题可能也可以用它重现,而且它会使你的问题代码更短。
  • 我检查了网站以找出这些课程。我也做了同样的事情来找出 div 类,并且代码在那里运行良好。我仍然会尝试下载它以获得更好的外观。谢谢!
  • 请注意,Web 浏览器检查器不会显示 HTML 结构。它是 DOM,它并不总是(而且通常不)代表实际的底层 HTML。它几乎总是包含额外的 HTML 元素(例如,表格中的 &lt;tbody&gt;)并且经常被 JavaScript 代码修改。事实上,像您的代码中那些看似随机的 HTML 类名很可能是从 JavaScript 自动生成的。
  • 我不知道,谢谢你的帮助!

标签: python scrapy


【解决方案1】:

把你的代码改成这个就行了

next_page_id = response.css("nav._1ypTlJ a._3fVaIS::attr(href)").get()

if next_page_id:
    next_page = response.urljoin(next_page_id)
    yield scrapy.Request(next_page, callback=self.parse)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-08
    • 2018-06-10
    • 2015-12-13
    • 1970-01-01
    • 2016-11-09
    相关资源
    最近更新 更多