Python3 爬虫 模拟登录

                以知乎为例来进行说明。在登录状态下访问知乎,看到的首页如图:

                但是如果没有登录,访问知乎首页会自动跳转到登录页面,看到的是如图所示的页面。

        没有登录的情况下访问首页会自动跳转到登录页面;如果使用requests直接获取知乎首页,可以看到源代码明显是未登录状态的;使用requests直接访问知乎只能得到未登录状态的源代码。

        模拟登录有多种实现方法,使用Selenium操作浏览器登录和使用Cookies登录虽然简单粗暴,但是有效。使用模拟提交表单登录虽然较为麻烦,但可以实现自动化。

一、使用Selenium模拟登录

        使用Selenium来进行模拟登录,整个过程非常简单。流程如下。
        (1)初始化ChromeDriver。
        (2)打开知乎登录页面。
        (3)找到用户名的输入框,输入用户名。
        (4)找到密码输入框,输入密码。
        (5)手动单击验证码。
        (6)按下Enter键。
        以上过程,若使用Selenium,一般情况下只需要不到20行代码就可以完成:

 

from selenium import webdriver 
from elenium.webdriver.common.keys import Keys 
import time  

driver = webdriver.Chrome('./chromedriver') #填写你的chromedriver的路径 
driver.get("https://www.zhihu.com/#signin")  

elem = driver.find_element_by_name("account") #寻找账号输入框 
elem.clear() 
elem.send_keys("xxx@gmail.com") #输入账号 
password = driver.find_element_by_name('password') #寻找密码输入框 
password.clear() 
password.send_keys("12345678") #输入密码 
input('请在网页上点击倒立的文字,完成以后回到这里按任意键继续。') 
elem.send_keys(Keys.RETURN) #模拟键盘回车键 
time.sleep(10) #这里可以直接sleep, 也可以使用等待某个条件出现 
print(driver.page_source) 
driver.quit()

        上面的代码就是使用Selenium登录知乎的全部代码,包括空行一共18行。程序首先打开知乎的登录页面,然后使用“find_element_by_name”分别找到输入账号和密码的两个输入框。这两个输入框的name属性值分别为“account”和“password”。 

        在Selenium中可以使用send_keys()方法往输入框中输入字符串。在输入了密码以后,验证码框就会弹出来。知乎使用的验证码为点击倒立的文字,这种验证码不容易自动化处理,因此在这个地方让爬虫先暂停,手动点击倒立文字。爬虫中的input()语句会阻塞程序,直到在控制台按下Enter键,爬虫才会继续运行,触发知乎的登录行为,实现登录。

        无论是使用Selenium来运行异步加载的网站,还是模拟登录,代码少,效果好,看起来简直完美。但是Selenium的缺点就是它的速度太慢了。如果一个网页有很多图片又有很多的异步加载,那么使用Selenium处理完成一个网页要十几秒甚至几十秒。而且如果是在服务器上使用PhantomJS作为WebDriver,还会出现内存泄漏的问题,爬虫轻轻松松就会把服务器内存撑爆。因此,Selenium不适合用于大规模的爬虫开发。虽然Selenium和WebDriver不适合做主力,但是用其来做辅助操作,却有意想不到的效果。

二、使用Cookies登录

        Cookie是用户使用浏览器访问网站的时候网站存放在浏览器中的一小段数据。Cookie的复数形式Cookies用来表示各种各样的Cookie。它们有些用来记录用户的状态信息;有些用来记录用户的操作行为;还有一些,具有现代网络最重要的功能:记录授权信息——用户是否登录以及用户登录哪个账号。

        为了不让用户每次访问网站都进行登录操作,浏览器会在用户第一次登录成功以后放一段加密的信息在Cookies中。下次用户访问,网站先检查Cookies有没有这个加密信息,如果有并且合法,那么就跳过登录操作,直接进入登录后的页面。

        通过已经登录的Cookies,可以让爬虫绕过登录过程,直接进入登录以后的页面。

        在已经登录知乎的情况下,打开Chrome的开发者工具,定位到“Network”选项卡,然后刷新网页,在加载的内容中随便选择一项,然后看右侧的数据,从RequestHeaders中可以找到Cookie。

        请注意这里一定是“Request Headers”,不要选成了“Response Headers”。只要把这个Request Headers的内容通过requests提交,就能直接进入登录以后的知乎页面了;由于登录以后的知乎页面的HTML代码全部缩在了一行,所以在PyCharm里面看起来不太方便。不过从输出的部分文字可以证明,确实已经是登录以后的页面。

        可以看到,使用Cookie来登录网页,不仅可以绕过登录步骤,还可以绕过网站的验证码。这种方式的爬虫代码里,一般会使用了requests的Session模块。所谓Session,是指一段会话。网站会把每一个会话的ID(Session ID)保存在浏览器的Cookies中用来标识用户的身份。requests的Session模块可以自动保存网站返回的一些信息。其实在前面章节中使用的requests.get(),在底层还是会先创建一个Session,然后用Session去访问。但是每调用一次requests.get(),都会创建一个新的Session。对服务器来说,就像是每次都新开一个浏览器来访问。这个行为其实和正常人的行为是不一致的。如果直接使用Session模块,那么每次都用这个Session去访问,对服务器来说,这个行为就像是在一个浏览器窗口中通过单击链接进入其他页面。这个行为更像人的行为。在requests的官方文档中也建议,如果多次对同一个网站发送请求,那么应该使用Session模块,它会带来显著的性能提升。对于HTTPS的网站,在requests发送请求的时候需要带上verify=False这个参数,否则爬虫会报错。带上这个参数以后,爬虫依然会报一个警告,这是因为没有HTTPS的证书。不过这个警告不会影响爬虫的运行结果。对于有强迫症的读者,可以参考相关内容为requests设置证书,从而解除这个警告。

三、模拟表单登录

        在现实中,有更多的网站是使用表单提交的方式来进行登录的。那如何解决表单登录的问题。
        首先,打开Chrome的开发者工具并监控表单登录过程。然而,仔细观察会发现登录请求的那个网址只会在“Network”选项卡中存在1s,然后就消失了。“Network”选项卡下面只剩下登录成功后的页面所发起的各种网络请求,这是因为表单登录成功以后会进行页面跳转,相当于开了一个新的网页,于是新的请求就会直接把旧的请求覆盖。为了避免这种情况,需要在Chrome的开发者工具的“Network”选项卡中勾选“Preserve log”复选框,再一次登录就可以看到登录过程。
        然后,代码使用Session模块初始化了一个实例,实例变量的名字为session。此时可以想象成刚刚打开了一个浏览器。
        其次,是在登录之前访问登录成功以后才能显示的页面,requests会自动跳转到登录页面,定义before-login变量中保存登录页的源代码。此时可以想象成在浏览器里直接访问本来需要登录才能访问的页面,于是浏览器自动跳转到登录页。
        最后,使用Session模块登录,登录成功以后服务器会返回登录成功的Cookies,这个Cookies会被自动保存到session这个实例中。此时,这个假想的浏览器已经完成了登录,服务器把Cookies保存到了浏览器中,通过session访问网址,可以直接得到登录后的页面网址。

--------------------------------------

没有自由的秩序和没有秩序的自由,同样具有破坏性。

--------------------------------------

  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值