Python爬虫——模拟登陆爬取知乎页面

一. 具体操作步骤

知乎登陆界面:https://www.zhihu.com/#signin

打开知乎登陆页面

Python爬虫——模拟登陆爬取知乎页面_第1张图片

1)先输入一个错误登陆,然后打开Fiddler抓取提交的包

可以得到:

Python爬虫——模拟登陆爬取知乎页面_第2张图片


Python爬虫——模拟登陆爬取知乎页面_第3张图片


由抓取的包里面的信息可以知道,需要提交的表单信息有四个

_xsrf

password

captcha_type

email

2)在执行一遍1)的操作

可以得出:

_xsrf : 由系统生成刷新一次改变一次

password : 输入密码

email:输入的用户名

captcha_type : 验证码值

3)获取验证码

由于验证码是一张图片,所以我们对于验证码的获取可以采用将图片下载下来,在进行手动输入验证码获得验证码的值

a.首先获得验证码的图片url地址

https://www.zhihu.com/captcha.gif?r=1509160957148&type=login

Python爬虫——模拟登陆爬取知乎页面_第4张图片

通过r所传递的值我们可以知道这是时间戳

b.通过网址就可以下载验证码图片

c.通过本地下载的验证码图片手动输入验证码的值


4)使用post请求提交表单数据获得返回cookie就可以访问需要登录后才可以访问的任意界面了


二. 下面是具体实现代码

# _*_ coding:utf-8 _*_

#导入requests库
import requests
#导入BeautifulSoup模块
from bs4 import BeautifulSoup
import time

#_xsrf=e218097f4550911091b3cc14920b2f7d&password=asdasdasdas&captcha=%7B%22img_size%22%3A%5B200%2C44%5D%2C%22input_points%22%3A%5B%5B28.2969%2C27%5D%2C%5B69.2969%2C24%5D%5D%7D&captcha_type=cn&email=sdfsada

#保存验证码图片并返回验证码的值
def writeImage(res):
    print "保存验证码..."
    with open("page/captcha.jpg","wb") as f:
        f.write(res)
    print "保存完毕..."
    #输入保存完后图片内验证码的值
    test = raw_input("验证码为:")
    return test

def loginPage():
    # 登录网址
    url = "https://www.zhihu.com/#signin"
    # 请求报头
    headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"}

    #创建一个session用于存取cookies值
    session = requests.session()
    html = session.get(url,headers=headers).text

    #创建lxml
    bs = BeautifulSoup(html,"lxml")

    #获取_xsrf
    _xsrf = bs.find("input",attrs={"name":"_xsrf"}).get("value")

    #获取验证码
    captcha_url = "https://www.zhihu.com/captcha.gif?r=%d&type=login" % (time.time() * 1000)
    
    #发送请求获取文件流
    captcha_res = session.get(captcha_url,headers=headers).content
    
    #保存并获得验证码值
    test = writeImage(captcha_res)

    #data表单提交数据
    data = {
        "_xsrf": _xsrf,
        "password":"密码",
        "email":"账号",
        "captcha_type": test
    }

    #使用post提交登录信息,保存返回的cookie值
    session.post(url,data=data,headers=headers)

    #访问需要登录后才能访问的网页
    response = session.get("https://www.zhihu.com/people/er-kou-bu-er/activities",headers=headers)
    
    #打印网页内容
    print response.text



#https://www.zhihu.com/#signin
if __name__ == "__main__":
    loginPage()

结果:(账号密码处填写需要访问的账号和密码)

Python爬虫——模拟登陆爬取知乎页面_第5张图片


你可能感兴趣的:(【20】Python)