Нажмите кнопку отображения в Scrapy-Splash - PullRequest
4 голосов
/ 25 июня 2019

Я пользуюсь следующей веб-страницей, используя 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 ]

2 голосов
/ 04 июля 2019

Я пытался эмулировать щелчок с помощью scrapy-splash, используя скрипт lua.Это работает, вам просто нужно интегрировать это с 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

2 голосов
/ 28 июня 2019

Вы можете использовать инструменты разработчика вашего браузера, чтобы отслеживать запрос этого события клика, который находится в хорошем формате 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.

...