您的位置:首页 > 编程语言 > Python开发

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

2017-10-28 11:02 381 查看
一. 具体操作步骤

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

打开知乎登陆页面



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

可以得到:





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

_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


通过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()

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



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: