python爬虫模拟登陆知乎网
2017-10-22 16:30
405 查看
自从暑假学了大概一个月左右的爬虫,开学之后就没怎么搞爬虫了,当时也就学到scrapy框架就放下了,大致了解了一下框架,不是太理解,但是在这之前本人的爬虫水平也仅仅局限于爬取简单页面,爬取动态页面也稍微了解下,但是一直没有学模拟登陆,因为当时怎么也搞不懂模拟登陆是怎么个回事,包括保存页面cookies也不知道,
最近有重新拾起爬虫,准备将爬虫再进阶一下,于是找到了网上一些视频看到有个用beautifulSoup实现模拟登录知乎,感觉挺容易上手的。下面,贴代码
不知道怎么回事,看着视频上老师讲的实例模拟的登录知乎是需要验证码的,但是在我机子上是怎么都出不来验证码,于是就将验证码识别这个模块省略了,在这个模拟登录知乎的学习过程中,我了解到了某些信息加密,因为知乎怎么说也是个比较正式的商业网站,所以,用户登录,为了防止跨域攻击,所以网站会通过设置一个隐藏字段来存放这个MD5字符串,这个字符串用来校验用户Cookie和服务器Session的一种方式
这里面科普一下:
_xsrf 作用是防止CSRF攻击(跨站请求伪造),通常叫跨域攻击,是一种利用网站对用户的一种信任机制来做坏事,跨域攻击通常通过伪装成网站信任的用户的请求(利用Cookie),盗取用户信息、欺骗web服务器
其实模拟登录基本流程也就这样,首先我们先要找到用户点击登录所发送的表单,然后将表单的内容都添加进去,然后,post进去数据,返回带有cookies的session对象,最后用已有登录状态的Cookie发送请求,获取目标页面源码。就这么简单!当然,登录没有验证码的网站现在是很少见了,我们实现模拟登陆的时候,这个验证码问题还是要看中的,还有不同的网站有不同的用户信息加密方式,但总归都逃不了我们要将登录时的表单post进服务器,只是可能有些网站的解密比较复杂。爬虫的学问很多,还要selenium这些还没学,以后慢慢来吧。
最近有重新拾起爬虫,准备将爬虫再进阶一下,于是找到了网上一些视频看到有个用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这些还没学,以后慢慢来吧。
相关文章推荐
- [置顶] 【python 爬虫】linux 下 selenium+phantomjs 自动模拟登陆
- Python爬虫——模拟登陆爬取csdn页面
- python爬虫 scrapy框架 知乎zhihu 模拟登陆
- python爬虫之模拟登陆csdn
- Python使用Srapy框架爬虫模拟登陆并抓取知乎内容
- Python 爬虫之模拟登陆CSND
- python爬虫学习之路(1)_ CSDN网站的模拟登陆
- Python爬虫之模拟登陆
- 人生苦短,我用Python--爬虫模拟登陆教务处并且保存数据到本地
- Python网络爬虫之模拟登陆
- python爬虫——基于selenium用火狐模拟登陆爬搜索关键词的微博
- python3版本爬虫系列之模拟登陆CSDN
- 【Python爬虫】教务处模拟登陆
- Python爬虫之模拟登陆知乎
- Python爬虫模拟登陆知乎
- 模拟登陆CSDN -- Python爬虫练习之正则表达式和cookie
- python3 爬虫 模拟登陆豆瓣修改签名
- Python3网络爬虫:使用Cookie-模拟登陆
- Python2 爬虫(四) -- 模拟登陆(人人网和知乎)
- python模拟新浪微博登陆功能(新浪微博爬虫)