【问题标题】:Click Button in Scrapy-Splash单击 Scrapy-Splash 中的按钮
【发布时间】:2019-11-04 11:19:55
【问题描述】:

我正在写一个scrapy-splash程序,我需要点击网页上的显示按钮,如下图所示,为了显示数据,第10版,所以我可以抓取它。我有我在下面尝试过的代码,但它不起作用。只有单击显示按钮才能访问我需要的信息。 更新:仍在为此苦苦挣扎,我必须相信有办法做到这一点。我不想抓取 JSON,因为这对网站所有者来说可能是一个危险信号。

import scrapy
from ..items import NameItem

class LoginSpider(scrapy.Spider):
    name = "LoginSpider"
    start_urls = ["http://www.starcitygames.com/buylist/"]

    def parse(self, response):

        return scrapy.FormRequest.from_response(
        response,
        formcss='#existing_users form',
        formdata={'ex_usr_email': 'email123@example.com', 'ex_usr_pass': 'password123'},
        callback=self.after_login
        )


    def after_login(self, response):
        item = NameItem()
        display_button= response.xpath('//a[contains(., "- Display>>")]/@href').get()
        response.follow(display_button, self.parse)
        item["Name"] = response.css("div.bl-result-title::text").get()
        return item

【问题讨论】:

    标签: python scrapy scrapy-splash splash-js-render


    【解决方案1】:

    您的代码无法运行,因为没有锚元素和 href 属性。单击该按钮将向http://www.starcitygames.com/buylist/search?search-type=category&id=5061 发送XMLHttpRequest,并在JSON 响应中找到您想要的数据。

    1. 要检查请求 URL 和响应,请打开 Dev Tools -> Network -> XHR 并单击 Display。
    2. 在 Headers 选项卡中,您可以找到请求 URL,在 Preview 或 Response 选项卡中,您可以检查 JSON。
    3. 如您所见,您需要一个类别 id 来构建请求 URL。您可以通过解析使用此 XPath //script[contains(., "categories")] 找到的 script 元素来找到它
    4. 然后您可以将您的请求从蜘蛛发送到http://www.starcitygames.com/buylist/search?search-type=category&id=5061 并获取您想要的数据。
    $ curl 'http://www.starcitygames.com/buylist/search?search-type=category&id=5061'
    {"ok":true,"search":"10th Edition","results":[[{"id":"46269","name":"Abundance","subtitle":null,"condition":"NM\/M","foil":true,"is_parent":false,"language":"English","price":"20.000","rarity":"Rare","image":"cardscans\/MTG\/10E\/en\/foil\/Abundance.jpg"},{"id":"176986","name":"Abundance","subtitle":null,"condition":"PL","foil":true,"is_parent":false,"language":"English","price":"12.000","rarity":"Rare","image":"cardscans\/MTG\/10E\/en\/foil\/Abundance.jpg"}....
    

    如您所见,您甚至不需要登录网站或Splash。

    【讨论】:

    • 听起来好像可以,但我还是有点困惑。我应该将该 url 设置为我的 start_url 吗?或者我应该让我的程序从原始 url 重定向到那个页面?如果我只是将该 url 作为我的 start_url 传递,我会有点担心网站所有者将此程序识别为网络爬虫,因为大多数人不会访问网站的 JSON 数据页面。
    • @tnorth2620 如果您知道要抓取的类别是什么,是的,您可以将它们硬编码到 start_urls 列表中。如果您使用无头浏览器,则更有可能被检测到(如果是这种情况)。使用此解决方案,您只是向 Web API 发出请求,类似于您尝试抓取的 Web 应用程序。如果这行得通(并且确实如此),请坚持下去,因为在您的情况下,这是最简单,最有效的技术。如果你仍然想使用 Splash,你应该从这里开始:splash.readthedocs.io/en/stable 和这里 github.com/scrapy-plugins/scrapy-splash
    • 有关使用普通 Scrapy 处理动态内容的更多信息,请参阅docs.scrapy.org/en/latest/topics/dynamic-content.html
    猜你喜欢
    • 2019-11-07
    • 2018-04-17
    • 1970-01-01
    • 2011-10-04
    • 1970-01-01
    • 2019-05-31
    • 2016-06-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多