可登陆爬虫Python实现
2016-03-18 10:28
465 查看
最近期末测试完结了,正好恰逢周末,就想找点事来做,之前做过爬虫,遇到了登录的问题,今天就来整理下。登录问题其实就是程序发送请求,服务器返回数据时,发出http响应消息报文,这两种类型的消息都是由一个起始行,而cookie就在在http请求和http响应的头信息中,在请求中添加用户信息的cookie即可实现登录。于是乎cookie是消息头的一种很重要的属性。
Cookie的种类[/b]会话Cookie(Session Cookie):这个类型的cookie只在会话期间内有效,保存在浏览器的缓存之中,用户访问网站时,会话Cookie被创建,当关闭浏览器的时候,它会被浏览器删除。 持久Cookie(Persistent Cookie): 这个类型的cookie长期在用户会话中生效。当你设置cookie的属性Max-Age为1个月的话,那么在这个月里每个相关URL的http请求中都会带有这个cookie。所以它可以记录很多用户初始化或自定义化的信息,比如什么时候第一次登录及弱登录态等。 Secure cookie:安全cookie是在https访问下的cookie形态,以确保cookie在从客户端传递到Server的过程中始终加密的。HttpOnlyCookie :这个类型的cookie只能在http(https)请求上传递,对客户端脚本语言无效,从而有效避免了跨站攻击。 第三方cookie: 第一方cookie是当前访问的域名或子域名下的生成的Cookie。 第三方cookie:第三方cookie是第三方域名创建的Cookie。
python模拟登录[/b][/b]首先查看所要爬取网站登录源码:(豆瓣为例)
看了这些之后,我们只用按照登录网址所需信息添加到post中就行。添加所需的包。
[/code]信息添加到post中
[/code]因为豆瓣登录需要验证码,但是本人并没有做过图像中验证码识别,于是直接正则匹配图片下载到本地,然后手工读取,在输入:
[/code]再次发送
[/code]
[/code]其实有很多种方法都可以实现,这只是一种,我也是在探索,希望和我一样的人可以一起探讨,如果是大牛的话,请多多指教。
什么是Cookie?
当用户通过浏览器首次访问一个域名时,访问的WEB服务器会给客户端发送数据,以保持WEB服务器与客户端之间的状态保持,这些数据就是Cookie,它是 Internet 站点创建的 ,为了辨别用户身份而储存在用户本地终端上的数据,Cookie中的信息一般都是经过加密的,Cookie存在缓存中或者硬盘中,在硬盘中的是一些小文本文件,当你访问该网站时,就会读取对应网站的Cookie信息,Cookie有效地提升了我们的上网体验。一般而言,一旦将 Cookie 保存在计算机上,则只有创建该 Cookie 的网站才能读取它。Cookie的种类[/b]会话Cookie(Session Cookie):这个类型的cookie只在会话期间内有效,保存在浏览器的缓存之中,用户访问网站时,会话Cookie被创建,当关闭浏览器的时候,它会被浏览器删除。 持久Cookie(Persistent Cookie): 这个类型的cookie长期在用户会话中生效。当你设置cookie的属性Max-Age为1个月的话,那么在这个月里每个相关URL的http请求中都会带有这个cookie。所以它可以记录很多用户初始化或自定义化的信息,比如什么时候第一次登录及弱登录态等。 Secure cookie:安全cookie是在https访问下的cookie形态,以确保cookie在从客户端传递到Server的过程中始终加密的。HttpOnlyCookie :这个类型的cookie只能在http(https)请求上传递,对客户端脚本语言无效,从而有效避免了跨站攻击。 第三方cookie: 第一方cookie是当前访问的域名或子域名下的生成的Cookie。 第三方cookie:第三方cookie是第三方域名创建的Cookie。
python模拟登录[/b][/b]首先查看所要爬取网站登录源码:(豆瓣为例)
看了这些之后,我们只用按照登录网址所需信息添加到post中就行。添加所需的包。
12345 | [code]import requests import re from bs4 import BeautifulSoup import random import urllib,urllib2 |
1234567891011 | [code]login_url= " headers = { 'User-Agent' :'Mozilla / 5.0 (Windows NT 6.1 ; WOW64)\ AppleWebKit / 537.36 (KHTML,like Gecko) Chrome / 41.0 . 2272.118 Safari / 537.36 ',} my_post = { 'redir' : ' , 'form_email' : '*@qq.com' , 'form_password' : 'password' , 'login' : '登录' , } r = requests.post(login_url,data = my_post,headers = headers) html = r.text |
1234567 | [code]''' download captcha'''reg = r '<img id="captcha_image" src="(.*?)" alt="captcha" class="captcha_image"/>' imglist = re.findall(reg,html) urllib.urlretrieve(imglist[ 0 ], '%d.jpg' % random.randint( 1 , 100 )) captcha = raw_input ( 'captchais: ' ) regid = r '<input type="hidden" name="captcha-id" value="(.*?)"/>' ids = re.findall(regid,html) |
12345 | [code]''' repost '''my_post[ "captcha-solution" ] = captcha my_post[ "captcha-id" ] = ids[ 0 ] q = requests.post(login_url,data = my_post,headers = headers) q.url |
如果登录成功,返回的URL就是:http://www.douban.com/doumail/,然后就可以正在获得用户信息了。
123456789101112131415161718192021 | [code]''' use bs4filterdouban.com's doumail following'''if q.url = = " : " login successfully!" soup = BeautifulSoup(q.text) tag = soup.find_all( 'span' ,attrs = { 'class' : 'from' }) tag2 = soup.find_all( 'a' ,attrs = { 'class' : 'url' }) a = [] for x in tag: a.append(x.get_text()) b = [] for y in tag2: b.append(y.get_text()) def split(num): a[num] + ' ' + b[num] '-' * 30 ,u '豆瓣豆邮' , '-' * 30 for x in range ( len (a)): split(x) '-' * 80 |
相关文章推荐
- windows平台下安装python的setuptools工具
- python模块之 paramiko
- python迭代器:iter()和__iter__()
- ptyhon时间处理
- Python魔术方法
- Ubuntu 配置 python环境 和 mxnet
- Python urlencode 编码和url拼接
- 李峤诗200首的抓取
- 简述Python中的进程、线程、协程
- Python3.5 tab补全 yum出错解决
- python 类中的私有变量
- 将numpy array由浮点型转换为整型
- Python异常模块traceback用法举例
- python中的print
- Python环境搭建
- Python回顾与整理4:序列1—字符串
- 简述Python中的进程、线程、协程
- 理解Python中的With语句
- 基于python yield机制的异步操作同步化编程模型
- python正则表达式之作业计算器