Python模拟登陆让不少人伤透脑筋,今天奉上一种万能登陆方法。你无须精通HTML,甚至也无须精通Python,但却能让你成功的进行模拟登陆。本文讲的是登陆所有网站的一种方法,并不局限于微博与知乎,仅用其作为例子来讲解。

用到的库有“selenium”和“requests”。通过selenium进行模拟登陆,然后将Cookies传入requests,最终用requests进行网站的抓取。优点就是不但规避了“selenium”其本身抓取速度慢的问题(因为仅仅用其作为登陆),又规避了利用requests登陆时需要制作繁琐的Cookies的过程(因为是从selenium直接拿来cookies)。文章前面列出了步骤与代码,后面补充了登陆微博与知乎的实例。

文章最后给出了一个懒人的方法。想要走捷径的朋友直接看第四部知乎登陆。该方法适用于登陆所有网站,仅用知乎作为实例以方便讲解。

------------开始---------

需要材料:1.自己喜欢的webdriver (必须) 2.Anaconda(可选)。selenium是借助浏览器而运行的,因此需要额外下载一款小型浏览器。Anaconda推荐大家也去下载一个,它里面包含了众多python的库,用起来很方便,而且免费!
友情链接:
1.谷歌 Web Driver下载
2.Anaconda下载

第一部:利用selenium登陆

导入selenium库

from selenium import webdriver

明确模拟浏览器在电脑中存放的位置,比如我存在了D盘

chromePath = r'D:\Python Program\chromedriver.exe' 

用selenium的webdriver方程指明浏览器的路径,同时打开一个浏览器。模拟浏览器有多种可选,比如Firefox, Safari。本次用的是谷歌的模拟浏览器。注意:'.Chome'是大写字母。

wd = webdriver.Chrome(executable_path= chromePath)

让webdriver为你填写用户名和密码

wd.find_element_by_xpath('用户名选项卡位置').send_keys('用户名')
wd.find_element_by_xpath('密码选项卡位置').send_keys('密码')

让webdrive点击登陆,若是按钮就选择用click(),若是表单就选择submit()。

wd.find_element_by_xpath('登陆按钮所在位置').click() #若是按钮
wd.find_element_by_xpath('登陆按钮所在位置').submit() #若是表单

登陆完成,所有的cookies现在都存在了'wd'里面,可随时调用。

第二部:将selenium的cookies传入requests

导入requests库,并构建Session()

import reqeusts
req = requests.Session()

从‘wd'里调出cookies

cookies = wd.get_cookies()

将selenium形式的cookies转换为requests可用的cookies。

for cookie in cookies:
        req.cookies.set(cookie['name'],cookie['value'])

大功告成!尝试用requests来抓取网页。

req.get('待测试的链接')

以上就是python模拟登陆的万能方法,你无需分析传递给网站的Cookies。只需要告诉python在什么地方填写用户名与密码就可以。十分的便利。

第三部:微博模拟登陆

import requests
from selenium import webdriver
chromePath = r'浏览器存放位置'
wd = webdriver.Chrome(executable_path= chromePath) #构建浏览器
loginUrl = 'http://www.weibo.com/login.php'
wd.get(loginUrl) #进入登陆界面
wd.find_element_by_xpath('//*[@id="loginname"]').send_keys('userword') #输入用户名
wd.find_element_by_xpath('//*[@id="pl_login_form"]/div/div[3]/div[2]/div/input').send_keys('password') #输入密码
wd.find_element_by_xpath('//*[@id="pl_login_form"]/div/div[3]/div[6]/a').click() #点击登陆
req = requests.Session() #构建Session
cookies = wd.get_cookies() #导出cookie
for cookie in cookies:
    req.cookies.set(cookie['name'],cookie['value']) #转换cookies
test = req.get('待测试的链接')

解释下关键的几个步骤:

1.找位置。推荐使用谷歌浏览器来查找每个元素的Xpath,参看这个:从Chrome获取XPATH路径

2. 选择click函数还是submit函数。推荐每个都试一下,总会有一个成功的。

3.登陆微博是被要求输入验证码怎么办?有时登陆微博会被要求输入验证码,这个时候我们可以加一行手动输入验证码的代码。例如:

wd.find_element_by_xpath('//*[@id="pl_login_form"]/div/div[3]/div[6]/a').click() #点击登陆
wd.find_element_by_xpath('//*[@id="pl_login_form"]/div/div[3]/div[3]/div/input').send_keys(input("输入验证码: "))
wd.find_element_by_xpath('//*[@id="pl_login_form"]/div/div[3]/div[6]/a').click()#再次点击登陆

输入验证码的时候需要点击两次登陆。因为验证码的输入框只有在点击了一次登陆后才会弹出来!根据每个网站的不同而灵活应用selenium是十分重要的!但这个和分析那些Cookies比起来简直是太小儿科了。

第四部:知乎模拟登陆

知乎经常更新,因此即使方法写好了也可能不好用。因此我想到了一个终极方法,半手动登陆。仅用selenium打开一个浏览器,然后手动输入账号密码,有验证码就填验证码。等到成功登陆之后使用“get_cookies()”函数来调出它的Cookies。这个方法虽然看起来笨了点,但是效率比那些几百行的代码不知道要高多少!而且你还可以用手机扫描二维码登陆!只要这些登陆操作是在selenium所打开的浏览器内进行,selenium就可以完全记录下这些Cookies。代码如下:

import time
import requests
from selenium import webdriver
chromePath = r'浏览器储存的位置'
wd = webdriver.Chrome(executable_path= chromePath)
time.sleep(45)#设定45秒睡眠,期间进行手动登陆。十分关键,下面有解释。
cookies = wd.get_cookies()#调出Cookies
req = requests.Session()
for cookie in cookies:
    req.cookies.set(cookie['name'],cookie['value'])
req.headers.clear()
test = req.get('待测试的链接') 

req.headers.clear() 是删除原始req里面标记有python机器人的信息。这个信息会被一些网站(比如知乎)捕捉到。造成登陆爬取失败。务必要删除!

time.sleep()可以暂停执行下面的程序。在此期间你可以进行手动登陆,扫描二维码等。然后在45秒过后再让python执行后面的“cookies = wd.get_cookies()”。selenium的get.cookies方程可以抓取到你进行手动登陆过后的cookies。时间值的设定根据自己需要的时间。如果你在程序中已经将网站名、用户名、密码、等全部输入就剩下一个验证码需要手动的话,仅设定几秒钟就可以了!加入time.sleep的好处就是程序本身是不需要停止执行的!下面的所有程序可以无缝衔接。

感谢大家读到这,文章最初说的懒人方法就是我登陆知乎用到的这种方法,半手动。但是也不要觉得它不好,毕竟我们的目的是爬取网站的内容,尽快解决登陆问题。开始爬取工作才是正确的方向。这个方法可以帮您迅速登陆网站,节省大量时间。这个方法万能的原理就是它调用了真实的浏览器。那么只要在正常情况下浏览器能够访问的网站就都可以用这个方法登陆。


正文结束-以下是常见问题集锦以及代码赠送

问题1:如果网站禁用selenium怎么办?

解决方案:这种情况极少。网站如果采用这种反爬虫手段的话很容易误伤真正的用户。如果真的遇到这种情况,只需要隐藏掉selenium中显示你是机器人的信息就可以了。参考链接:Can a website detect when you are using selenium with chromedriver?

问题2:如何让新打开的webdriver带有曾经保存过的cookies?

解决方案:将获取的cookies保存在本地。下次登陆的时候直接导入本地的cookies。参考链接:How to save and load cookies using python selenium webdriver

友情赠送写好的登陆代码-知乎

from selenium import webdriver
from requests import Session
from time import sleep
req = Session()
req.headers.clear()
chromePath = r'D:\Python Program\chromedriver.exe'
wd = webdriver.Chrome(executable_path= chromePath)
zhihuLogInUrl = 'https://www.zhihu.com/signin'
wd.get(zhihuLogInUrl)
wd.find_element_by_xpath('/html/body/div[1]/div/div[2]/div[2]/div[1]/div[1]/div[2]/span').click()
wd.find_element_by_xpath('/html/body/div[1]/div/div[2]/div[2]/form/div[1]/div[1]/input').send_keys('username')
wd.find_element_by_xpath('/html/body/div[1]/div/div[2]/div[2]/form/div[1]/div[2]/input').send_keys('password')
sleep(10) #手动输入验证码
wd.find_element_by_xpath('/html/body/div[1]/div/div[2]/div[2]/form/div[2]/button').submit()
sleep(10)#等待Cookies加载
cookies = wd.get_cookies()
for cookie in cookies:
    req.cookies.set(cookie['name'],cookie['value'])

