【问题标题】:Click display button in Scrapy-Splash单击 Scrapy-Splash 中的显示按钮
【发布时间】:2019-11-07 12:44:27
【问题描述】:

我正在使用 scrapy-splash http://www.starcitygames.com/buylist/ 抓取以下网页,我必须登录该网页才能获取我需要的数据。这很好,但为了获取我需要单击显示按钮的数据,以便我可以抓取该数据,我需要的数据在单击按钮之前无法访问。我已经得到了一个答案,告诉我我不能简单地单击显示按钮并抓取显示的数据,我需要抓取与该信息关联的 JSON 网页,但我担心抓取 JSON 会变成红色标记给网站的所有者,因为大多数人不会打开 JSON 数据页面,人类需要几分钟才能找到它,而计算机会快得多。所以我想我的问题是,无论如何要刮掉我点击显示的网页并从那里开始,还是我别无选择,只能刮掉 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': 'abc@example.com', 'ex_usr_pass': 'password'},
        callback=self.after_login
        )



    def after_login(self, response):
        item = NameItem()
        display_button = response.xpath('//a[contains(., "Display>>")]/@href').get()

        yield response.follow(display_button, self.parse)

        item["Name"] = response.css("div.bl-result-title::text").get()
        return item

【问题讨论】:

  • 如果您对 json 响应不感兴趣,请使用任何浏览器模拟器(如 selenium)单击该按钮并按照您在该网页中看到的方式解析结果。 Splash 可能是最好的选择,但我还不熟悉,所以我不能肯定地告诉你。
  • 我在您的代码中的任何地方都没有看到飞溅?您提到了 splash 但没有在任何地方使用它?如果你关注blog.scrapinghub.com/2015/03/02/…的文章,你会发现你需要的是一个非常简单的案例。唯一的问题是您使用的是普通的 scrapy 请求对象而不是 SplashRequest 对象

标签: python web-scraping scrapy splash-screen scrapy-splash


【解决方案1】:

我尝试使用 lua 脚本来模拟使用 scrapy-splash 的点击。它有效,您只需将其与 scrapy 集成并操作内容。 我留下了脚本,我在其中完成了与 scrapy 的集成。

function main(splash)
  local url = 'https://www.starcitygames.com/login'
  assert(splash:go(url))
  assert(splash:wait(0.5))
  assert(splash:runjs('document.querySelector("#ex_usr_email_input").value = "your@email.com"'))
  assert(splash:runjs('document.querySelector("#ex_usr_pass_input").value = "your_password"'))
  splash:wait(0.5)
  assert(splash:runjs('document.querySelector("#ex_usr_button_div button").click()'))
  splash:wait(3)
  splash:go('https://www.starcitygames.com/buylist/')
  splash:wait(2)
  assert(splash:runjs('document.querySelectorAll(".bl-specific-name")[1].click()'))
  splash:wait(1)
  assert(splash:runjs('document.querySelector("#bl-search-category").click()'))
  splash:wait(3)
  splash:set_viewport_size(1200,2000)
  return {
    html = splash:html(),
    png = splash:png(),
    har = splash:har(),
  }
end

【讨论】:

    【解决方案2】:

    您可以使用浏览器的开发者工具来跟踪该点击事件的请求,它是一个很好的JSON格式,也不需要cookie(登录):

    http://www.starcitygames.com/buylist/search?search-type=category&id=5061

    唯一需要填写的是与此请求相关的category_id,这可以从HTML中提取并在您的代码中声明。

    类别名称:

    //*[@id="bl-category-options"]/option/text()
    

    类别编号:

    //*[@id="bl-category-options"]/option/@value
    

    使用 JSON 比解析 HTML 简单得多。

    猜你喜欢
    • 2019-11-04
    • 2018-04-17
    • 1970-01-01
    • 2011-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-07
    相关资源
    最近更新 更多