Python模拟登陆万能法-微博|知乎

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‘])
时间: 2024-10-12 23:19:20

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

Python模拟登陆万能法

此文转自:https://zhuanlan.zhihu.com/p/28587931   转录只是为了方便学习,感谢他的分享 Python模拟登陆让不少人伤透脑筋,今天奉上一种万能登陆方法.你无须精通HTML,甚至也无须精通Python,但却能让你成功的进行模拟登陆.本文讲的是登陆所有网站的一种方法,并不局限于微博与知乎,仅用其作为例子来讲解. 用到的库有"selenium"和"requests".通过selenium进行模拟登陆,然后将Cookies传入reque

微博模拟登陆后发文字微博以及自动关注用户

import requestsimport base64import timeimport rsaimport binasciiimport urllib.parseimport re,urllibfrom bs4 import BeautifulSoupclass WeiBo(): def __init__(self): self.session = requests.session() self.headers = { 'User-Agent':'Mozilla/5.0 (Windows N

Python模拟登陆练习——imooc.com登陆

写下这篇文章的时候,是博主学习python的第三天( 也许是第四天:( ),python是博主接触的第二门解释型语言(第一门是javascript). 讲真在很久之前就想要用博客记录自己的学习历程了,然而就像写日记一样,写着写着就放弃了-.- so今天决定给自己一个好的开端~ 博主的学习方式是直奔目的,遇到问题百度各种博客,网站,百度找不到google找,就这样.这种学习方式是真的见效快,但显而易见,基础会比较薄弱. 因此学习python的基本语法,就直奔爬虫了! ---------------

python模拟登陆实践

对于一些需要登陆的网址爬取数据,需要登录才能访问.本文介绍如何利用python进行模拟登陆 准备工具: 1.搭建django 框架 用于模拟登陆 2.fiddler抓包工具,chrome浏览器 3.pycharm   编辑器 步骤: 1.开启django 服务,这里就不多描述,直接百度一下,就能找到很多答案(记得创建一个superuser,以便后面的登陆 ) 进入 http://127.0.0.1:8000/admin/     这是django自带的后台,进行登陆时,django自带了  cs

Python模拟登陆:模拟登陆电子科大信息门户测试

最近在学习Python的网络操作,网上有很多模拟登陆方法.这里做个笔记. 没有验证码的还是比较容易的. #coding:utf-8 import re import urllib import urllib2 import cookielib import os import json import sys import time from urllib import quote,unquote from urllib2 import HTTPError from urllib2 import

通过抓包,实现Python模拟登陆各网站,原理分析!

一.教程简介 1.1 基本介绍 通过分析登陆流程并使用 Python 实现模拟登陆到一个实验提供的网站,在实验过程中将学习并实践 Python 的网络编程,Python 实现模拟登陆的方法,使用 Firefox 抓包分析插件分析网络数据包等知识. 模拟登录可以帮助用户自动化完成很多操作,在不同场合下有不同的用处,无论是自动化一些日常的繁琐操作还是用于爬虫都是一项很实用的技能.本课程通过 Firefox 和 Python 来实现,环境要求如下: Python 库:urllib, http.cook

Python模拟登陆

模拟人人登陆 #encoding=utf-8 import urllib2 import urllib import cookielib def renrenBrower(url,user,password): #登陆页面,能够通过抓包工具分析获得,如fiddler.wireshark login_page = "http://www.renren.com/PLogin.do" try: #获得一个cookieJar实例 cj = cookielib.CookieJar() #cook

Python模拟登陆3: 进入选课系统(手工输入验证码阶段)

其实最想做的是选课插件,于是这次试试了下选课系统,但是选课系统 有验证码. 很是蛋疼. 需要识别. 但是现在可以用另一种方法.就是下载到本地手动输入.也只需要一次就够了.因为登陆成功后就可以随意操作其他东西了. 后面再学习验证码的智能识别. 首先主要是模拟逻辑是.先设置一个cookie存储器,用它去访问验证码链接.然后会得到cookie.还有下载好的验证码图片,就在本地.然后再把验证码,用户名,密码,和那个cookie一起提交到登陆.于是cookie就一致了. 有点不舒服的就是需要在本地看下那个

Python模拟登陆2:获取电子科大研究生成绩

前面小试了一把 能够成功登陆,但是这下要获取成绩可是废了好多功夫.首先他这个登陆只是登陆了一个frame框架页面,里面还有个js的二次跳转页面.还会自动登陆一次.只有在IE或者谷歌等http抓包才看的出来隐藏的地址. 开始以为很简单 直接在第二个登陆页面提交post 谁知道 他会自动跳转到第一个登陆页面 前端白痴的我有点乱入了. 最后试来试去, 偷偷去看了下cookies ,尝试性的直接提交了cookies想不到 成功了. 但是这个cookies是在成绩页面 不知道是request还是respo