可登陆爬虫Python实现

    最近期末测试完结了,正好恰逢周末,就想找点事来做,之前做过爬虫,遇到了登录的问题,今天就来整理下。
    登录问题其实就是程序发送请求,服务器返回数据时,发出http响应消息报文,这两种类型的消息都是由一个起始行,而cookie就在在http请求和http响应的头信息中,在请求中添加用户信息的cookie即可实现登录。于是乎cookie是消息头的一种很重要的属性。

什么是Cookie?


    当用户通过浏览器首次访问一个域名时,访问的WEB服务器会给客户端发送数据,以保持WEB服务器与客户端之间的状态保持,这些数据就是Cookie,它是 Internet 站点创建的 ,为了辨别用户身份而储存在用户本地终端上的数据,Cookie中的信息一般都是经过加密的,Cookie存在缓存中或者硬盘中,在硬盘中的是一些小文本文件,当你访问该网站时,就会读取对应网站的Cookie信息,Cookie有效地提升了我们的上网体验。一般而言,一旦将 Cookie 保存在计算机上,则只有创建该 Cookie 的网站才能读取它。 

Cookie的种类


     会话Cookie(Session Cookie):这个类型的cookie只在会话期间内有效,保存在浏览器的缓存之中,用户访问网站时,会话Cookie被创建,当关闭浏览器的时候,它会被浏览器删除。 
    持久Cookie(Persistent Cookie): 这个类型的cookie长期在用户会话中生效。当你设置cookie的属性Max-Age为1个月的话,那么在这个月里每个相关URL的http请求中都会带有这个cookie。所以它可以记录很多用户初始化或自定义化的信息,比如什么时候第一次登录及弱登录态等。 
    Secure cookie:安全cookie是在https访问下的cookie形态,以确保cookie在从客户端传递到Server的过程中始终加密的。
    HttpOnly Cookie :这个类型的cookie只能在http(https)请求上传递,对客户端脚本语言无效,从而有效避免了跨站攻击。 
    第三方cookie: 第一方cookie是当前访问的域名或子域名下的生成的Cookie。 第三方cookie:第三方cookie是第三方域名创建的Cookie。

python模拟登录

 首先查看所要爬取网站登录源码:(豆瓣为例)

 
    看了这些之后,我们只用按照登录网址所需信息添加到post中就行。
添加所需的包。
 
   
1
2
3
4
5
import  requests
import  re
from  bs4  import  BeautifulSoup
import  random
import  urllib, urllib2
信息添加到post中
 
   
1
2
3
4
5
6
7
8
9
10
11
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' : 'http://www.douban.com/doumail' ,
     'form_email' : '*@qq.com' ,
     'form_password' : 'password' ,
     'login' : '登录' ,
     }
=  requests.post(login_url, data  =  my_post, headers  =  headers)
html  =  r.text
因为豆瓣登录需要验证码,但是本人并没有做过图像中验证码识别,于是直接正则匹配图片下载到本地,然后手工读取,在输入:
 
    
1
2
3
4
5
6
7
'''  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 ( 'captcha is: ' )
regid  =  r '<input type="hidden" name="captcha-id" value="(.*?)"/>'
ids  =  re.findall(regid, html)
再次发送
 
   
1
2
3
4
5
''' repost  '''
my_post[ "captcha-solution" =  captcha
my_post[ "captcha-id" =  ids[ 0 ]
=  requests.post(login_url, data  =  my_post, headers  =  headers)
print  q.url
 
  
如果登录成功,返回的URL就是:http://www.douban.com/doumail/,然后就可以正在获得用户信息了。
 
   
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
''' use bs4 filter douban.com's doumail following'''
if  q.url  = =  "http://www.douban.com/doumail/" :
     print  " login successfully!"
     soup  =  BeautifulSoup(q.text)
     tag  =  soup.find_all( 'span' , attrs = { 'class' : 'from' })
     tag2  =   soup.find_all( 'a' , attrs = { 'class' : 'url' })
     =  []
     for  in  tag:
         a.append(x.get_text())
     =  []
     for  in  tag2:
         b.append(y.get_text())
 
     def  split(num):
         print  a[num]  +  '  '  +   b[num]
         print 
                     
     print  '-' * 30 , u '豆瓣豆邮' '-' * 30
     for  in  range ( len (a)):
         split(x)
     print  '-' * 80
其实有很多种方法都可以实现,这只是一种,我也是在探索,希望和我一样的人可以一起探讨,请多多指教。

转载于:https://www.cnblogs.com/aaronchou820/p/6696255.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值