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

python爬虫模拟登陆知乎网

2017-10-22 16:30 405 查看
自从暑假学了大概一个月左右的爬虫,开学之后就没怎么搞爬虫了,当时也就学到scrapy框架就放下了,大致了解了一下框架,不是太理解,但是在这之前本人的爬虫水平也仅仅局限于爬取简单页面,爬取动态页面也稍微了解下,但是一直没有学模拟登陆,因为当时怎么也搞不懂模拟登陆是怎么个回事,包括保存页面cookies也不知道,

最近有重新拾起爬虫,准备将爬虫再进阶一下,于是找到了网上一些视频看到有个用beautifulSoup实现模拟登录知乎,感觉挺容易上手的。下面,贴代码

import requests
from bs4 import BeautifulSoup

url = "https://www.zhihu.com/#signin"

#请求报头
def zhihuLogin(url):
headers = {
"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36"
}

# 构建一个session对象,用来保存页面cookies
sion = requests.Session()

#首先获取登录界面,找到需要post的数据(_xsrf)同时记录当前页面的cookies值
html = sion.get(url,headers = headers).text

#通过bs库将页面解析方便下面获取需要post 的值
bs = BeautifulSoup(html,"lxml")
#找到name属性值为_xsrf的input标签,并获取其相应的value值
xsrf = bs.find("input",attrs{"name":"_xsrf"}).get("value")

# 根据UNIX时间戳,匹配出验证码的URL地址
captcha_url = "https://www.zhihu.com/captcha.gif?r=%d&type=login" % (time.time() * 1000)
# 发送图片的请求,获取图片数据流,
captcha_data = sess.get(captcha_url, headers = headers).content
# 获取验证码里的文字,需要手动输入
text = captcha(captcha_data)

data = {
"_xsrf":xsrf,
"password":"*******",#由于个人隐私关系,这边就不把摩玛贴出来了
"captcha_type":"cn",#如果页面有验证码的话就将表单里面的这个添加text
"email":"898264468@qq.com"
}
response = requests.post("http://www.zhihu.com/login/email",data = data,headers = headers)
#用已有的登录状态cookies发送请求,获取目标页面源码
response2 = sion.get("http://www.zhihu.com/people/lou-kun-20/activities",headers = headers)
# 返回获取到的目标页面源码
bs2 = BeautifulSoup(response2.text,"lxml")
print(bs2)
#return response2.text

zhihuLogin(url)


#此模块用于获取登录时出现的验证码,由于目前还不会机器学习图像识别,所以只能将验证码下载到本地,手动输入验证码实现登录,
def captcha(captcha_data):
with open("captcha.jpg", "wb") as f:
f.write(captcha_data)
text = input("请输入验证码:")
# 返回用户输入的验证码
return text


不知道怎么回事,看着视频上老师讲的实例模拟的登录知乎是需要验证码的,但是在我机子上是怎么都出不来验证码,于是就将验证码识别这个模块省略了,在这个模拟登录知乎的学习过程中,我了解到了某些信息加密,因为知乎怎么说也是个比较正式的商业网站,所以,用户登录,为了防止跨域攻击,所以网站会通过设置一个隐藏字段来存放这个MD5字符串,这个字符串用来校验用户Cookie和服务器Session的一种方式

这里面科普一下:

_xsrf 作用是防止CSRF攻击(跨站请求伪造),通常叫跨域攻击,是一种利用网站对用户的一种信任机制来做坏事,跨域攻击通常通过伪装成网站信任的用户的请求(利用Cookie),盗取用户信息、欺骗web服务器

其实模拟登录基本流程也就这样,首先我们先要找到用户点击登录所发送的表单,然后将表单的内容都添加进去,然后,post进去数据,返回带有cookies的session对象,最后用已有登录状态的Cookie发送请求,获取目标页面源码。就这么简单!当然,登录没有验证码的网站现在是很少见了,我们实现模拟登陆的时候,这个验证码问题还是要看中的,还有不同的网站有不同的用户信息加密方式,但总归都逃不了我们要将登录时的表单post进服务器,只是可能有些网站的解密比较复杂。爬虫的学问很多,还要selenium这些还没学,以后慢慢来吧。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: