Scrapy cookieJar session 的用法

應用場景

一般用于登錄賬號,保存cookie的場景來。

在requests用session登陸這篇講了怎么用同一個session控制cookies以達到登陸的需求,
在scrapy里主要用的是FormRequest和cookiejar,文檔這樣說

  1. 流程是start_request,帶著cookiejar發(fā)起request
  2. 在返回的response中找到formdata里面每回隨網(wǎng)頁變化的參數(shù)以及驗證碼的圖片地址,發(fā)起下載圖片的request,(因FormRequest.from_response第一個參數(shù)是response,在此需把response作為參數(shù)要把它傳入meta,同時把變化的參數(shù)和cookiejar傳入meta)
  3. 返回response下載驗證碼圖片后將驗證碼傳入formdata,通過FormRequest.from_response進行登陸,發(fā)起后續(xù)的要爬的數(shù)據(jù)的request記得把cookiejar帶上。

關于驗證碼:
因為邦購網(wǎng)的驗證碼是同一個網(wǎng)址,不同cookie傳回不同的驗證碼,所以必須用同一個session,則要帶著么他={'cookiejar': response.meta['cookiejar']}這項來下載圖片。
我看了別家爬取的豆瓣知乎之類scrapy 登陸豆瓣是用request直接找到驗證碼圖片下載,這種情況適應驗證碼的網(wǎng)址是唯一的。這就跟cookie無關了,因為什么時候訪問,返回的驗證碼都是一樣的。

關于post的時候用不用帶headers,
關于headers用不用帶這篇問答里說帶著能解決問題。

import scrapy
from pyquery import PyQuery as pq

class BangoSpider(scrapy.Spider):
name = 'bango'
allowed_domains = ['banggo.com']
start_urls = ['http://banggo.com/']

def start_requests(self):
    yield scrapy.Request(callback=self.parse_page_with_captcha, meta = {'cookiejar': 1},
                         url='https://passport.banggo.com/CASServer/login?service=http%3A%2F%2Fbgact.banggo.com%2Flogin.shtml%3Fr_url%3Dhttp%25253A%25252F%25252Fuser.banggo.com%25252Fmember%25252FOrder')

def parse_page_with_captcha(self,response):
    res = pq(response.body)
    lt =res('input').eq(-4).attr('value')
    data_for_lata = {'captcha_form': response,'ltvalue':lt, 'cookiejar': response.meta['cookiejar']}  
    yield scrapy.Request(url='https://passport.banggo.com/CASServer//custom/loginCode.do',
                         callback=self.parse_captcha_download, meta=data_for_lata)


def parse_captcha_download(self,response):

    output = open("yzm.png", "wb")
    output.write(response.body)
    output.close()

    captcha_form = response.meta['captcha_form']
    captcha_text = input('input:')
    headers = {
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
        'Accept-Encoding': 'gzip, deflate, br',
        'Accept-Language': 'en,zh-CN;q=0.9,zh;q=0.8,en-US;q=0.7',
        'Cache-Control': 'max-age=0',
        'Connection': 'keep-alive',
        'Content-Type': 'application/x-www-form-urlencoded',
        'Referer': 'https://passport.banggo.com/CASServer/login?service=http%3A%2F%2Fbgact.banggo.com%2Flogin.shtml%3Fr_url%3Dhttp%25253A%25252F%25252Fuser.banggo.com%25252Fmember%25252FOrder',
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'}
    data = {
        'username': ***,
        'password': ***,
        'vcode': captcha_text,
        'rememberUsername': 'on',
        'lt': response.meta['ltvalue'],
        '_eventId': 'submit',
        'loginType': '1',
        'lastIp': '112.193.157.37'
    }

    return scrapy.FormRequest.from_response(captcha_form, formdata=data, callback=self.login_in,
                                            headers=headers,meta={'cookiejar': response.meta['cookiejar']} )

def login_in(self,response):
    res = pq(response.body)
    add =(res('.mbshop_userCenterLeftNav a').eq(-4).attr('href'))
    return scrapy.Request(add,callback=self.detail)
def detail(self,response):
    res = pq(response.body)
    print(res('td').text())

參考:
https://stackoverflow.com/questions/27948326/scrapy-captcha

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容