西区代码小仓库 - mysql
type: channel
link: https://www.lisper517.top/tag/mysql/
items: Python，爬虫与深度学习（10）——scrapy+mysql构建ipool
items: Python，爬虫与深度学习（6）——爬虫详解（二）构建自己的ip池（简易版）
items: Python，爬虫与深度学习（5）——番外篇（三）MySQL数据库进阶
items: Python，爬虫与深度学习（4）——番外篇（二）MySQL数据库基础
items: Python，爬虫与深度学习（2）——爬虫详解（一）爬取金融机构成交持仓排名
items: frp+云服务器搭建能从外网访问的redis、mysql

Python，爬虫与深度学习（10）——scrapy+mysql构建ipool
type: item
date: 2022-09-13T02:01:00+00:00
description: 步骤/目录： 1.运行mysql数据库与准备工作 2.自建库 3.创建、修改、运行scrapy项目 （1）其他配置 （2）爬虫配置 a.a2u.py b.clarketm.py c.cool_proxy.py d.free_proxy_list.py e.ip3366.py f.ipaddress.py g.jiangxianli.py h.kuaidaili.py i.pubproxy.py j.rmccurdy.py k.sunny9577.py l.TheSpeedX.py （3）运行爬虫 4.验证ip 5.日常使用本文首发于个人博客https://lisper517.top/index.php/archives/48/，转载请注明出处。本文的目的是使用 scrapy+mysql 搭建一个自己的代理ip池，即ipool。由于本文是对前文进行阶段性总结+拓展，所以内容较多，笔者希望本文单独拿出来也能成功跟着一步步操作。本文写作日期为2022年9月11日。mysql数据库运行在树莓派上，其他部分运行在win10机器；使用的编辑器为VS Code。爬虫写的好，牢房进的早。使用爬虫时不要占用服务器太多流量，否则可能惹祸上身。笔者的能力有限，也并非CS从业人员，很多地方难免有纰漏或者不符合代码原则的地方，请在评论中指出。1.运行mysql数据库与准备工作笔者在树莓派上使用docker安装mysql，需要预先安装docker、docker-compose，在树莓派上安装docker、docker-compose可查看 Docker入门（一） 。也不一定非要在树莓派上运行mysql，或者也不一定要用docker，或者也可以用redis等其他数据库代替mysql（使用其他数据库时后续的py文件可能需要自行调整），反正最终的目的是运行一个数据库，可以参考 runoob教程 使用其他方法安装运行mysql数据库。在树莓派上进行如下操作：mkdir -p /docker/mysql/data/mysql mkdir -p /docker/mysql/conf/mysql mkdir -p /docker/mysql/backup/mysql docker pull mysql:8.0.29 nano /docker/mysql/docker-compose.yml在docker-compose.yml文件中写入如下内容：version: "3.9" services: mysql: image: mysql:8.0.29 environment: MYSQL_ROOT_PASSWORD: mysqlpasswd ports: - "53306:3306" command: - mysqld - --character-set-server=utf8mb4 volumes: - /docker/mysql/data/mysql:/var/lib/mysql - /docker/mysql/conf/mysql:/etc/mysql/conf.d - /docker/mysql/backup/mysql:/backup logging: driver: syslog restart: always记得把 MYSQL_ROOT_PASSWORD: mysqlpasswd 这里改成自己想设置的密码，把 53306 也可以改成自己想要的端口（不建议用默认的3306端口）。这里的 /docker/mysql/backup/mysql 目录是为了方便docker-mysql导出、备份数据。然后运行：cd /docker/mysql docker-compose config docker-compose up -d接下来进容器服务里看看mysql是否正常运行：docker exec -it mysql-mysql-1 bash #如果是老版本的docker-compose，把这一条命令中的所有 - 换成 _ mysql -uroot -p #输入密码 SHOW DATABASES;确认mysql正常运行即可。为了保证创建database和table的命令能记录下来，这些命令将写在python文件中。然后在win10机器上准备一下环境。需要安装python3，安装scrapy和其他库，创建自建库文件夹，创建scrapy项目文件夹。win10机器安装python3的过程这里就不讲了。安装好后，在cmd中运行 pip install Scrapy ，其他可能需要的库还有requests（处理网络请求）、bs4（对响应内容进行解析）、pymysql（连接mysql数据库）、lxml（网页解析器）、cryptography（连接mysql时密码加密）、seleniu…

Python，爬虫与深度学习（6）——爬虫详解（二）构建自己的ip池（简易版）
type: item
date: 2022-09-04T15:13:00+00:00
description: 步骤/目录： 1.需求分析 2.mysql建表 3.网页请求分析 4.爬虫编写 （0）安装所需模块 （1）mysql存取 （2）爬虫主体编写 （3）其他爬虫补充 （4）实际运行 （5）检测爬取的ip 5.总结与改进本文首发于个人博客https://lisper517.top/index.php/archives/44/，转载请注明出处。本文的目的是构建自己的ip池。本文写作日期为2022年9月4日。操作的平台为win10，编辑器为VS code。爬虫写的好，牢房进的早。使用爬虫时不要占用服务器太多流量，否则可能惹祸上身。除了python与爬虫，这里实际上还需要了解html格式与mysql命令。可以在 runoob-html 或 runoob-mysql 找到初步的学习资料，或者查看笔者其他的文章。最后，笔者的能力有限，也并非CS从业人员，很多地方难免有纰漏或者不符合代码原则的地方，请在评论中指出。1.需求分析之前说过，在对别人的网页服务器进行爬取时要注意不能占用太多服务器资源。但有时候，我们确实需要在短时间内对某个网页高频访问，又担心自己被封ip，那么此时维护一个ip池就非常有必要，我们需要对网络上的ip（每个ip背后是一个或一群服务器）进行测试，看是否能利用这些ip作为代理服务器访问其他网页。本文先介绍如何爬取ip，后续文章会介绍如何用自己的ip池爬取网页，以及代理失效时更换代理。在爬虫的一些较高级的应用中，一个ipool是非常基础且不可或缺的，所以建议学会scrapy后就应该尽快建立自己的ipool（除非没有高频访问某个网页的需求）。ip池的构建和使用分为两步，第一步是筛选ip。世界上的公网ipv4地址最多有 4,294,967,296 个（256^4。实际上有一些被局域网占用，有一些不会使用），要一个个去验证这些ip耗时太长，何况还需要对已存在的ip进行验证、剔除失效ip。所以，这里使用一些提供免费代理ip的网页缩小ip搜索范围，爬取到的代理ip不做验证，都放入库中（这里使用mysql）。第二步是对mysql中已有的ip进行验证，挑选出对某个网址有效的代理ip。这一步严格来讲和第一步关系不大，它可以在前一个步骤进行时也同步进行，更重要的是这一步是在其他爬虫开始后才进行，下面就讲解一下免费代理ip的使用。免费代理可分为HTTP或HTTPS，高匿名和低匿名。如果爬虫运行时经过了这些免费代理，毕竟还是别人的服务器，你的请求和响应是到了别人那里，所以用代理服务器时不要传递一些私密信息。实在有必要的话，自己买服务器做转发。最后，同一个代理ip，可能你用它代理一个网站可以，代理另一个网站就不行，这也是不确定因素，所以爬到的代理ip在使用时还要对特定的网址进行测试，其实也是比较麻烦的，如果有紧急需求，建议买一些付费的代理ip。2.mysql建表在mysql中存储收集到的ip，需要新建以下列：ip，字符串形式，VARCHAR(50)（为了将来兼容ipv6，稍微长一点）；端口号，数值形式，SMALLINT UNSIGNED（刚好是0~65535）；匿名度，2个bit位，BIT(2)（0表示低匿名，1表示高匿名，3表示未知）；类型（HTTP还是HTTPS），2个bit位，BIT(2)（0表示HTTP，1表示HTTPS，2表示都可，3表示其他）；ip物理位置，字符串，VARCHAR(100)；响应速度，MEDIUMINT，单位是毫秒ms；最后一次验证的时间，日期时间格式。建表的语句在程序中将给出。其实对这种不断更新、添加的数据，redis更加合适，有关redis的内容将在后续的文章中介绍。3.网页请求分析这里使用的提供代理ip的网站为（笔者给出的例子中，只使用了第一个网址）：http://www.ip3366.net/free/ https://www.kuaidaili.com https://ip.jiangxianli.com/ https://www.cool-proxy.net/ https://free-proxy-list.net https://www.ipaddress.com/proxy-list/ http://proxy-list.org/english/ https://www.proxynova.com/proxy-server-list/ http://pubproxy.com/api/proxy?limit=5&format=txt&type=http&level=anonymous&last_check=60&no_country=CN https://www.rmccurdy.com/.scripts/proxy/good.txt http://spys.one/en/anonymous-proxy-lis…

Python，爬虫与深度学习（5）——番外篇（三）MySQL数据库进阶
type: item
date: 2022-09-03T08:31:00+00:00
description: 步骤/目录： 1.再谈数据库基础概念 2.mysql基础命令 （1）SHOW与USE （2）HELP 3.检索数据 （1）SELECT （2）DISTINCT （3）LIMIT （4）ORDER BY （5）WHERE （6）IN （7）LIKE与通配符% （8）正则表达式 4.检索数据的进阶操作 （1）计算字段 （2）数据处理函数 （3）聚集函数 （4）数据分组 （5）子查询 （6）联结表 （7）其他联结概念 （8）组合查询 （9）全文本搜索 5.插入数据 6.更新删除数据 7.创建和操作表 8.视图 9.存储过程及其他 10.数据库维护 11.mysql使用的原则 12.python中使用mysql本文首发于个人博客https://lisper517.top/index.php/archives/43/，转载请注明出处。本文的目的是对MySQL进行进阶学习、总结。本文写作日期为2022年9月3日。本文主要整理自《MySQL必知必会》。1.再谈数据库基础概念数据库，从字面意思上理解就是存储数据的仓库。其实把爬虫爬取到的页面存成html放到一个文件夹里也算数据库，只是存取效率较慢。实际上，现在说的数据库一般指数据库管理系统（DBMS，database management system），相比于简单地把数据存成文件，DBMS的存取效率更高，占用空间更小。前一篇文章中提到，在数据库中的每一行数据应该有一项独特的数据区别于其他行，称为主键。实际上，主键也可以是几项数据的组合，比如说有一群人，存储他们的身高、体重两项数据，单独一项拿出来可能很容易有重复，但两项都相同的情况就会大大减少，大概就是这个意思。一般来说，主键确定以后就不要更新，即使某一行被删除、它的主键也不应该复用，主键的值在未来不应该更改。SQL即structured query language，与程序设计的C++、Python语言等不同，SQL的构成词少、相对简单，主要是为了操作数据而存在。很多数据库都支持SQL，比如MySQL就使用标准SQL语言，但是不同数据库软件间的语法可能有一些区别，mysql的语句就有可能无法在其他数据库中正常运行（除了mysql的同卵双胞胎mariadb）。MySQL的运行模式是C/S，即Client/Server，数据库存储在服务器上，其他机器通过mysql客户端访问（即使一台机器访问在本机运行的mysql服务器也要通过客户端）。mysql的客户端和服务器端使用同一套软件，就是说安装了mysql就同时安装了服务器端和客户端；或者也可以使用编程语言，如python的pymysql库当作客户端访问服务器端；或者有一些图形化的管理工具，可以一定程度上简化mysql操作。目前（2022年9月）MySQL的版本已经到8.0.29（指docker-mysql），但很多语句还是通用的。一般使用的mysql客户端就是mysql命令行，即你在安装了mysql后用 mysql -h 服务器ip -P 端口号 -uroot -p 进入的界面。mysql命令行中使用命令有两个注意事项：每行命令用 ; 或 \g 结尾后再按 enter键 才会执行（除了少部分简单的语句）；输入 exit 或 quit 可退出。另外还有一些图形化的界面，笔者在这里推荐 MySQL Workbench ，其下载页面为 https://dev.mysql.com/downloads/workbench/ ，它是mysql官方推出的工具（之前mysql被Oracle拿下了），功能强大。另外mysql现在还推出了MySQL Installer，可以一键管理各种mysql官方软件。最后，如果要在mysql命令行里清屏，使用 system clear 或 system cls ，前者适用于linux客户端、后者适用于cmd。2.mysql基础命令（1）SHOW与USESHOW DATABASES 显示所有数据库；USE 数据库名 使用某个数据库，后续操作都在该库中进行；SHOW TABLES 展示库中的表名；SHOW COLUMNS FROM 表名 或 DESCRIBE 表名 来查看一张表有哪些列，列的数据类型等信息，返回的表格式为：+--------------+--------------+------+-----+-------------------+-------------------+ | Field | Type | Null | Key | Default | Extra | +--------------+--------------+------+-----+-------------------+-------------------+分别表示 列名 ， 数据类型 ， 可…

