需求:模拟登录知乎,因为知乎首页需要登录才可以查看,所以想爬知乎上的内容首先需要登录,那么问题来了,怎么用python进行模拟登录以及会遇到哪些问题?

前期准备:

环境:ubuntu,python2.7

需要的包:requests包、正则表达式包

安装requests:pip install requests,关于requests的介绍可以看官方介绍:http://cn.python-requests.org/zh_CN/latest/user/quickstart.html , 以及 http://cuiqingcai.com/2556.html 讲的也很好,简单明了

requests包其实是代替了urllib2,并且提供了大量简洁好用的方法调用。

注意:通过Chrome Devtool可以看到知乎登录的URL是:https//www.zhihu.com/login/email,使用邮箱进行登录。

登录的方式为POST,需要的参数有四个分别是:_xsrf、password、remember_me和email,除了第一个都很好理解,那么第一个参数是什么?

XSRF为跨站请求伪造(Cross-site request forgery),通过搜集资料,在大神的博客里找到有相应资料,http://cuiqingcai.com/2076.html ,说的也很清楚,有兴趣可以查看。这个参数目的就是为了防范XSRF攻击而设置的一个hash值,每次访问主页都会生成这样一个唯一的字符串。那么怎么获取这个参数的值,经过对知乎首页(https://www.zhihu.com)的代码查看可以看到有一个隐藏的标签:

那么就好解决了,直接在爬下来的网页内容中用正则表达式去匹配就OK了。

代码:

import requests
import re def getContent(url):
  #使用requests.get获取知乎首页的内容
r = requests.get(url)
  #request.get().content是爬到的网页的全部内容
return r.content

#获取_xsrf标签的值
def getXSRF(url):
  #获取知乎首页的内容
content = getContent(url)
  #正则表达式的匹配模式
pattern = re.compile('.*?<input type="hidden" name="_xsrf" value="(.*?)"/>.*?')
  #re.findall查找所有匹配的字符串
match = re.findall(pattern, content)
xsrf = match[0]
  #返回_xsrf的值
return xsrf #登录的主方法
def login(baseurl,email,password):
  #post需要的表单数据,类型为字典
login_data = {
'_xsrf': getXSRF(baseurl),
'password': password,
'remember_me': 'true',
'email': email,
}
  #设置头信息
headers_base = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'Accept-Encoding': 'gzip, deflate, sdch',
'Accept-Language': 'en-US,en;q=0.8,zh-CN;q=0.6,zh;q=0.4,zh-TW;q=0.2',
'Connection': 'keep-alive',
'Host': 'www.zhihu.com',
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.130 Safari/537.36',
'Referer': 'http://www.zhihu.com/',
}
  #使用seesion登录,这样的好处是可以在接下来的访问中可以保留登录信息
session = requests.session()
  #登录的URL
baseurl += "/login/email"
  #requests 的session登录,以post方式,参数分别为url、headers、data
content = session.post(baseurl, headers = headers_base, data = login_data)
  #成功登录后输出为 {"r":0,
  #"msg": "\u767b\u9646\u6210\u529f"
  #}
print content.text
  #再次使用session以get去访问知乎首页,一定要设置verify = False,否则会访问失败
s = session.get("http://www.zhihu.com", verify = False)
print s.text.encode('utf-8')
  #把爬下来的知乎首页写到文本中
f = open('zhihu.txt', 'w')
f.write(s.text.encode('utf-8'))
url = "http://www.zhihu.com"
#进行登录,将星号替换成你的知乎登录邮箱和密码即可
login(url,"******@***.com","************")

最后,就成功把知乎首页的内容抓取下来了!下一步可以进行分析和筛选了。

