问题描述
我对飞溅/刮擦很陌生,目前正在尝试抓取一个需要登录/身份验证的基于 javascript 的网站。由于需要爬取的页面数量和网站速度,我尝试使用 Scrapy,而不是模拟浏览器浏览页面方式的 Selenium,Scrapy 可以爬行基于 javascript 的页面。然而,每当我尝试抓取scrapy项目时,该网站似乎检测到浏览器正在阻止cookie,如下所示。
下面是我的代码:
class CiqbankSpider(scrapy.Spider):
name = 'ciqbank'
allowed_domains = ['capitaliq.com']
start_urls = 'https://capitaliq.com/'
login_page = 'https://www.capitaliq.com/ciqdotnet/login-sso.aspx?'
def start_requests(self):
LUA_SCRIPT = """
function main(splash,args)
splash:init_cookies(splash.args.cookies),splash:go("https://www.capitaliq.com/ciqdotnet/login-sso.aspx?"),splash:wait(15),local title = splash.evaljs("document.title"),return {
title=title,cookies = splash:get_cookies(),},end
"""
yield SplashRequest(
url=self.login_page,callback=self.parse_login,dont_filter=True,endpoint='execute',args={'wait':15}),'lua_source':LUA_SCRIPT})
def parse_login(self,response):
return FormRequest.from_response(
response,formdata={
'__VIEWSTATE': response.xpath("//*[@id='__VIEWSTATE']/@value").extract_first(),'__VIEWSTATEGENERATOR': response.xpath("//*[@id='__VIEWSTATEGENERATOR']/@value").extract_first(),'__EVENTVALIDATION': response.xpath("//*[@id='__EVENTVALIDATION']/@value").extract_first(),'captchaValidated': '0','username': '******','password': '******','PersistentLogin': 'false'
},callback=self.parse_afterlogin
)
def parse_afterlogin(self,response):
if response.xpath('//a[@href="/CIQDotNet/logout.aspx"]/text()').extract_first() is not None:
print("Successfully Logged In")
Account_Name = response.xpath('//div[@class="cPageTitle"]/div/span/text()').extract_first
print("Account Name: "+Account_Name.replace('Welcome ',''))
else:
print("\nLogin unsucessful\n")
open_in_browser(response)
yield
起初我认为这与 POST 请求有关,因为我不熟悉 Viewstate 的东西,所以我尝试使用 scrapy-selenium 组合来解决,这也不起作用。事实证明,问题出在 Splash 上,因为当我尝试在飞溅(本地主机)上渲染页面时,我从网站截图中得到了相同的消息,但没有登录。有人知道如何解决这个问题吗?非常感谢。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)