Python，爬虫与深度学习（4）——番外篇（二）MySQL数据库基础
type: item
date: 2022-09-02T15:08:00+00:00
description: 步骤/目录： 1.mysql特性与基础概念，及安装 2.进入mysql命令行与基本设置 3.mysql命令行的基础命令 4.增删库、表及注意事项 5.表内数据的基础增删查改 6.LIKE 与模糊查找本文首发于个人博客https://lisper517.top/index.php/archives/42/，转载请注明出处。本文的目的是对MySQL进行简单介绍，便于用mysql存储爬虫爬取到的数据。本文写作日期为2022年9月2日。本文主要整理自 runoob教程 。进阶学习mysql可以参考《MySQL必知必会》、《高性能MySQL》等其他书籍，github上有收集这些CS书的仓库；或者查看笔者后续的文章。1.mysql特性与基础概念，及安装除了mysql，还有redis等各种数据库（或者mysql的亲兄弟mariadb等各种sql），它们是为了高速存储数据而出现的。mysql是一种关系性数据库，从上到下，它的构成是：各数据库（database） - 各张表格（table） - 每张表格由行和列组成，列有列名，每一行存储一个条目/记录，每一列的数据类型相同 。另外，mysql中还有主键和索引的概念，每一行记录的主键都不同（其他列可能相同），所以主键可以用于区分每一行记录；索引，类似书籍的目录，用于快速访问数据。mysql支持大型数据库，单张表的上限主要和操作系统允许的最大文件有关，一般来说，一张表占4GB就差不多了，再高可能有一些性能上的问题。最后，mysql是开源的，目前是被Oracle买下。在安装mysql上，笔者建议尽量用docker-mysql的方式安装，可参考 docker-mysql官网 ，或笔者之前的文章。一个基础的docker-compose模板如下：version: "3.9" services: mysql: image: mysql:8.0.29 environment: MYSQL_ROOT_PASSWORD: mysqlpasswd ports: - "53306:3306" command: - mysqld - --character-set-server=utf8mb4 volumes: - /docker/mysql/data/mysql:/var/lib/mysql - /docker/mysql/conf/mysql:/etc/mysql/conf.d - /docker/mysql/backup/mysql:/backup logging: driver: syslog restart: always注意更改一下 MYSQL_ROOT_PASSWORD: mysqlpasswd 这里的密码和 - "53306:3306" 这里的端口（不建议用默认的3306端口）。2.进入mysql命令行与基本设置使用命令： mysql -h 127.0.0.1 -P 3306 -uroot -p 可以mysql里的root用户身份登录mysql， -h 参数指定mysql服务器端的ip， -P 指定端口， -u 指定登录用户（如果用root以外的其他用户登，可用 -u 其他用户名 的格式。注意登录的用户不是linux系统里的用户，而是mysql数据库里的用户）， -p 指定密码登录，之后输入密码即可。如果是本机、默认的3306端口（mysql默认使用3306端口），则前两个参数可以省略。最后，登录其他机器上的mysql服务器时要注意登录的用户是否允许远程登录（docker-mysql则没有这个问题）。如果使用docker-mysql，根据 docker-mysql官网 的描述，将自己的mysql配置文件夹挂载到容器的 /etc/mysql/conf.d 文件夹，如果该文件夹里有任何cnf结尾的文件都会覆盖docker-mysql的默认配置。另外，docker-mysql的默认配置文件为容器里的 /etc/mysql/my.cnf 。关于配置方面，笔者几乎没有更改过，所以这方面了解的不多。用 mysql -h 127.0.0.1 -P 3306 -uroot -p 登录到mysql命令行后，可以新建其他用户。比较推荐的是用GRANT命令：GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP ON TUTORIALS.* TO 'zara'@'localhost' IDENTIFIED BY 'zara123';这条命令的第一行是为新建的用户赋予权限。这里赋予了该用户查询、插入、更新、删除数据，及新建、删除数据库/表的权限。也可以自行增加或删除权限，或者用 ALL PRIVILEGES 指代所有权限。第二行限定该用户只对TUTORIALS这个database下的所有表有这…

