单击Scrapy-Splash中的显示按钮

时间:2019-06-25 16:06:43

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

我正在使用我必须登录的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

Snapshot of website HTML COde

2 个答案:

答案 0 :(得分:2)

您可以使用浏览器的开发人员工具来跟踪该click事件的请求,该事件采用一种不错的JSON格式,也不需要cookie(登录):

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

唯一需要填写的是与此请求相关的import React from 'react' componentDidMount(){ fetch(`https://jsonplaceholder.com/users/`) .then(res => res.hson()) .then(res => { .console.log(res) }) } const App = () => { return ( <h1>Hello</h1> ) } export default App; ,可以从HTML中提取该请求并在您的代码中声明。

类别名称:

category_id

类别ID:

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

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

答案 1 :(得分:2)

我已尝试使用lua脚本模拟刮擦飞溅的点击。它起作用了,您只需要将其与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

enter image description here