首页 > 解决方案 > Splash:网站在呈现时将浏览器检测为阻止 Cookie

问题描述

我对 splash/scrapy 很陌生,目前正试图抓取一个需要登录/身份验证的基于 javascript 的网站。代替模拟浏览器浏览页面方式的 Selenium,我尝试使用 Scrapy,因为我需要抓取的页面数量以及网站和启动的速度使 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 上,因为当我尝试在 splash (localhost) 上渲染页面时,我从网站截图中得到了相同的消息,但没有登录。有人知道如何解决这个问题吗?非常感谢。

标签: pythonweb-scrapingscrapyscrapy-splashsplash-js-render

解决方案


推荐阅读