4 使用Selenium模拟登录csdn,取出cookie信息,再用requests.session访问个人中心(保持登录状态)

摘要:
cookies=browser.get_cookies()exceptExceptionase:printprintfinally:browser.close()printNone#将之前selenium登录获得的cookie信息保存到requests的会话当中。s=requests.session()c=requests.cookies.RequestsCookieJar()foritemincookies:c.sets.cookies.updateheaders={"User-Agent":"Mozilla/5.0AppleWebKit/537.36Chrome/63.0.3239.26Safari/537.36Core/1.63.5193.400QQBrowser/10.0.1066.400"}url2="https://download.csdn.net/my"#这是从网页登录以后,才能进入的个人空间。然后用requests.session去访问个人中心页面,携带cookie信息,发现可以成功保持个人中心页面!

代码:

# -*- coding: utf-8 -*-
"""
Created on Fri Jul 13 16:13:52 2018

@author: a
"""

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
import time
import urllib.request
import urllib.parse
from urllib.error import URLError
from urllib.error import HTTPError
import requests

chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--headless')#无界面模式
#下面的代码是错误的使用方式
#browser = webdriver.Chrome(chrome_options=chrome_options,executable_path = "C:Program Files (x86)GoogleChromeApplicationchrome.exe")
#下面的代码是使用无界面模式
browser = webdriver.Chrome(chrome_options=chrome_options)
#browser = webdriver.Chrome()
print("xiaojie")
url="https://passport.csdn.net/account/login"
try:
    browser.get(url)
    data=browser.page_source
    print (len(data))
    
    target=browser.find_element_by_xpath('/html/body/div[3]/div/div/div[2]/div/h3/a')
    print("target:",target)
    target.click()

    locator=(By.ID,'username')
    WebDriverWait(browser, 20, 0.5).until(EC.presence_of_element_located(locator))    
    username=browser.find_element_by_id('username')
    print ("username:",username)
    time.sleep(3)
    username.clear()
    username.send_keys('183247166@qq.com')
    
    
    password=browser.find_element_by_id('password')
    print ("password:",password)
    password.clear()
    password.send_keys('xxx')
    
    submit=browser.find_element_by_xpath('//*[@id="fm1"]/input[8]')
    print ("submit:",submit)
    submit.click()
    #time.sleep(10)#不用等待页面刷新。这步操作是不需要的。
    
    #保存cookie信息。
    cookies=browser.get_cookies()

except Exception as e:
    print("driver出现异常")
    print (e)
finally:
    browser.close()
    print("over")
    None

#将之前selenium登录获得的cookie信息保存到requests的会话当中。
s=requests.session()
c = requests.cookies.RequestsCookieJar()
for item in cookies:
    c.set(item["name"],item["value"])
s.cookies.update(c)
headers={
        "User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.5193.400 QQBrowser/10.0.1066.400"
        }
url2="https://download.csdn.net/my"#这是从网页登录以后,才能进入的个人空间。
try:
    print("开始爬网页")
    response=s.get(url2,headers=headers)
    data=response.text
    print (len(data))
    print (data)
    fhandle=open("./验证cookie能使用的网页,断网打开.html","w",encoding='utf-8')
    fhandle.write(data.encode('utf-8').decode())
    fhandle.close()
    print ("验证cookie能使用的网页,断网打开.html已经成功生成")
except Exception as e:
    print(e)

这里面,取出cookie信息以后,浏览器就关闭了。然后用requests.session去访问个人中心页面,携带cookie信息,发现可以成功保持个人中心页面!

4 使用Selenium模拟登录csdn,取出cookie信息,再用requests.session访问个人中心(保持登录状态)第1张

我做过其它方面的实验,就是,如下的代码:

# -*- coding: utf-8 -*-
"""
Created on Fri Jul 13 16:13:52 2018

@author: a
"""

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
import time
import urllib.request
import urllib.parse
from urllib.error import URLError
from urllib.error import HTTPError
import requests

chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--headless')#无界面模式
#下面的代码是错误的使用方式
#browser = webdriver.Chrome(chrome_options=chrome_options,executable_path = "C:Program Files (x86)GoogleChromeApplicationchrome.exe")
#下面的代码是使用无界面模式
#browser = webdriver.Chrome(chrome_options=chrome_options)
browser = webdriver.Chrome()
print("xiaojie")
url="https://passport.csdn.net/account/login"
try:
    browser.get(url)
    data=browser.page_source
    print (len(data))
    curpage_url=browser.current_url
    print (curpage_url)
    
    
    target=browser.find_element_by_xpath('/html/body/div[3]/div/div/div[2]/div/h3/a')
    print("target:",target)
    target.click()

    locator=(By.ID,'username')
    WebDriverWait(browser, 20, 0.5).until(EC.presence_of_element_located(locator))    
    username=browser.find_element_by_id('username')
    print ("username:",username)
    time.sleep(3)
    username.clear()
    username.send_keys('183247166@qq.com')
    
    
    password=browser.find_element_by_id('password')
    print ("password:",password)
    password.clear()
    password.send_keys('xxx')
    
    submit=browser.find_element_by_xpath('//*[@id="fm1"]/input[8]')
    print ("submit:",submit)
    submit.click()
    curpage_url=browser.current_url
    print (curpage_url)
    #time.sleep(10)#不用等待页面刷新。这步操作是不需要的。
    
    #保存cookie信息。
    cookie =[item["name"] + ":" + item["value"] for item in browser.get_cookies()]
    print (cookie)
    cookiestr = ';'.join(item for item in cookie) 
    cook_map = {}
    for item in cookie:
        str = item.split(':')
        cook_map[str[0]] = str[1]
    print (cook_map)
    cookies = requests.utils.cookiejar_from_dict(cook_map, cookiejar=None, overwrite=True)
    s = requests.Session()
    s.cookies = cookies
    #使用urllib爬取网页
    #下面的代码并不能成功执行。
    headers=("User-Agent","Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.5193.400 QQBrowser/10.0.1066.400")
    opener=urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cookies))
    opener.addheaders=[headers]
    url2="https://download.csdn.net/my"#这是从网页登录以后,才能进入的个人空间。
    
    try:
        urllib.request.install_opener(opener)
        response=urllib.request.urlopen(url2)
        print("开始爬网页")
        fhandle=open("./验证cookie能使用的网页,断网打开.html","w",encoding='utf-8')
        fhandle.write(data.encode('utf-8').decode())
        fhandle.write(data)
        fhandle.close()
        print ("验证cookie能使用的网页,断网打开.html已经成功生成")
    except HTTPError as e:
        print("出现HTTP异常")
        print(e.code)
        print(e.reason)
    except URLError as e:
        print("出现URL异常")
        print(e.reason)
except Exception as e:
    print("driver出现异常")
    print (e)
finally:
    browser.close()
    print("over")
    None

我写的上面的代码是有问题的。打开保存的网页是:说明没有保持登录状态。

4 使用Selenium模拟登录csdn,取出cookie信息,再用requests.session访问个人中心(保持登录状态)第2张

如果还使用urllib.request.urlopen,并且将selenium模拟登录之后的cookie转变为CookieJar的方式,会发现不能保持登录状态访问。而精通Python网络爬虫一书中是要先创建CookieJar对象,创建全局的opener,然后再登录,这样的话,cookie会保存到全局的opener中,之后就能保持登录状态,继续使用urllib。但是,我这里先用selenimu模拟登录,之后才是基于得到的cookie创建CookieJar,然后再使用urllib。为什么会不行呢,

参考如下博客:

https://blog.csdn.net/warrior_zhang/article/details/50198699

python 利用selenium模拟登录帐号验证网站并获取cookie

其中包含两步:

6.通过对象的方法获取当前访问网站的session cookie:

#get the session cookie

cookie = [item["name"] + "=" + item["value"] for item in sel.get_cookies()]

#print cookie

cookiestr = ';'.join(item for item in cookie)

print cookiestr

7.得到cookie之后,就可以通过urllib2访问相应的网站,并可实现网页爬取等工作:

import urllib2

print '%%%using the urllib2 !!'

homeurl = sel.current_url

print 'homeurl: %s' % homeurl

headers = {'cookie':cookiestr}

req = urllib2.Request(homeurl, headers = headers)

try:

response = urllib2.urlopen(req)

text = response.read()

fd = open('homepage', 'w')

fd.write(text)

fd.close()

print '###get home page html success!!'

except:

print '### get home page html error!!'

它是将cookie放在headers中,之后再使用urllib。我们测试一下:

编写代码:

# -*- coding: utf-8 -*-
"""
Created on Fri Jul 13 16:13:52 2018

@author: a
"""

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
import time
import urllib.request
import urllib.parse
from urllib.error import URLError
from urllib.error import HTTPError

chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--headless')#无界面模式
#下面的代码是错误的使用方式
#browser = webdriver.Chrome(chrome_options=chrome_options,executable_path = "C:Program Files (x86)GoogleChromeApplicationchrome.exe")
#下面的代码是使用无界面模式
browser = webdriver.Chrome(chrome_options=chrome_options)
#browser = webdriver.Chrome()
print("xiaojie")
url="https://passport.csdn.net/account/login"
try:
    browser.get(url)
    data=browser.page_source
    print (len(data))
    curpage_url=browser.current_url
    print (curpage_url)
    
    
    target=browser.find_element_by_xpath('/html/body/div[3]/div/div/div[2]/div/h3/a')
    print("target:",target)
    target.click()

    locator=(By.ID,'username')
    WebDriverWait(browser, 20, 0.5).until(EC.presence_of_element_located(locator))    
    username=browser.find_element_by_id('username')
    print ("username:",username)
    time.sleep(3)
    username.clear()
    username.send_keys('183247166@qq.com')
    
    
    password=browser.find_element_by_id('password')
    print ("password:",password)
    password.clear()
    password.send_keys('xxx')
    
    submit=browser.find_element_by_xpath('//*[@id="fm1"]/input[8]')
    print ("submit:",submit)
    submit.click()
    curpage_url=browser.current_url
    print (curpage_url)
    #time.sleep(10)#不用等待页面刷新。这步操作是不需要的。
    
    #保存cookie信息。
    cookie =[item["name"] + ":" + item["value"] for item in browser.get_cookies()]
    print (cookie)
    cookiestr = ';'.join(item for item in cookie) 

    #使用urllib爬取网页
    #下面的代码并不能成功执行。
    headers={
            "User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.5193.400 QQBrowser/10.0.1066.400",
            "cookie":cookiestr
            }
    url2="https://download.csdn.net/my"#这是从网页登录以后,才能进入的个人空间。
    
    try:
        req=urllib.request.Request(url2,headers=headers)
        response=urllib.request.urlopen(req)
        data=response.read()
        print("开始爬网页")
        fhandle=open("./验证cookie能使用的网页,断网打开.html","wb")
        fhandle.write(data)
        fhandle.close()
        print ("验证cookie能使用的网页,断网打开.html已经成功生成")
    except HTTPError as e:
        print("出现HTTP异常")
        print(e.code)
        print(e.reason)
    except URLError as e:
        print("出现URL异常")
        print(e.reason)
except Exception as e:
    print("driver出现异常")
    print (e)
finally:
    browser.close()
    print("over")
    None

结果还是不行。具体原因有待研究。

免责声明:文章转载自《4 使用Selenium模拟登录csdn,取出cookie信息,再用requests.session访问个人中心(保持登录状态)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇华为鲲鹏处理器实现商用,Arm服务器又添砝码jenkins 使用pipeline同时发布处理多个项目下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

ASP.NET 中实现会话状态的基础

简介 在 Web 应用程序这样的无状态环境中,了解会话状态的概念并没有实际的意义。尽管如此,有效的状态管理对于大多数 Web 应用程序来说都是一个必备的功能。Microsoft® ASP.NET 以及许多其他服务器端编程环境都提供了一个抽象层,允许应用程序基于每个用户和每个应用程序存储持久性数据。 需要特别注意的是,Web 应用程序的会话状态是应用程序在不...

微信--高效解决token及授权用户openid的持久化处理办法

摘要        关于微信开发的话题,例子确实已经有不少,但大部分都是人云亦云,很多小细节或者需要注意的地方却大多没有讲清楚,这令很多刚开始开发的人感觉大很迷茫。而我今天要说的话题,主要着眼于两个方面。 一:如何存储获取用户信息及调用第三方接口所需要的token. 二 : 第三方页面授权,如何减少从微信服务器获取用户openid的次数以及减少获取用户信...

arale-cookie 使用

https://www.npmjs.com/package/arale-cookiearale-cookie 使用 define(function() { var Cookie = require('cookie'); Cookie.set('foo', 3); Cookie.set('bar', 4, {...

python爬虫+使用cookie登录豆瓣

2017-10-09 19:06:22 版权声明:本文为博主原创文章,未经博主允许不得转载。 前言:先获得cookie,然后自动登录豆瓣和新浪微博 系统环境: 64位win10系统,同时装python2.7和python3.6两个版本(本次使用python3.6),IDE为pycharm,浏览器为chorme,使用的python第三方库为requests...

Selenium

今天突然想了解下Selenium。虽然很久以前,有特意学过Selenium,也用C#写入测试样例,但由于那时什么都没有记录下来,之前积累的经验为0了。以后对自己做过的项目,学过的技术,过一段时间后,要进行总结。自己写的 StartSelenium.bat 脚本 java -jar "D:Selemiumselenium-server-standalone-...

Jmeter常见问题(更新ing)

1、响应数据有乱码       响应数据中有乱码时,可修改jmeterinjmeter.properties文件中的一个属性:将encoding=后面的编码格式改为utf-8, 如下图:              注意:jmeter的jmeter.properties属性值修改后,需要重启jmeter才可以生效 2、请求数据有乱码       请求数据中有...