【爬虫】python requests模拟登录知乎的更多相关文章

  1. Python requests模拟登录

    Python requests模拟登录 #!/usr/bin/env python # encoding: UTF-8 import json import requests # 跟urllib,ur ...

  2. Python爬虫初学(三)—— 模拟登录知乎

    模拟登录知乎 这几天在研究模拟登录, 以知乎 - 与世界分享你的知识.经验和见解为例.实现过程遇到不少疑问,借鉴了知乎xchaoinfo的代码,万分感激! 知乎登录分为邮箱登录和手机登录两种方式,通过 ...

  3. Python爬虫入门(基础实战)—— 模拟登录知乎

    模拟登录知乎 这几天在研究模拟登录, 以知乎 - 与世界分享你的知识.经验和见解为例.实现过程遇到不少疑问,借鉴了知乎xchaoinfo的代码,万分感激! 知乎登录分为邮箱登录和手机登录两种方式,通过 ...

  4. python爬虫scrapy框架——人工识别登录知乎倒立文字验证码和数字英文验证码(2)

    操作环境:python3 在上一文中python爬虫scrapy框架--人工识别知乎登录知乎倒立文字验证码和数字英文验证码(1)我们已经介绍了用Requests库来登录知乎,本文如果看不懂可以先看之前 ...

  5. 2020.10.20 利用POST请求模拟登录知乎

    前两天学习了Python的requests模块的相关内容,对于用GET和PSOT请求访问网页以抓取需要的内容有了初步的了解,想要再从一些复杂的网站积累些经验.最开始我采用最简单的get(url)方法想 ...

  6. requests_模拟登录知乎

    如何登录知乎? 首先要分析,进行知乎验证的时候,知乎服务器需要我们提交什么数据,提交的地址.先进行几次登录尝试,通过浏览器中network中查看数据流得知,模拟登录知乎需要提供5个数据,分别是_xsr ...

  7. 用python实现模拟登录人人网

    用python实现模拟登录人人网 字数4068 阅读1762 评论19 喜欢46 我决定从头说起.懂的人可以快速略过前面理论看最后几张图. web基础知识 从OSI参考模型(从低到高:物理层,数据链路 ...

  8. 利用scrapy模拟登录知乎

    闲来无事,写一个模拟登录知乎的小demo. 分析网页发现:登录需要的手机号,密码,_xsrf参数,验证码 实现思路: 1.获取验证码 2.获取_xsrf 参数 3.携带参数,请求登录 验证码url : ...

  9. 使用Python+Selenium模拟登录QQ空间

    使用Python+Selenium模拟登录QQ空间爬QQ空间之类的页面时大多需要进行登录,研究QQ登录规则的话,得分析大量Javascript的加密解密,这绝对能掉好几斤头发.而现在有了seleniu ...

随机推荐

  1. CSS hack浏览器兼容一览表

    CSS hack是指我们为了兼容各浏览器,而使用的特别的css定义技巧.这是国外摘来的一张CSS hack列表,显示了各浏览器对css hack的支持程度,对我们制作兼容网页非常有帮助.

  2. CentOS7 搭建Apache环境

    一.安装 yum -y install httpd 二.配置 主路径:/etc/httpd/ Apache目录说明 1 2 3 4 5 6 drwxr-xr-x 2 root root 4096 Ma ...

  3. 「6月雅礼集训 2017 Day4」暴力大神hxx

    [题目大意] 给出一个n重循环,每重循环有范围$[l, r]$,其中$l$,$r$可能是之前的变量,也可能是常数.求循环最底层被执行了多少次. 其中,保证每个循环的$l$,$r$最多有一个是之前的变量 ...

  4. java servlet jsp 导入boostrap css js

    1.在导入boostrap.css的时候注意了 一定要注意路径,你知道把js和css包放在servlet服务器的静态路径下面就是 lib 文件夹路径下,直接使用 lib/js/boostrap.css ...

  5. Linux中source命令的用法

    source命令: source命令也称为“点命令”,也就是一个点符号(.).source命令通常用于重新执行刚修改的初始化文件,使之立即生效,而不必注销并重新登录.因为linux所有的操作都会变成文 ...

  6. devinet_ioctl

    Kernel: 4.12.6 deinet_ioctl:获取或者设置接口的地址,掩码,标记等信息: 注意,使用SIOCSIFFLAGS关闭设备,如果使用了别名,则删除对应ip,如果其为主ip,并且从i ...

  7. 一个无线通信类投稿的期刊list

    转载一个,但是有些期刊的影响因子不是很对,要投的时候还是再到期刊主页上面看一看吧~ 期刊缩写 期刊全名 近年影响因子 P IEEE Proceedings Of The IEEE 3.686 IEEE ...

  8. python基础===zmail,收发邮件的模块

    项目地址: GitHub:https://github.com/ZYunH/zmail  介绍: https://mp.weixin.qq.com/s?__biz=MzAxMjUyNDQ5OA==&a ...

  9. mac系统中实现vitualBox中访问内网端口

    第一步,增加外网网段 打开vitualbox后,按管理菜单,点击->主机网络管理器,如图1所示.点击创建,创建下个网络主机. 图1 然后,关掉虚拟机,虚拟机的设置中,找到网络选项卡,然后点击网络 ...

  10. 002 Lock和synchronized的区别和使用

    转自 https://www.cnblogs.com/baizhanshi/p/6419268.html 今天看了并发实践这本书的ReentantLock这章,感觉对ReentantLock还是不够熟 ...