金沙国际官网_金沙国际平台登录

因为这个金沙国际官网_金沙国际平台登录网站与很多的大型澳门赌场都有合作,金沙国际官网_金沙国际平台登录尽职尽责,高效执行,保持好奇心,不断学习,追求卓越,点击进入金沙国际官网_金沙国际平台登录马上体验吧,所以现在也正式地开始了营业。

您的位置:金沙国际官网 > 编程 > Django用户认证系统,Python多线程爬虫与多种数据

Django用户认证系统,Python多线程爬虫与多种数据

发布时间:2019-11-03 21:56编辑:编程浏览(94)

    走进异步编程的世界 - 剖析异步方法(下)

     

    1. 多进程爬虫

      对于数据量较大的爬虫,对数据的处理要求较高时,可以采用python多进程或多线程的机制完成,多进程是指分配多个CPU处理程序,同一时刻只有一个CPU在工作,多线程是指进程内部有多个类似"子进程"同时在协同工作。python中有多种多个模块可完成多进程和多线程的工作,此处此用multiprocessing模块完成多线程爬虫,测试过程中发现,由于站点具有反爬虫机制,当url地址和进程数目较多时,爬虫会报错。

    一. 认证系统概要

    • create_user 创建用户
    • authenticate 验证登录
    • login 记住用户的登录状态
    • logout 退出登录
    • is_authenticated 判断用户是否登录
    • login_required 判断用户是否登录的装饰器

      感谢大家的支持,这是昨天发布《走进异步编程的世界 - 剖析异步方法(上)》的补充篇。

     

    2. 代码内容

    #!/usr/bin/python
    #_*_ coding:utf _*_
    
    import re
    import time 
    import requests
    from multiprocessing import Pool
    
    duanzi_list = []
    
    def get_web_html(url):
     '''
     @params:获取url地址web站点的html数据
     '''
     headers = {"User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0"}
     try:
      req = requests.get(url,headers=headers)
      if req.status_code == 200:
       response = req.text.encode('utf8')
     except Exception as e:
      print e
     return response
    
    def scrap_qiushi_info(url):
     '''
     @params:url,获取段子数据信息
     '''
     html = get_web_html(url)
     usernames = re.findall(r'<h2>(.*?)</h2>',html,re.S|re.M)
     levels = re.findall('<div class="articleGender w*Icon">(d+)</div>',html,re.S|re.M)
     laugh_counts = re.findall('.*?<i class="number">(d+)</i>',html,re.S|re.M)
     comment_counts = re.findall('<i class="number">(d+)</i> 评论',html,re.S|re.M)
     contents = re.findall('<div class="content">.*?(.*?)',html,re.S|re.M)
     for username,level,laugh_count,comment_count,content in zip(usernames,levels,laugh_counts,comment_counts,contents):
      information = {
       "username": username.strip(),
       "level": level.strip(),
       "laugh_count": laugh_count.strip(),
       "comment_count": comment_count.strip(),
       "content": content.strip()
      }
      duanzi_list.append(information)
     time.sleep(1)
     return duanzi_list
    
    def normal_scapper(url_lists):
     '''
     定义调用函数,使用普通的爬虫函数爬取数据
     '''
     begin_time = time.time()
     for url in url_lists:
      scrap_qiushi_info(url)
     end_time = time.time()
     print "普通爬虫一共耗费时长:%f" % (end_time - begin_time)
    
    def muti_process_scapper(url_lists,process_num=2):
     '''
     定义多进程爬虫调用函数,使用mutiprocessing模块爬取web数据
     '''
     begin_time = time.time()
     pool = Pool(processes=process_num)
     pool.map(scrap_qiushi_info,url_lists)
     end_time = time.time()
     print "%d个进程爬虫爬取所耗费时长为:%s" % (process_num,(end_time - begin_time))
    
    def main():
     '''
     定义main()函数,程序入口,通过列表推倒式获取url地址,调用爬虫函数
     '''
     url_lists = ['https://www.qiushibaike.com/text/page/{}'.format(i) for i in range(1,11)]
     normal_scapper(url_lists)
     muti_process_scapper(url_lists,process_num=2)
    
    
    if __name__ == "__main__":
     main()
    

    二. 创建用户和验证登录

    1. 当用户注册的时候用create_user(username,password,email)默认情况下is_active=True,is_staff=False,is_superuser=False

      • 底层将password用hash算法加密之后存储到数据库中。
    2. 当用户登录的时候用authenticate(username=username,password=password)验证登录,判断数据库中是否存在用户输入的账号和密码,返回一个user对象。

      • 底层将password用hash算法加密后和数据库中password进行对比。

    目录

    • 异常处理
    • 在调用方法中同步等待任务
    • 在异步方法中异步等待任务
    • Task.Delay() 暂停执行

      

     3. 爬取的数据存入到MongoDB数据库

    #!/usr/bin/python
    #_*_ coding:utf _*_
    
    import re
    import time 
    import json
    import requests
    import pymongo
    from multiprocessing import Pool
    
    duanzi_list = []
    
    def get_web_html(url):
     '''
     @params:获取url地址web站点的html数据
     '''
     headers = {"User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0"}
     try:
      req = requests.get(url,headers=headers)
      if req.status_code == 200:
       response = req.text.encode('utf8')
     except Exception as e:
      print e
     return response
    
    def scrap_qiushi_info(url):
     '''
     @params:url,获取段子数据信息
     '''
     html = get_web_html(url)
     usernames = re.findall(r'<h2>(.*?)</h2>',html,re.S|re.M)
     levels = re.findall('<div class="articleGender w*Icon">(d+)</div>',html,re.S|re.M)
     laugh_counts = re.findall('.*?<i class="number">(d+)</i>',html,re.S|re.M)
     comment_counts = re.findall('<i class="number">(d+)</i> 评论',html,re.S|re.M)
     contents = re.findall('<div class="content">.*?(.*?)',html,re.S|re.M)
     for username,level,laugh_count,comment_count,content in zip(usernames,levels,laugh_counts,comment_counts,contents):
      information = {
       "username": username.strip(),
       "level": level.strip(),
       "laugh_count": laugh_count.strip(),
       "comment_count": comment_count.strip(),
       "content": content.strip()
      }
      duanzi_list.append(information)
     return duanzi_list
    
    def write_into_mongo(datas):
     '''
     @datas: 需要插入到mongoDB的数据,封装为字典,通过遍历的方式将数据插入到mongoDB中,insert_one()表示一次插入一条数据
     '''
     client = pymongo.MongoClient('localhost',27017)
     duanzi = client['duanzi_db']
     duanzi_info = duanzi['duanzi_info']
     for data in datas:
      duanzi_info.insert_one(data)
    
    def query_data_from_mongo():
     '''
     查询mongoDB中的数据
     '''
     client = pymongo.MongoClient('localhost',27017)['duanzi_db']['duanzi_info']
     for data in client.find():
      print data 
     print "一共查询到%d条数据" % (client.find().count())
    
    
    def main():
     '''
     定义main()函数,程序入口,通过列表推倒式获取url地址,调用爬虫函数
     '''
     url_lists = ['https://www.qiushibaike.com/text/page/{}'.format(i) for i in range(1,11)]
     for url in url_lists:
      scrap_qiushi_info(url) 
      time.sleep(1)
     write_into_mongo(duanzi_list)
    
    if __name__ == "__main__":
     main()
     #query_data_from_mongo()
    

    三. 记住用户的登录状态

    当用户登录的时候用login(request,user)来记住用户的登录状态,默认将用户的id存储在session中。

    • login有两个参数一个是request,一个是user,user的来源必须是authenticate返回的。也就是说用login之前必须先调用authenticate

    本文由金沙国际官网发布于编程,转载请注明出处:Django用户认证系统,Python多线程爬虫与多种数据

    关键词:

上一篇:没有了

下一篇:没有了