---恢复内容开始---

在完成前面的阶段的任务之后,我们现在已经能够尝试着去模拟登录一些网站了。在这里我们模拟登录一下知乎做一下实验。笔者在这里总共用了三天多的时间,下面给大家分享一下笔者是怎么一步一步的模拟登录成功的。也希望大家能够吸取我的教训。
初步的模拟登录
下面这段代码是笔者最初写的,我们慢慢来看
import requests
from bs4 import BeautifulSoup as bs
ssesion = requests.session()
headers = {
   'Connection': 'keep-alive',
   'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
   'Accept-Language': 'en-US,en;q=0.8,zh-Hans-CN;q=0.5,zh-Hans;q=0.3',
   'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',
   'Accept-Encoding': 'gzip, deflate, sdch',
   'Host': 'www.zhihu.com',
}

login_data = {'username': '', # 替换为账号
             'password': '', # 替换为密码
             'remember_me': 'true',
             'Referer': 'https://www.baidu.com/',
              }

response = bs(requests.get('http://www.zhihu.com/#signin').content, 'html.parser')
xsrf = response.find('input',attrs={'name':'_xsrf'})['value']
login_data['_xsrf'] =xsrf
responed = ssesion.post('http://www.zhihu.com/login/email',headers=headers,data=login_data)
print(responed)
在最初的写模拟登录知乎的时候,笔者也是通过抓包,发现了,cookie中有一个_xsrf的属性,类似于token的作用。而这个东西的存在,就让我们在模拟登录的时候,必须将这个属性作为参数一起加在请求中发送出去,那么怎么获得这个东西呢?似乎又是一个问题。
我想到的方法,就是随便访问一个页面,然后再页面元素中去定位到_xsrf这个字段,然后抓取下来,添加到data里,在请求的时候一起发出去就可以了。
然后为什么会去用ssesion去请求,因为在知乎上,它的xsrf是一直在变化的,我们每一次请求,它都在变。所以如果我们用requests去请求的话,就无法登录成功。
那么上面这段代码基本已经符合我们的要求了。我们运行看一下结果
Traceback (most recent call last):
  File "C:/Users/Administrator/PycharmProjects/Practice/Login_zhihu.py", line 20, in <module>
    xsrf = response.find('input',attrs={'name':'_xsrf'})['value']
TypeError: 'NoneType' object is not subscriptable
  
报错了,获取到的xsrf是空的,怎么办呢?嗯,根据这里的报错信息显示应该是类型错误,那就是获取xsrf那一段有错,我们单独把那一段代码拿出去运行看看结果。
定位并修复报错信息
既然知道了错误原因我们就去看看,到底是哪儿错了,要怎么解决。
首先,我单独的把获取xsrf那一段代码拿出来运行
import requests
from bs4 import BeautifulSoup as bs
response = bs(requests.get('http://www.zhihu.com/#signin').content, 'html.parser')
print(response)
xsrf = response.find('input',attrs={'name':'_xsrf'})['value']
print(xsrf)
在这里,分开进行打印,以便查看到底是走到哪一步出的错。
运行这一段代码得到结果如下显示:
Traceback (most recent call last):
  File "C:/Users/Administrator/PycharmProjects/Practice/Login_zhihu.py", line 6, in <module>
    xsrf = response.find('input',attrs={'name':'_xsrf'})['value']
TypeError: 'NoneType' object is not subscriptable
<html><body><h1>500 Server Error</h1>
An internal server error occured.
</body></html>
在这里报了500,也就是说我们在get请求的那里就已经出错了,然后下方的xsrf也没有获取到。在这里我首先想到的是先解决爬取的xsrf为空的问题,这里实际上走入了一个误区。之所以会爬取xsrf失败,实际上是由于在请求的时候就失败了,导致根本获取不到xsrf。所以应该是解决500的问题先。
那么怎么解决500问题呢?
经过前辈的教导,我在请求后面加上了headers,再次运行
import requests
frombs4importBeautifulSoupasbs
headers = {
'Connection':'keep-alive',
'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'Accept-Language':'en-US,en;q=0.8,zh-Hans-CN;q=0.5,zh-Hans;q=0.3',
'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',
'Accept-Encoding':'gzip, deflate, sdch',
'Host':'www.zhihu.com',
}

login_data = {'username':'',# 替换为账号
'password':'',# 替换为密码
'remember_me':'true',
'Referer':'https://www.baidu.com/',
}

response = bs(requests.get('http://www.zhihu.com/#signin',headers=headers).content,'html.parser')
xsrf = response.find('input',attrs={'name':'_xsrf'})['value']

print(xsrf)
好的,在运行看看:
899ce2556d7e705ca9bbf2b818a48d40
      
