尝试使用 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
因为我无法登录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