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. iOS苹果自带UIMenuController

    一.UIMenuController认识 1.默认情况下,UITextView / UITextFiled / UIWebView 都有苹果自带的有UIMenuController功能 2.UITex ...

  2. sudoku solver(数独)

    Write a program to solve a Sudoku puzzle by filling the empty cells. Empty cells are indicated by th ...

  3. 模拟IC芯片设计开发的流程

    模拟IC芯片设计开发的流程 IC的设计,模拟和数字, 还有混合IC, 在设计方法, 注意点, 工具等有明显的区别, 我主要以模拟无线接收IC系统设计为例说明. 一个IC芯片的设计开发大致包括如下步骤. ...

  4. 掌握 Java 泛型类型(一)

    为理解泛型类型为何如此有用,我们要将注意力转向 Java 语言中最容易引发错误的因素之一 - 需要不断地将表达式向下类型转换(downcast)为比其静态类型更为具体的数据类型(请参阅参考资料中的&q ...

  5. AbstractQueuedSynchronizer 原理分析 - Condition 实现原理

    1. 简介 Condition是一个接口,AbstractQueuedSynchronizer 中的ConditionObject内部类实现了这个接口.Condition声明了一组等待/通知的方法,这 ...

  6. Day4_装饰器

    装饰器: #模板def auth(func): def wrapper(*args,**kwargs): res=func(*args,**kwargs) return res return wrap ...

  7. ffmpeg转换参数和压缩输出大小的比率 参考 最新版本FFMPEG

    https://blog.cnlabs.NET/3668.html ffmpeg 转换压缩比例 FFMPEG如果是压缩为FLV文件 3个编码可选1. -c:v flv 标准FLV编码 这个好处是速度快 ...

  8. 关于css盒模型

    在css中,width和height指的是内容区域的宽度和高度.增加内边距,边框和外边距不会影响内容区域的尺寸,但是会增加元素框的总尺寸.假设框的每个边上有10个像素的外边距和5像素的内边距,如果希望 ...

  9. Flask表单(Flask-WTF)

    1.request.from获取POST表单数据 # hello.py #coding:utf-8 from flask import Flask,request,render_template ap ...

  10. 2、原生js实现轮播图特效

    很多很多网站经常会用到一个特效,那就是轮播图,对于日新月异的前端技术来说其实就是一个框架一个接口的事,但轮播的原理是什么?用最原始的javascript来写又是怎样的呢?本人是一枚菜鸟,这篇文章就当做 ...