微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用Scrapy-Splash尝试登录

如何解决使用Scrapy-Splash尝试登录

由于我无法登录https://www.duif.nl/login,因此我尝试了许多类似硒的方法,虽然我成功登录了该方法,但没有设法开始爬网。

现在我用刮擦飞溅试试运气,但我无法登录:(

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

loginpage

好吧,应该有一个登录名,例如用户名和密码,但是看不到吗?

我像登录表单前的一个星期一样坐在这里,失去了生存的意愿。

我的最后一个问题甚至没有得到一个答案,现在我再试一次。

这是登录表单的HTML代码

html

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

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

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

更新

我设法成功登录:-)现在,我只需要知道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是可行的方法,因为即使有普通的Request表单,也是如此:response.xpath('//form[@id="login-form"]')
  • 该页面上有多种表单,因此您必须指定创建FormRequest.from_response所基于的表单。最好同时指定点击数据(因此转到“登录”,而不是“忘记密码”)。总之,它看起来像这样:
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即可。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。