爬虫数据存储

数据存储

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
posted @ 2020-04-27 17:32  black__star  阅读(491)  评论(0编辑  收藏  举报