尝试使用 Scrapy-Splash 登录

Attempting login with Scrapy-Splash

因为我无法登录https://www.duif.nl/login,我尝试了很多不同的方法,比如selenium,我成功登录了,但是没能开始抓取。

现在我用 scrapy-splash 试试运气,但我无法登录:(

如果我用启动画面渲染登录页面,我会看到下图:

嗯,应该有一个登录表单,比如用户名和密码,但是 scrapy 看不到它?

我在那个登录表单前坐了一个星期,失去了生活的意志..

我最后一个问题连一个答案都没有,现在我再试一次。

这里是登录表单的 html 代码:

当我登录手册时,我被重定向到“/login?returnUrl=”,在那里我只有这些 form_data:

我的代码

# -*- coding: utf-8 -*-
import scrapy
from scrapy_splash import SplashRequest
from scrapy.spiders import CrawlSpider, Rule
from ..items import ScrapysplashItem
from scrapy.http import FormRequest, Request
import csv

class DuifSplash(CrawlSpider):
    name = "duifsplash"
    allowed_domains = ['duif.nl']
    login_page = 'https://www.duif.nl/login'
    with open('duifonlylinks.csv', 'r') as f:
        reader = csv.DictReader(f)
        start_urls = [items['Link'] for items in reader]
        
    def start_requests(self):
        yield SplashRequest(
        url=self.login_page,
        callback=self.parse,
        dont_filter=True
        )
        
    def parse(self, response):
        return FormRequest.from_response(
            response,
            formdata={
                'username' : 'not real',
                'password' : 'login data',
            },  callback=self.after_login)
        
    def after_login(self, response):
        accview = response.xpath('//div[@class="c-accountbox clearfix js-match-height"]/h3')
        if accview:
            print('success')
        else:
            print(':(') 

        for url in self.start_urls:
            yield response.follow(url=url, callback=self.parse_page)            

    def parse_page(self, response):
        productpage = response.xpath('//div[@class="product-details col-md-12"]')
        
        if not productpage:
            print('No productlink', response.url)
            
        for a in productpage:
            
            items = ScrapysplashItem()
            items['SKU'] = response.xpath('//p[@class="desc"]/text()').get()
            items['Title'] = response.xpath('//h1[@class="product-title"]/text()').get()
            items['Link'] = response.url
            items['Images'] = response.xpath('//div[@class="inner"]/img/@src').getall()
            items['Stock'] = response.xpath('//div[@class="desc"]/ul/li/em/text()').getall()
            items['Desc'] = response.xpath('//div[@class="item"]/p/text()').getall()
            items['Title_small'] = response.xpath('//div[@class="left"]/p/text()').get()
            items['Price'] = response.xpath('//div[@class="price"]/span/text()').get()
            yield items

在我的“准备工作”中,我抓取了每个内部 link 并将其保存到一个 .csv 文件中,我在其中分析了哪些 link 是产品 link而哪些不是。 现在我想知道,如果我打开我的 csv 的 link,它是否会打开经过身份验证的会话? 找不到饼干,这个我也很奇怪

更新

我成功登录了 :-) 现在我只需要知道 cookie 存储在哪里

Lua 脚本

LUA_SCRIPT = """
function main(splash, args)
    splash:init_cookies(splash.args.cookies),
    splash:go("https://www.duif.nl/login"),
    splash:wait(0.5),
    local title = splash.evaljs("document.title"),
    return {
        title=title,
        cookies = splash:get_cookies(),
        },
end
"""
  • 我不认为在这里使用 Splash 是可行的方法,因为即使是普通请求,也有表单:response.xpath('//form[@id="login-form"]')
  • 页面上有多种形式,因此您必须指定要基于哪种形式来制作 FormRequest.from_response。最好也指定 clickdata(因此它转到 'Login',而不是 'forgot password')。总之,它看起来像这样:
req = FormRequest.from_response(
            response,
            formid='login-form',
            formdata={
                'username' : 'not real',
                'password' : 'login data'},
            clickdata={'type': 'submit'}
            )
  • 如果您不使用 Splash,则不必担心传递 cookie - 这由 Scrapy 处理。只要确保你没有在 settings.py
  • 中输入 COOKIES_ENABLED=False