Python，爬虫与深度学习（2）——爬虫详解（一）爬取金融机构成交持仓排名
type: item
date: 2022-08-30T03:22:00+00:00
description: 步骤/目录： 1.需求分析 2.网页请求分析 3.mysql数据库的设置 4.爬虫编写 （0）安装所需模块 （1）日期 （2）爬虫主体编写 （3）mysql存储 （4）正式运行 5.总结与后续本文首发于个人博客https://lisper517.top/index.php/archives/39/，转载请注明出处。本文的目的是从实战出发讲解爬虫+python。由于还想讲解一下python的写法，所以爬虫写的稍微多了一点。本文写作日期为2022年8月30日。操作的平台为win10，编辑器为VS code。爬虫写的好，牢房进的早。使用爬虫时不要占用服务器太多流量，否则可能惹祸上身。除了python与爬虫，这里实际上还需要了解html格式与mysql命令。可以在 runoob-html 或 runoob-mysql 找到初步的学习资料，或者查看笔者后续的文章。最后，笔者的能力有限，也并非CS从业人员，很多地方难免有纰漏或者不符合代码原则的地方，请在评论中指出。1.需求分析在中国金融期货交易所（中金期货）的官网上有各个金融机构的成交持仓数据，具体网址为 http://cffex.com.cn/ccpm/ 。搜索期货、期权，选择类目、日期，即可看到各机构的成交持仓排名，这个数据可以一定程度上反映各金融机构对大盘走势的判断。本文将介绍如何爬取这些数据，在之后的文章中会试图用机器学习的方法对这些数据进行学习、预判。需求是爬取这些数据，并存入mysql数据库。这里会用到requests、bs4（BeautifulSoup）库，就不用scrapy这种牛刀了（scrapy一般也不会用于爬这种表格请求，而是用于递归爬取全站）。2.网页请求分析在chrome中打开网页，按F12打开网页开发工具，在右上角竖着的三个点里找到 停靠侧 ，选择 取消停靠至单独的窗口 。在网页窗口中选择期货，选择一种类目（比如IF），选择前一天，点击查询，这时网页里会出现数据，网页开发工具里会出现一条新的项目，点击这个项目，发现请求网址为 http://cffex.com.cn/sj/ccpm/2022XX/XX/IF.xml?id=97 ，其中 2022XX/XX 是当天的日期。复制这个请求网址并打开，发现是XML格式的数据（html），其中一项如下：<positionRank> <instrumentid>IF2212</instrumentid> <tradingday>2022XXXX</tradingday> <datatypeid>0</datatypeid> <rank>13</rank> <shortname>宝城期货</shortname> <volume>343</volume> <varvolume>136</varvolume> <partyid>0110</partyid> <productid>IF</productid> ...与原网页对照，其中 datatypeid 可能有0、1、2，分别表示成交量排名、持买单量排名、持卖单量排名。经过实验，网址里的 ?id=97 没有什么具体的意义，大概就是一个1~99的随机数。那么只用日期和品种生成网址就行了。最后检查一下请求和响应里有没有什么特殊的项目，没有则只设置一下请求的User-Agent（UA）即可。3.mysql数据库的设置这里选择用docker在树莓派上运行mysql服务。当然也可以直接安装mysql，各种平台安装mysql的教程见 runoob教程 。无论何种方法运行mysql，最关键的问题是搞清楚运行mysql机器的ip，和mysql的root用户密码。如果不是在本地运行mysql，还要注意mysql的root用户是否能远程登录。在树莓派上进行如下操作：mkdir -p /docker/mysql/data/mysql mkdir -p /docker/mysql/conf/mysql mkdir -p /docker/mysql/backup/mysql docker pull mysql:8.0.29 nano /docker/mysql/docker-compose.yml写入如下内容：version: "3.9" services: mysql: image: mysql:8.0.29 environment: MYSQL_ROOT_PASSWORD: mysqlpasswd ports: - "53306:3306" command: - mysqld - --character-set-server=utf8mb4 volumes: - /docker/mysql/data/mysql:/var/lib/mysql - /docker/mysql/conf/mysql:/etc…

