zoukankan      html  css  js  c++  java
  • 爬虫数据存储

    数据存储

    redis 下载:

    https://github.com/MicrosoftArchive/redis/releases
        
    https://pan.baidu.com/s/1Jvr9MbgFn4UJh4M1AMo3gA   
    

    mongodb 存储:

    pip install pymongo
    
    # MONGODB configure
    MONGODB_SERVER = 'localhost'
    MONGODB_PORT = 27017
    MONGODB_DB = 'douban'
    MONGODB_COLLECTION = "book"
    
    class MongoDBPipeline(object):
        def __init__(self):
            connection = MongoClient(
                host=settings['MONGODB_SERVER'],
                port=settings['MONGODB_PORT']
            )
            db = connection[settings['MONGODB_DB']]
            self.collection = db[settings['MONGODB_COLLECTION']]
    
        def process_item(self, item, spider):
            self.collection.insert(dict(item))
            log.msg("Book  added to MongoDB database!",
                    level=log.DEBUG, spider=spider)
            return item
    

    打印日志文件:

    运行项目的时候控制台中输出的DEBUG信息保存到log文件中。只需要在settings中设置
    
    LOG_FILE = "logs/book.log"
    

    分布式:

    MongoDB的主从(一主多从)
    
    单机版爬虫:
    	引擎把一个request请求任务放到调度器任务队列,向服务器发起请求的时候会从调度器拿到request请求给下载器发起请求。
        
    分布式:
    	多台机器同时爬取数据大大提高了爬取的效率。当多台机器同时进行爬虫的时候我们需要一个资源管理的容器(调度器)取管理和分配任务
        提取的数据、新提取的url会继续构建一个request请求交给资源管理器
    

    img

    配置:

    pip3 install scrapy-redis
    
    reqeust去重,爬虫持久化,和轻松实现分布式
    
    Scrapy-redis提供了下面四种组件:
        	Scheduler
            Duplication Filter
            Item Pipeline
            Base Spider
    

    工作流程:

    img

    urlencode 编码:

    一、urlencode
    urllib库里面有个urlencode函数,可以把key-value这样的键值对转换成我们想要的格式,返回的是a=1&b=2这样的字符串,比如:
    
    import urllib.parse
    values={}
    values['username']='02蔡彩虹'
    values['password']='ddddd?'
    url="http://www.baidu.com"
    data=urllib.parse.urlencode(values)
    print(data)
    结果如下:
    
    如果只想对一个字符串进行urlencode转换,怎么办?urllib提供另外一个函数:quote()
    
    import urllib.parse
    s='长春'
    s=urllib.parse.quote(s)
    print(s)
    输出结果为:
    
    
    二、urldecode
    当urlencode之后的字符串传递过来之后,接受完毕就要解码了——urldecode。urllib提供了unquote()这个函数,可没有urldecode()!
    
    s='%E5%B9%BF%E5%B7%9E'
    s=urllib.parse.unquote(s)
    print(s)
    输出结果为:
    
    

    连接阿里云服务器:

    方案有一:
        1、先登录到阿里云ECS服务器控制台
        2、点击顶部的“控制台”
        3、通过左侧栏,切换到“云服务器ECS”即可,
         点击“远程连接”,第一次连接会自动生成6位数字密码,输入密码即可登录到云服务器上。
            
    方案二:
        命令:ssh root@你的服务器ip
    	回车输入密码即可登录。
    

    python实现邮件发送:

    import smtplib
    from email.mime.text import MIMEText
    from email.utils import formataddr
    my_sender = '1434399884@qq.com' # 发件人邮箱账号
    my_pass = '*********' # 发件人邮箱的授权码
    my_user = '3152609963@qq.com' # 收件人邮箱账号,我这边发送给自己
    def mail():
     ret= True
     try:
      msg = MIMEText('验证码为:123456', 'plain', 'utf-8')
      msg['From'] = formataddr(["From nicead.top", my_sender]) # 括号里的对应发件人邮箱昵称、发件人邮箱账号
      msg['To'] = formataddr(["FK", my_user]) # 括号里的对应收件人邮箱昵称、收件人邮箱账号
      msg['Subject'] = "验证码" # 邮件的主题,也可以说是标题
      server = smtplib.SMTP_SSL("smtp.qq.com", 465) # 发件人邮箱中的SMTP服务器,端口是25
      server.login(my_sender, my_pass) # 括号中对应的是发件人邮箱账号、邮箱密码
      server.sendmail(my_sender, [my_user, ], msg.as_string()) # 括号中对应的是发件人邮箱账号、收件人邮箱账号、发送邮件
      server.quit() # 关闭连接
     except Exception as e: # 如果 try 中的语句没有执行,则会执行下面的ret=False
      ret = False
     return ret
    ret = mail()
    if ret:
     print("邮件发送成功")
    else:
     print("邮件发送失败")
    

    短信验证:

    #发送短信
    #APIID:C11345804
    #APIKEY:735d183ae02189f678c26800ac19b03a
    # !/usr/local/bin/python
    # -*- coding:utf-8 -*-
    import http.client
    import urllib
    host = "106.ihuyi.com"
    sms_send_uri = "/webservice/sms.php?method=Submit"
    # 用户名是登录用户中心->验证码短信->产品总览->APIID
    account = "************"
    # 密码 查看密码请登录用户中心->验证码短信->产品总览->APIKEY
    password = "**********************"
    def send_sms(text, mobile):
     params = urllib.parse.urlencode(
      {'account': account, 'password': password, 'content': text, 'mobile': mobile, 'format': 'json'})
     headers = {"Content-type": "application/x-www-form-urlencoded", "Accept": "text/plain"}
     conn = http.client.HTTPConnection(host, port=80, timeout=30)
     conn.request("POST", sms_send_uri, params, headers)
     response = conn.getresponse()
     response_str = response.read()
     conn.close()
     return response_str
    if __name__ == '__main__':
     #需要接受短信的目标手机号
     mobile = "手机号"
      #短信内容
     text = "您的验证码是:121254。请不要把验证码泄露给其他人。"
     ret = send_sms(text, mobile).decode('utf-8')
     import json
     ret = json.loads(ret)
     print(ret)
    

    加密措施

    import hashlib
    import urllib.parse
    def password(word):
        m = hashlib.md5()
        m.update(word)
        psw = m.hexdigest()
        return psw
    
    # 内容 用 urlencode 编码
    def content_url(word):
        s = word
        s = urllib.parse.quote(s)
        return s
    
    import random,string
    def geneText():
        '''生成4位验证码'''
        return ''.join(random.sample(string.ascii_letters + string.digits, 4))
    

    flask 部署到阿里云服务器:

    https://www.cnblogs.com/homeworknotes/p/11219902.html
    
  • 相关阅读:
    django-模板之extends(三)
    django-模板之模板变量(二)
    django-模板之自定义模板路径(一)
    django-Views之类视图 (六)
    django-Views之使用视图渲染模板(五)
    django-Views之装饰器(四)
    django-Views之常见的几种错误视图代码(三)
    用nginx搭建http/rtmp/hls协议的MP4/FLV流媒体服务器
    通过nginx搭建hls流媒体服务器
    ffmpeg解码RTSP/TCP视频流H.264(QT界面显示视频画面)
  • 原文地址:https://www.cnblogs.com/shaozheng/p/12788264.html
Copyright © 2011-2022 走看看