<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[lempoo的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/lempoo</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; lempoo]]></copyright><item><title><![CDATA[Scrapy]]></title><link>https://blog.youkuaiyun.com/lempoo/article/details/110141092</link><guid>https://blog.youkuaiyun.com/lempoo/article/details/110141092</guid><author>lempoo</author><pubDate>Thu, 26 Nov 2020 00:20:49 +0800</pubDate><description><![CDATA[移动端数据爬取
- 工具:三方抓包工具(fiddler,青花瓷,miteproxy)
- 配置fiddler
    - tools-&gt;connections-&gt;设置fiddler服务器的端口-&gt;点击对勾(allow remote ....)
- 测试上一步的配置是否成功:
    - 本地pc端去访问:本机ip:8888(fiddler的端口)
        - 页面的作用:提供了一个下载证书的通道
    - 成功访问后,在页面中我们可以看到底部有一个连接,点击可以下载fiddler]]></description><category></category></item><item><title><![CDATA[加密 	scrapy]]></title><link>https://blog.youkuaiyun.com/lempoo/article/details/110091295</link><guid>https://blog.youkuaiyun.com/lempoo/article/details/110091295</guid><author>lempoo</author><pubDate>Tue, 24 Nov 2020 23:47:41 +0800</pubDate><description><![CDATA[js常见的加密方式
加密在前端开发和爬虫中是经常遇见的。掌握了加密算法且可以将加密的密文进行解密破解的，也是你从一个编程小白到大神级别质的一个飞跃。且加密算法的熟练和剖析也是很有助于帮助我们实现高效的js逆向。下述只把我们常用的加密方法进行总结。不去深究加密的具体实现方式。

常见的加密算法基本分为这几类：
线性散列算法（签名算法）MD5
对称性加密算法 AES DES
非对称性加密算法 RSA

Md5加密
MD5是一种被广泛使用的线性散列算法，可以产生出一个128位（16字节）的散列值（hash val]]></description><category></category></item><item><title><![CDATA[爬虫逆向(js逆向)]]></title><link>https://blog.youkuaiyun.com/lempoo/article/details/110006186</link><guid>https://blog.youkuaiyun.com/lempoo/article/details/110006186</guid><author>lempoo</author><pubDate>Tue, 24 Nov 2020 02:22:57 +0800</pubDate><description><![CDATA[异步爬虫的实现方式
- 线程池
- 多任务的异步协程
- 多线程(生产者消费者模型)

线程池
前提
from flask import Flask,render_template
from time import sleep
app = Flask(__name__)

@app.route('/bobo')
def index1():
    sleep(2)
    return render_template('test.html')

@app.route('/jay')
def index2()]]></description><category></category></item><item><title><![CDATA[模拟登陆  Selenium]]></title><link>https://blog.youkuaiyun.com/lempoo/article/details/109958244</link><guid>https://blog.youkuaiyun.com/lempoo/article/details/109958244</guid><author>lempoo</author><pubDate>Sun, 22 Nov 2020 22:51:23 +0800</pubDate><description><![CDATA[模拟登陆
使用爬虫实现登录操作.

为何需要做模拟登陆?
有些平台只有登录之后才可以访问其内部其他的子页面.

如何实现模拟登陆?
模拟点击登录按钮发起的请求即可
阻力:验证码的识别

验证码识别
使用线上的打码平台进行各种各样验证码的识别?(不包含滑动验证)
git下载滑动验证的代码

打码平台:
1 超级鹰:http://www.chaojiying.com/about.html
注册,登录
创建一个软件ID(899370)
下载实例代码
2 云打码

古诗文网的模拟登陆
1 创建超级鹰，下载代码

i]]></description><category></category></item><item><title><![CDATA[2020-11-19]]></title><link>https://blog.youkuaiyun.com/lempoo/article/details/109816412</link><guid>https://blog.youkuaiyun.com/lempoo/article/details/109816412</guid><author>lempoo</author><pubDate>Thu, 19 Nov 2020 17:40:10 +0800</pubDate><description><![CDATA[如何获取爬取图片数据?
两种方式
方式1:requests
方式2:urllib

示例
import requests
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'
}
#方式1:requests
url = 'https://timgsa.baidu.com/timg?]]></description><category></category></item><item><title><![CDATA[爬虫]]></title><link>https://blog.youkuaiyun.com/lempoo/article/details/109787855</link><guid>https://blog.youkuaiyun.com/lempoo/article/details/109787855</guid><author>lempoo</author><pubDate>Thu, 19 Nov 2020 01:25:33 +0800</pubDate><description><![CDATA[爬虫
requests(模块)

scrapy框架

数据结构+算法
数据结构
   链表和二叉树　
算法
选择,冒泡,插入,希尔,快速,二分查找等

数据分析
机器学习
Anacanda
集成环境.是一个基于数据分析和机器学习的集成环境.
安装
1.安装路径中不可以出现中文和特殊符号
2.记得添加环境变量
查看是否安装成功:
打开终端:jupyter notebook指令,按下回车

jupyter
Anancanda提供的一个基于浏览器的可视化开发工具.
启动:打开终端:jupyter notebook]]></description><category></category></item><item><title><![CDATA[Django]]></title><link>https://blog.youkuaiyun.com/lempoo/article/details/107208254</link><guid>https://blog.youkuaiyun.com/lempoo/article/details/107208254</guid><author>lempoo</author><pubDate>Wed, 08 Jul 2020 21:15:42 +0800</pubDate><description><![CDATA[get请求:
会把客户产生的数据放到url上.,url是路径+请求参数

http请求协议格式:
协议+域名+端口号+url  ==&gt;寻找服务器的某些文件等

http响应协议格式:
协议/版本+状态

客户产生的数据以“?”字符为起点，每个参数以“&amp;”隔开，再以“=”分开参数名称与数据，通常以UTF8的URL编码

域名后面的第一个斜杠是根路径

url:超文本传输协议（HTTP）的统一资源定位符



post请求,将客户产生的数据放到了请求数据一栏.

当以127.0.0.1:9001访]]></description><category></category></item><item><title><![CDATA[标签]]></title><link>https://blog.youkuaiyun.com/lempoo/article/details/107006604</link><guid>https://blog.youkuaiyun.com/lempoo/article/details/107006604</guid><author>lempoo</author><pubDate>Sun, 28 Jun 2020 23:40:58 +0800</pubDate><description><![CDATA[&lt;!DOCTYPE html&gt; &lt;!--文档申明 H5 html--&gt;
&lt;html lang="en"&gt; --&gt;指定当前的html文件主要的语言是什么 en代表英文,zh-cn代表中文
&lt;head&gt;  --&gt;配置文件
&lt;meta charset="UTF-8"&gt; -&gt;标签属性  格式:属性名称='属性值'  属性,用来规定标签的格式,效果等等
&lt;title&gt;Title&lt;/title&gt; --&gt;浏览器打开]]></description><category></category></item><item><title><![CDATA[前端]]></title><link>https://blog.youkuaiyun.com/lempoo/article/details/107000088</link><guid>https://blog.youkuaiyun.com/lempoo/article/details/107000088</guid><author>lempoo</author><pubDate>Sun, 28 Jun 2020 17:31:31 +0800</pubDate><description><![CDATA[如果是使用浏览器,不需要写客户端(发送数据格式要写),如果客户端是软件,需要写客户端
浏览器页面展示
1;html
2:css
3:js
4:js --query
5;bootstrap



html–标签–超文本标记语言,经过浏览器解析(html标记语言的解析器)
HTML介绍
　　Web服务本质
复制代码
复制代码
import socket
sk = socket.socket()
sk.bind((“127.0.0.1”, 8080))
sk.listen(5)
while True:
conn.]]></description><category></category></item><item><title><![CDATA[执行计划分析&事务处理]]></title><link>https://blog.youkuaiyun.com/lempoo/article/details/106944256</link><guid>https://blog.youkuaiyun.com/lempoo/article/details/106944256</guid><author>lempoo</author><pubDate>Wed, 24 Jun 2020 15:39:21 +0800</pubDate><description><![CDATA[### part1 索引树高度
1.表的数据量
数据量越大,树的高度就会变高,理论上三层索引树的高度最为理想,可以支持百万级别的数据量
解决: 可以使用分表(横切,竖切),分库,增加缓存,解决数据量大,查询慢
2.索引键值过长
该索引字段存储数据太大,每个叶子节点最大存储16k,超过这个范围会新增加叶子节点和分支节点
解决:前缀索引(截取前5个长度)
3.数据类型
char(定长) varchar(变长) 从开辟空间速度来看,char快
从数据结构上来看,varchar更为合理


