路飞学城爬虫实战笔记(二)

Flask用法:

Flask框架是用python语言编写的一款小而精的web开发框架,本次web微信的开发用的此框架。

http方法:

如果需要处理具体的HTTP方法,一般使用route装饰器的methods参数设置即可。

from flask import request
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method =='GET':
ctime = str(int(time.time() * 1000))
qcode_url = 'https://login.wx.qq.com/jslogin?appid=wx782c26e4c19acffb&' \
'redirect_uri=https%3A%2F%2Fwx.qq.com%2Fcgi-bin%2Fmmwebwx-bin%2Fwebwxnewloginpage&' \
'fun=new&lang=zh_CN&_={}'.format(ctime)
ret = requests.get(qcode_url)
qcode = re.findall(r'uuid = "(.*)"', ret.text)[0]
# 把qcode放入session中
session['qcode'] = qcode
return render_template('login.html',qcode=qcode)

 模板生成

from flask import render_template
@app.route('/login')
def hello(data=None):
    return render_template('login.html', data=data)

Cookies

Flask也可以方便的处理Cookie。使用方法很简单

@app.route("/get_cookie")
def get_cookie():
    cookie = request.cookies.get("cookiesparmas")
    print "cookiesparmas={}".format(cookie)

 Session

我们可以使用全局对象session来管理用户会话。Sesison 是建立在 Cookie 技术上的,不过在 Flask 中,我们还可以为 Session 指定密钥,这样存储在 Cookie 中的信息就会被加密,从而更加安全。

from flask import Flask, request, render_template, session, jsonify
@app.route('/check_login')
def check_login():
    """
    发送get请求,监测是否已经扫码登录
    https://login.wx.qq.com/cgi-bin/mmwebwx-bin/login?loginicon=true&uuid=IY0kPdDpYQ==&tip=1&r=-1884082220&_=1530892439246
    https://login.wx.qq.com/cgi-bin/mmwebwx-bin/login?loginicon=true&uuid=gaQ_y7CT7Q==&tip=0&r=-2021270580&_=1531029500119
    :return:
    """
    # 在这里就可以获取qcode了
    response = {'code': 408}
    qcode = session.get('qcode')
    ctime = str(int(time.time() * 1000))
    check_url = 'https://login.wx.qq.com/cgi-bin/mmwebwx-bin/login?loginicon=true&uuid={}&tip=0&r=-2021270580&_={}'.format(qcode, ctime)
    ret = requests.get(check_url,headers = headers)
    if 'code=201' in ret.text:
        # 扫码成功
        src = re.findall("userAvatar = '(.*)';", ret.text)[0]
        # print(src)   # 获取到用户的头像地址
        response['code'] = 201
        response['src'] = src

    elif 'code=200' in ret.text:
        # 登录
        redirect_uri = re.findall(r'redirect_uri="(.*)"', ret.text)[0]
        # print(redirect_uri)
        # 向redirect_uri发送请求,返回需要的参数
        # redirect_uri= redirect_uri + " "
        redirect_uri = redirect_uri + '&fun=new&version=v2&lang=zh_CN'
        ticket_ret = requests.get(redirect_uri, headers=headers)
        ticket_dict = xml_parser(ticket_ret.text)

        # 存储凭证到字典中
        session['ticket_dict'] = ticket_dict
        # 存储这次请求的cookie
        session['ticket_cookie'] = ticket_ret.cookies.get_dict()

        response['code'] = 200
    return jsonify(response)

轮询与长轮询

轮询:客户端定时向服务器发送Ajax请求,服务器接到请求后马上返回响应信息并关闭连接。 

长轮询:客户端向服务器发送Ajax请求,服务器接到请求后夯住连接,直到有新消息才返回响应信息。 

后记

sql面试题:
-引擎:
innodb:支持事务操作,
-支持表锁/行锁,
-表锁:select * from tb for update;
-行锁:
select id,name from tb where id =2 for update;
用于多线程,相当于只能一个线程操作

myisam:支持全文索引,快,表锁

-表锁:
加锁语句,锁住整张表 select * from tb for update;
-设计表
-FK
-M2M 多对多

-查询表中的数据
-概念:
-触发器
-函数
-聚合:max/sum/min/avg
-时间格式化 date_format
-字符串拼接 concat
-存储过程
以上内容都是保存在数据库中

-索引: 索引的目的,加速查找,但是更新慢一些
单列:
b+索引
哈希索引(字典)适合都不重复的数据

-普通索引:index 只能加速查找
-唯一索引:unique 加速查找+约束,不能重复
- 主键:primay key 加速查找+约束,不能重复 + 不能为空
多列:
-联合索引:多列创建索引
-联合唯一索引:
ps:遵循最左前缀的规则
其他词语:
-索引合并,多个单列索引查询
-覆盖索引,在索引表中就能将想要的数据查询到
-创建了索引,应该如何命中索引?哪种情况下,创建了无法命中
www.cnbolgs.com/wupeiqi/articles/5716963.html
-开启慢日志查询?
-执行计划
explain select * from tb;
看这条语句的级别
select_type type all(全表扫描,很慢)
index(全表索引扫描,慢)

-导入导出

-数据库分页(类似于网站分页)
select * from tb limit 3 offset 5
models.User.objects.all()[0:10]


记录当前页 数据ID最大值和最小值
在翻页时,根据条件先进行筛选,筛选完毕之后,根据limit offset查询

2.requests参数回顾

img是不能定制请求头的  headers里的referer和host可以是防盗链

猜你喜欢

转载自www.cnblogs.com/Robertzewen/p/9282006.html