前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >可登陆爬虫Python实现

可登陆爬虫Python实现

作者头像
百川AI
发布2021-10-19 15:57:52
5980
发布2021-10-19 15:57:52
举报
文章被收录于专栏:我还不懂对话

    最近期末测试完结了,正好恰逢周末,就想找点事来做,之前做过爬虫,遇到了登录的问题,今天就来整理下。

    登录问题其实就是程序发送请求,服务器返回数据时,发出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中就行。

添加所需的包。

代码语言:javascript
复制
        1
       
       
        2
       
       
        3
       
       
        4
       
       
        5
       
       
        
         import 
         requests
        
        
         import 
         re
        
        
         from 
         bs4 
         import 
         BeautifulSoup
        
        
         import 
         random
        
        
         import 
         urllib, urllib2

信息添加到post中

代码语言:javascript
复制
        1
       
       
        2
       
       
        3
       
       
        4
       
       
        5
       
       
        6
       
       
        7
       
       
        8
       
       
        9
       
       
        10
       
       
        11
       
       
        
         login_url 
         = 
         "https://accounts.douban.com/login"
        
        
         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'
         :
         '登录'
         ,
        
        
             
         }
        
        
         r 
         = 
         requests.post(login_url, data 
         = 
         my_post, headers 
         = 
         headers)
        
        
         html 
         = 
         r.text

因为豆瓣登录需要验证码,但是本人并没有做过图像中验证码识别,于是直接正则匹配图片下载到本地,然后手工读取,在输入:

代码语言:javascript
复制
         1
        
        
         2
        
        
         3
        
        
         4
        
        
         5
        
        
         6
        
        
         7
        
        
         
          '''  download captcha  '''
         
         
          reg 
          = 
          r
          ''
         
         
          imglist 
          = 
          re.findall(reg, html)
         
         
          urllib.urlretrieve(imglist[
          0
          ], 
          '%d.jpg' 
          % 
          random.randint(
          1
          ,
          100
          ))
         
         
          captcha 
          = 
          raw_input
          (
          'captcha is: '
          )
         
         
          regid 
          = 
          r
          ''
         
         
          ids 
          = 
          re.findall(regid, html)

再次发送

代码语言:javascript
复制
        1
       
       
        2
       
       
        3
       
       
        4
       
       
        5
       
       
        
         ''' repost  '''
        
        
         my_post[
         "captcha-solution"
         ] 
         = 
         captcha
        
        
         my_post[
         "captcha-id"
         ] 
         = 
         ids[
         0
         ]
        
        
         q 
         = 
         requests.post(login_url, data 
         = 
         my_post, headers 
         = 
         headers)
        
        
         print 
         q.url
代码语言:javascript
复制
代码语言:javascript
复制
如果登录成功,返回的URL就是:http://www.douban.com/doumail/,然后就可以正在获得用户信息了。
代码语言:javascript
复制
        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'
         })
        
        
             
         a 
         = 
         []
        
        
             
         for 
         x 
         in 
         tag:
        
        
                 
         a.append(x.get_text())
        
        
             
         b 
         = 
         []
        
        
             
         for 
         y 
         in 
         tag2:
        
        
                 
         b.append(y.get_text())
        
        
          
        
        
             
         def 
         split(num):
        
        
                 
         print 
         a[num] 
         + 
         '  ' 
         +  
         b[num]
        
        
                 
         print 
        
        
                              
        
        
             
         print 
         '-'
         *
         30
         , u
         '豆瓣豆邮'
         , 
         '-'
         *
         30
        
        
             
         for 
         x 
         in 
         range
         (
         len
         (a)):
        
        
                 
         split(x)
        
        
             
         print 
         '-'
         *
         80

其实有很多种方法都可以实现,这只是一种,我也是在探索,希望和我一样的人可以一起探讨,请多多指教。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016/03/18 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 什么是Cookie?
  • Cookie的种类
相关产品与服务
验证码
腾讯云新一代行为验证码(Captcha),基于十道安全栅栏, 为网页、App、小程序开发者打造立体、全面的人机验证。最大程度保护注册登录、活动秒杀、点赞发帖、数据保护等各大场景下业务安全的同时,提供更精细化的用户体验。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档