(1) 避免使用sele]]></description><category></category></item><item><title><![CDATA[sql语句优化]]></title><link>https://blog.youkuaiyun.com/lempoo/article/details/106923507</link><guid>https://blog.youkuaiyun.com/lempoo/article/details/106923507</guid><author>lempoo</author><pubDate>Tue, 23 Jun 2020 16:04:48 +0800</pubDate><description><![CDATA[### part1 : sql语句优化
(1) mysql 执行流程
客户端:
发送连接请求,然后发送增删改查sql语句进行执行
服务端:
1.连接层:提供和客户端连接的服务,在tcp协议下,
提供多线程并发的技术,让多个用户登录到mysql中.
show processlist; 查看所有登录到mysql的用户进程
2.服务器:
	提供了各种接口(增删改查..)分析器组件会解析用户的sql语句
	如果发现sql语句执行效率较低,会提交给优化器组件进行优化,然后在执行
	(查询缓存:把上次搜过的数据,或者提]]></description><category></category></item><item><title><![CDATA[python 操作mysql★★★★★★]]></title><link>https://blog.youkuaiyun.com/lempoo/article/details/106867743</link><guid>https://blog.youkuaiyun.com/lempoo/article/details/106867743</guid><author>lempoo</author><pubDate>Sat, 20 Jun 2020 20:52:31 +0800</pubDate><description><![CDATA[### python 操作mysql(第三方操作)
import pymysql

1.基本语法
1:创建连接(返回对象)  host  user  password(数据库有密码写密码,没有就为空)  database(具体操作哪一个数据库) 这四个参数必须写
host 指定哪个数据库下的ip

conn = pymysql.connect(host="127.0.0.1",user="root",password="",database="db0618",charset="utf8"(指定字符集,可以不]]></description><category></category></item><item><title><![CDATA[表查询★★★★★]]></title><link>https://blog.youkuaiyun.com/lempoo/article/details/106845247</link><guid>https://blog.youkuaiyun.com/lempoo/article/details/106845247</guid><author>lempoo</author><pubDate>Fri, 19 Jun 2020 00:57:19 +0800</pubDate><description><![CDATA[### 单表查询
sql 查询语句的完整语法:
"""select   字段 from .表   where .. group by(分组,分类) .. having(塞选) .. order by(排序) .. limit(条数) .."""
要看查询的是什么

