单击 Scrapy-Splash 中的显示按钮
Click display button in 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
您可以使用浏览器的开发者工具来跟踪该点击事件的请求,这是一个很好的 JSON 格式,也不需要 cookie(登录):
http://www.starcitygames.com/buylist/search?search-type=category&id=5061
唯一需要填写的是与此请求相关的category_id
,这可以从HTML中提取并在您的代码中声明。
类别名称:
//*[@id="bl-category-options"]/option/text()
类别 ID:
//*[@id="bl-category-options"]/option/@value
使用 JSON 比解析 HTML 简单得多。
我尝试用 scrapy-splash 模拟点击,利用 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
我正在使用 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 格式,也不需要 cookie(登录):
http://www.starcitygames.com/buylist/search?search-type=category&id=5061
唯一需要填写的是与此请求相关的category_id
,这可以从HTML中提取并在您的代码中声明。
类别名称:
//*[@id="bl-category-options"]/option/text()
类别 ID:
//*[@id="bl-category-options"]/option/@value
使用 JSON 比解析 HTML 简单得多。
我尝试用 scrapy-splash 模拟点击,利用 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