好的,这里我们可以看到是成功的爬取到了xsrf的信息,那么我们将这段代码在拿到之前的模拟登录的代码中去看看。
成功模拟登录知乎       
import requests
from bs4 import BeautifulSoup as bs
ssesion = requests.session()
headers = {
   'Connection': 'keep-alive',
   'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
   'Accept-Language': 'en-US,en;q=0.8,zh-Hans-CN;q=0.5,zh-Hans;q=0.3',
   'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',
   'Accept-Encoding': 'gzip, deflate, sdch',
   'Host': 'www.zhihu.com',
}

login_data = {'username': '', # 替换为账号
             'password': '', # 替换为密码
             'remember_me': 'true',
             'Referer': 'https://www.baidu.com/',
              }

response = bs(requests.get('http://www.zhihu.com/#signin',headers=headers).content, 'html.parser')
xsrf = response.find('input',attrs={'name':'_xsrf'})['value']
login_data['_xsrf'] =xsrf
responed = ssesion.post('http://www.zhihu.com/login/email',headers=headers,data=login_data)

print(responed)
运行这段代码得到的结果是
        <Response [200]>
 
返回状态为200,说明我们已经模拟登录成功了。经历过蛮多挫折哈,光是错误定位那一块儿,我就折腾了整整一个晚上,还请教了好几个程序员都没有搞定。这里提醒大家一下,可千万不要犯我这样的错误咯。在做爬虫的时候,一定要记得请求的时候加上头信息。

---恢复内容结束---

python模拟登陆知乎的更多相关文章

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

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

  2. Python 爬虫模拟登陆知乎

    在之前写过一篇使用python爬虫爬取电影天堂资源的博客,重点是如何解析页面和提高爬虫的效率.由于电影天堂上的资源获取权限是所有人都一样的,所以不需要进行登录验证操作,写完那篇文章后又花了些时间研究了 ...

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

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

  4. Python模拟登陆新浪微博

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

  5. Python模拟登陆TAPD

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

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

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

  7. Scrapy 模拟登陆知乎--抓取热点话题

    工具准备 在开始之前,请确保 scrpay 正确安装,手头有一款简洁而强大的浏览器, 若是你有使用 postman 那就更好了.           Python   1 scrapy genspid ...

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

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

  9. 使用OKHttp模拟登陆知乎,兼谈OKHttp中Cookie的使用!

    本文主要是想和大家探讨技术,让大家学会Cookie的使用,切勿做违法之事! 很多Android初学者在刚开始学习的时候,或多或少都想自己搞个应用出来,把自己学的十八般武艺全都用在这个APP上,其实这个 ...

随机推荐

  1. java函数式编程之lambda表达式

    作为比较老牌的面向对象的编程语言java,在对函数式编程的支持上一直不温不火. 认为面向对象式编程就应该纯粹的面向对象,于是经常看到这样的写法:如果你想写一个方法,那么就必须把它放到一个类里面,然后n ...

  2. chrome、firefox、IE中input输入光标位置错位解决方案

    以前在项目里碰到过一个问题 input输入框用一个背景图模拟,设置height和line-height一样的高度,使里面的输入文字能够居中, 在FF下出现的情况是:点击input时,输入光标其实上跟i ...

  3. CSS读书笔记(1)---选择器和两列布局

    (1)CSS选择器优先权选择. 优先权从大到小的选择如下: 标有!important关键字声明的属性 HTML中的CSS样式属性 <div style="color:red" ...

  4. 如何 打包整合linux系统文件夹 用于刷机包等等, 其中包括打包 句号开头 . 开头的文件, 排除系统文件 等

    tar --exclude=proc/*   --exclude=sys/* -cvjf rootfs.tar.bz2  * .[!.]* -R

  5. USACO 2008 Nov Gold 3.Light Switching 线段树

    Code: #include<cstdio> #include<algorithm> #include<cstring> using namespace std; ...

  6. nginx (待更新)

    install apt install nginx 默认在 /etc/nginx 目录下 一个 master 以及多个 worker 3504 root 20 0 141M 7196 5552 S 0 ...

  7. C++基础 (9) 第九天 编译器对模板类的二次编译 类模板 自定义数组类

    1 昨日回顾 2 编译器对于模板的二次编译 写一个模板函数 然后进行调用 g++ template.cpp -o template // 汇编 g++ -S template.cpp –o templ ...

  8. babel把ES6转化为ES5的时候报错

    Module not found: Error: Can't resolve '@babel/runtime/helpers/asyncToGenerator' in 'e:\Node.js\Node ...

  9. HDU 5126 stars (四维偏序+树状数组)

    题目大意:略 题目传送门 四维偏序板子题 把插入操作和询问操作抽象成$(x,y,z,t)$这样的四元组 询问操作拆分成八个询问容斥 此外$x,y,z$可能很大,需要离散 直接处理四维偏序很困难,考虑降 ...

  10. linux 遇到(vsftpd)—500 OOPS:chroot

    今天在用vsftpd 时出现一个问题: 500 OOPS:chroot 解决办法: 1.关闭SELINUX [root@localhost ~]#vi /etc/sysconfig/selinux # ...