一.where 条件的使用
	"""功能: 对表中的数据进行筛选和过滤"""

	"""
语法:
	1.判断的符号:
	= &gt; &gt;= &lt; &lt;= != &lt;&gt; 不等于
	2.拼接条件的关键字
	and or not]]></description><category></category></item><item><title><![CDATA[数据库★★★★★]]></title><link>https://blog.youkuaiyun.com/lempoo/article/details/106799447</link><guid>https://blog.youkuaiyun.com/lempoo/article/details/106799447</guid><author>lempoo</author><pubDate>Wed, 17 Jun 2020 06:03:59 +0800</pubDate><description><![CDATA[### mysql
“”"
命令可以用tab来补全
d:
D:&gt;cd MySQL5.7
D:&gt;cd D:\MySQL5.7\mysql-5.7.25-winx64\bin 直接切换到对应的路径
D:&gt;dir 来查看文件夹里面的内容
“”"
cls 清屏(windows) ctrl + l 清屏(linux)
ctrl + c 终止
[windows] 在超级管理员权限下才能使用:
net start mysql  启动mysql
net stop mysql   停止mysql
[linu]]></description><category></category></item><item><title><![CDATA[协程★★★★★]]></title><link>https://blog.youkuaiyun.com/lempoo/article/details/106740646</link><guid>https://blog.youkuaiyun.com/lempoo/article/details/106740646</guid><author>lempoo</author><pubDate>Sun, 14 Jun 2020 14:07:20 +0800</pubDate><description><![CDATA[### 协程
#进程:资源划分的最小单位(划分的地)
#线程:执行调度的最小单位(工人)
#协程是线程的一种实现方式(协程是工人的办事方法,在一个线程里分为好多协程,基于上次状态往下做)


安装协程模块 gevent
用协程改成一下生产者消费者模型
def producer():
	# 数据范围0 ~ 999
	for i in range(1000):
		yield i
	
def counsumer(gen):
	for i in range(10):
		print(next(gen))

初始化]]></description><category></category></item><item><title><![CDATA[进程池和线程池★★★★★]]></title><link>https://blog.youkuaiyun.com/lempoo/article/details/106736381</link><guid>https://blog.youkuaiyun.com/lempoo/article/details/106736381</guid><author>lempoo</author><pubDate>Sun, 14 Jun 2020 00:07:23 +0800</pubDate><description><![CDATA[### 进程池
from concurrent.futures import ProcessPoolExecutor,ThreadPoolExecutor
Executor 执行器
进程池和进程的id引用一样
线程池和线程的id引用一样

ProcessPoolExecutor 进程池基本使用
import os,time
def func(i):
	print("任务执行中... start" , os.getpid())
	time.sleep(10)
	print("任务结束... end" , i)]]></description><category></category></item><item><title><![CDATA[锁(总结)]]></title><link>https://blog.youkuaiyun.com/lempoo/article/details/106728579</link><guid>https://blog.youkuaiyun.com/lempoo/article/details/106728579</guid><author>lempoo</author><pubDate>Sat, 13 Jun 2020 13:01:48 +0800</pubDate><description><![CDATA[### 死锁,互斥锁,递归锁
from threading import Lock,Thread,RLock
import time

死锁
只上锁不解锁,就会出现阻塞,下面的代码不执行,叫做死锁

noodle_lock = Lock()
kuaizi_lock = Lock()
def eat1(name):
	noodle_lock.acquire()
	print("%s 拿到面条啦!!" % (name))
	kuaizi_lock.acquire()
	print("%s 拿到筷子啦!!" % ]]></description><category></category></item><item><title><![CDATA[线程★★★★★]]></title><link>https://blog.youkuaiyun.com/lempoo/article/details/106692968</link><guid>https://blog.youkuaiyun.com/lempoo/article/details/106692968</guid><author>lempoo</author><pubDate>Thu, 11 Jun 2020 20:25:34 +0800</pubDate><description><![CDATA[### 线程
进程: 资源分配最小单位
线程: cpu执行程序的最小单位 
一个进程必须有一个线程,一个线程可以包含多个线程

一份进程资源中可以包含多个线程
from threading import Thread  ==&gt;引入线程(属于一个类)
from multiprocessing import Process  ==&gt;引入进程(属于一个类)
import os
def func(num):
	print('当前线程{},所归属的进程id号{}'.format(os.getpid(),n]]></description><category></category></item><item><title><![CDATA[进程    锁和事件和进程队列★★★★★]]></title><link>https://blog.youkuaiyun.com/lempoo/article/details/106670758</link><guid>https://blog.youkuaiyun.com/lempoo/article/details/106670758</guid><author>lempoo</author><pubDate>Thu, 11 Jun 2020 02:44:37 +0800</pubDate><description><![CDATA[###锁 lock(同一时间上一把锁,会在自己内部给各个进程发出消息(状态))   ★★★★★
#高访问量的都是用到多进程和多线程(速度快)
#引入锁Lock
#上锁会从异步变成同步,有先有后
#如果必须要同步执行操作(有先有后),将执行操作的内容前后进行上锁
#函数的调用处和定义处,普通参数要一一对应,关键字参数有就用自己的,没有就默认用定义处的,如果需要在引入函数处理逻辑,要将处理的参数给调用处
#args后面的参数是普通参数要一一对应,有给出的参数要用给出的参数,没有就写定义处的
from multi]]></description><category></category></item><item><title><![CDATA[进程★★★★★]]></title><link>https://blog.youkuaiyun.com/lempoo/article/details/106644373</link><guid>https://blog.youkuaiyun.com/lempoo/article/details/106644373</guid><author>lempoo</author><pubDate>Tue, 09 Jun 2020 21:54:09 +0800</pubDate><description><![CDATA[###并行和并发
并发:一个cpu同一时间不停执行多个程序
并行:多个cpu同一时间不停执行多个程序

cpu的进程调度方法
先来先服务fcfs(first come first server):先来的先执行
短作业优先算法:分配的cpu多,先把短的算完
时间片轮转算法:每一个任务就执行一个时间片(时间段)的时间.然后就执行其他的.
多级反馈队列算法
越是时间长的(例如下载),cpu分配的资源越少,优先级靠后
越是时间短的,cpu分配的资源越多


###同步 异步
场景在多任务当中
同步:必须等我这件事干]]></description><category></category></item></channel></rss>