Python模拟登陆万能法-微博|知乎的更多相关文章

  1. Python模拟登陆新浪微博

    上篇介绍了新浪微博的登陆过程,这节使用Python编写一个模拟登陆的程序.讲解与程序如下: 1.主函数(WeiboMain.py): import urllib2 import cookielib i ...

  2. Python模拟登陆TAPD

    因为在wiki中未找到需要的数据,查询也很迷,打算用python登录tapd抓取所需项目下的wiki数据,方便查找. 2018-9-30 19:12:44 几步走 模拟登录tapd 抓取wiki页左侧 ...

  3. Python模拟登陆淘宝并统计淘宝消费情况的代码实例分享

    Python模拟登陆淘宝并统计淘宝消费情况的代码实例分享 支付宝十年账单上的数字有点吓人,但它统计的项目太多,只是想看看到底单纯在淘宝上支出了多少,于是写了段脚本,统计任意时间段淘宝订单的消费情况,看 ...

  4. python模拟登陆知乎并爬取数据

    一些废话 看了一眼上一篇日志的时间 已然是5个月前的事情了 不禁感叹光阴荏苒其实就是我懒 几周前心血来潮想到用爬虫爬些东西 于是先后先重写了以前写过的求绩点代码 爬了草榴贴图,妹子图网,后来想爬婚恋网 ...

  5. python 模拟登陆,请求包含cookie信息

    需求: 1.通过GET方法,访问URL地址一,传入cookie参数 2.根据地址一返回的uuid,通过POST方法,传入cooki参数 实现思路: 1.理解http的GET和POST差别 (网上有很多 ...

  6. python模拟登陆之下载

    好长时间没有更新博客了,哈哈. 今天公司给了这么一个需求,现在我们需要去淘宝获取上一天的订单号,然后再根据订单号去另一个接口去获取订单详情,然后再给我展示到web! 中间涉及到的技术点有: 模拟登陆 ...

  7. 使用python模拟登陆百度

    #!/usr/bin/python # -*- coding: utf- -*- """ Function: Used to demostrate how to use ...

  8. Python模拟登陆某网教师教育网

    本文转载自看雪论坛[作者]rdsnow 不得不说,最近的 Python 蛮火的,我也稍稍了解了下,并试着用 Python 爬取网站上的数据 不过有些数据是要登陆后才能获取的,我们每年都要到某教师教育网 ...

  9. Python模拟登陆

    模拟人人登陆 #encoding=utf-8 import urllib2 import urllib import cookielib def renrenBrower(url,user,passw ...

随机推荐

  1. Html5深受欢迎的理由

    一.世界知名浏览器厂商对Html5的支持 微软:2010年微软称完成Ie9的开发后,讲更对支持css3.svg和html5等互联网浏览通用标准. Google:2010年谷歌重点开发html5项目. ...

  2. palindrome number(回文数)

    Determine whether an integer is a palindrome. Do this without extra space. Some hints: Could negativ ...

  3. JavaScript继承详解

    面向对象与基于对象 在传统面向对象的语言中,有两个非常重要的概念 - 类和实例. 类定义了一类事物公共的行为和方法:而实例则是类的一个具体实现. 我们还知道,面向对象编程有三个重要的概念 - 封装.继 ...

  4. 初识Java——一维数组的创建及使用

    数组作为对象是允许使用new关键字进行内存分配的,在使用数组前,必须首先定义数组的变量所属的类型.一维数组的创建有两种方法: 1,先声明,再用new运算符进行内存分配 数组元素类型+数组名字[] 数组 ...

  5. MongoDB与CouchDB 全方位对比

    http://blog.nosqlfan.com/html/1519.html 本文见于MongoDB官方网站,MongoDB与CouchDB 很相似,他们都是文档型存储,数据存储格式都是JSON型的 ...

  6. ZAB协议(Zookeeper atomic Broadcast)

    一.简语: ZAB协议是Paxos算法的经典实现 二.ZAB协议的两种模式: 崩溃恢复: 1.每个server都有一张选票(myid,zxid),选票投给自己 2.收集所有server的投票 3.比较 ...

  7. 一天搞懂深度学习-训练深度神经网络(DNN)的要点

    前言 这是<一天搞懂深度学习>的第二部分 一.选择合适的损失函数 典型的损失函数有平方误差损失函数和交叉熵损失函数. 交叉熵损失函数: 选择不同的损失函数会有不同的训练效果 二.mini- ...

  8. cxf webservice生成客户端代码及调用服务端遇到的问题

    1.  从网上下载cxf开发的工具 apache-cxf-3.1.4.zip, 解压文件,找到apache-cxf-3.1.4\bin目录,里面包含一个wsdl2java文件 2. 设置环境变量 1. ...

  9. URL 规范 整理

    URL 规范 不用大写:(强制) 用中杠-不用下杠_:(强制) 参数列表要encode,编码使用utf-8:(强制) URI中的名词表示资源集合,使用复数形式.(建议) 增加版本号(建议) URI中统 ...

  10. Python_将指定文件夹中的文件压缩至已有压缩包

    from zipfile import ZipFile from os import listdir from os.path import isfile,isdir,join def addFile ...