frp+云服务器搭建能从外网访问的redis、mysql
type: item
date: 2022-01-30T16:00:00+00:00
description: 步骤/目录： 1.在windows笔记本上下载并配置redis-server 2.购买阿里云服务器，安装frp并配置frps服务器端 3.配置frpc客户端 4.开启服务并验证 5.附录：mysql+frp （1）修改配置 （2）创建远程连接用户 （3）赋予用户权限并刷新退出 （4）打开端口 （5）修改frpc.ini并开启frp本文首发于个人博客https://lisper517.top/index.php/archives/3/，转载请注明出处。本文实验日期2022年1月31日。采用windows笔记本（跑redis服务器）+阿里云服务器（系统镜像Ubuntu 20.04）1.在windows笔记本上下载并配置redis-serverredis官方不建议在windows下运行redis，所以并未提供windows版redis下载。有一些其他大神更新了windows版redis，以下推荐2个：首先是微软版redis。由微软方提供，于2016年7月1日更新了3.0.504版后停止更新。其次是tporadowski版redis（推荐）。由github用户tporadowski提供，目前最新版本为2021年10月18日更新的Redis 5.0.14 for Windows。（若遇到github网页无法打开，可在gitee上注册并导入仓库后下载）（根据runoob网站，Redis5.0新增了Stream数据结构，所以还是下新版的好）对于tporadowski版redis，下载.zip包，解压到安装目录即可。解压完毕后，打开Redis文件夹，编辑redis.windows.conf文件，需要修改3处：将bind 127.0.0.1行注释掉。这一行是仅允许从本地访问redis；用frp应该不用改，但是笔者需要在局域网中访问，所以还是打开了。 将protected-mode yes改为protected-mode no。老版本的redis可能没有这一行，如果没有则建议重新下载新版redis； 新增一行：requirepass 你的密码。由于redis的处理速度较快，建议密码设置的复杂一些。配置完成后，打开cmd命令行，cd到redis文件夹（也可以将redis文件夹添加到系统路径），输入redis-server redis.windows.conf，正常显示redis服务器端界面，即可。在linux下redis的配置也差不多，不同的是linux下redis的配置文件是redis.conf。2.购买阿里云服务器，安装frp并配置frps服务器端首先介绍一下frp。frp分为frps（server）和frpc（client），其中frps运行在有公网ip的云服务器上，frpc运行在内网中的机器上。frp主要用于把内网机器的端口映射到云服务器端口，比如把内网机器的22端口（一般用于ssh）映射到云服务器的6000端口，那么访问云服务器的6000端口即可接入内网机器的ssh服务。如果有其他方法搞到公网ip，也可以跳过这一步。随便选择一个便宜的服务器，购买后安装镜像，这里选择的系统镜像是Ubuntu 20.04。在左侧 服务器运维-远程连接 中设置一下root账户密码，然后下载putty，通过putty连接：连接类型为SSH，端口为默认的22，主机地址填云服务器的ip地址。输入root和root密码后即登录到云服务器。目前frp最新版本为0.38.0（2021年10月25更新）。这里安装frp到/bin目录下（wget github速度慢可以换成gitee上的仓库）：cd /bin wget https://github.com/fatedier/frp/releases/download/v0.38.0/frp_0.38.0_linux_amd64.tar.gz tar -zxvf frp_0.38.0_linux_amd64.tar.gz mv frp_0.38.0_linux_amd64 frp cd frp nano frps.ini然后配置一下frps.ini：[common] bind_port = 7000 #frpc上也要有相同的token值 token = 你的密码 #配置log log_file = /var/logs/frps.log log_level = info log_max_days = 3 #frps统计板 dashboard_port = 7500 dashboard_user = wuhuqifei dashboard_pwd = wuhuqifei kcp_bind_port = 7000解读一下配置选项：bind_port是frp使用的端口；token是密码令牌；log是日志相关；dashboard是统计板…