网络爬虫引发的问题

网络爬虫的分类
小规模爬虫:数据量小爬取速度不敏感,使用 requests 库,针对网页或者一些列网页,90%以上的爬虫
中规模爬虫:数据规模较大,爬取速度敏感,使用 scrapy 库,针对一个网站或者一系列网站
大规模爬虫:搜索引擎,爬取速度关键,需要定制开发,针对全网

1、网络爬虫的“骚扰”
受限于开发人员的水平和目的,网络爬虫将会为web服务器带来巨大的资源开销

2、网络爬虫的法律风险
服务器上的数据有产权归属
网络爬虫获取数据后牟利将带来法律风险

3、网络爬虫泄露隐私
网络爬虫可能具备突破简单访问控制的能力,获得被保护数据从而泄露个人隐私

网络爬虫的限制
来源审查:判断 User-Agent 进行限制
检查来访 HTTP 协议头的 User-Agent 域,只相应浏览器或者友好爬虫的访问

发布公告:Robots 协议
告诉所有爬虫网站的爬取策略,要求爬虫遵守

场景:使用tar命令解压.tar.gz压缩包方式,在CentOS 7.9操作系统安装MySQL 5.7.36数据库。内容包括MySQL的安装、启动、登录以及基础应用。

基础环境:

操作系统:CentOS 7.9

MySQL版本:MySQL 5.7.36

1.MySQL安装说明

基础规划信息。

1.1 MySQL安装包与驱动包

安装包:mysql-5.7.36-linux-glibc2.12-x86_64.tar.gz

JDBC驱动包:mysql-connector-java-5.1.49.jar

1.2 MySQL安装方式

使用tar命令方式安装MySQL。

1.3用户名和用户组规划

用户组:dmysql

用户名:dmysql

1.4目录规划

MySQL安装目录:/home/apps/module/mysql

1.5下载地址

官网:https://www.mysql.com/downloads/

1.6操作说明

本例标明:root用户操作,是系统root用户操作。

本例标明:dmysql用户操作,是dmysql用户操作。

其它没有标明:是dmysql用户操作。

2.用户名和用户组(root用户操作)

2.1查看用户名和用户组

2.1.1查看用户名和用户组

查看指令:cat /etc/group

2.1.2文件group内容格式解析

在group文件内容格式解析:

组名:口令:组标识号:组内用户列表

2.1.3查看组密码

查看组密码指令:cat /etc/passwd

2.1.4搜索指令

搜索指令:cat /etc/group | grep dmysql

2.2创建用户组和用户

2.2.1创建用户组

创建用户组指令:groupadd dmysql

2.2.2创建用户名

创建用户名指令:useradd -g dmysql dmysql -d /home/dmysql

2.2.3修改登录密码

修改密码指令:passwd dmysql 12345678

修改密码格式:passwd 用户名 密码

2.2.4指令执行情况

2023-05-31T13:57:06.png

2.3普通用户赋权

功能:在普通用户使用sudo指令,可以执行root权限执行的指令。

2.3.1查看用户sudoers权限

查看指令:cat /etc/sudoers

2.3.2配置sudoers权限

需改指令:vi /etc/sudoers

修改内容,新增一行:

dmysql ALL=(ALL) ALL

注意:修改sudoers退出时,使用wq!,保存才保存退出生效。

3.卸载自带Mariadb和已安装MySQL(root用户操作)

MariaDB是MySQL源代码的一个分支。MariaDB是一个社区驱动的、采用XtraDb存储引擎的MySQL分支版本,由MySQL创始人Michael Widenius带领开发,遵循GPL v2.0协议开源。

3.1卸载系统自带mariadb

3.1.1查找mariadb

查找指令rpm方式:rpm -qa|grep mariadb

查找指令yum方式:yum list installed | grep mariadb

查出结果:mariadb-libs-5.68-1.el7.x86_64

3.1.2卸载mariadb

卸载指令:rpm -e --nodeps mariadb-libs-5.5.68-1.el7.x86_64

3.1.3删除mariadb的my.cnf配置

删除指令:rm -rf /etc/my.cnf

3.2卸载已经安装的MySQL

3.2.1查找已安装MySQL

查找指令rpm方式:rpm -qa|grep mysql

查找指令yum方式:yum list installed | grep mysql

3.2.2使用find和whereis查找

find查看指令:find / -name mysql

whereis查看指令:whereis mysql

3.2.3删除相关文件

删除指令:rm -rf /etc/selinux/targeted/active/modules/100/mysql

删除指令:rm -rf /usr/lib64/mysql

4.解压安装

4.1上传安装包(root用户操作)

使用Xftp把安装包上传到指定目录。

安装包存放目录:/home/apps/module/

4.2解压安装包(root用户操作)

操作目录:/home/apps/module

解压指令:tar -zxvf mysql-5.7.36-linux-glibc2.12-x86_64.tar.gz

注意:使用.tar.gz包是免安装版本,直接配置即可。

tar -zxvf说明:

-z:调用.gz格式的工具进行处理。

-j:调用.bz2格式的工具进行处理。

-J:调用.xz格式的工具进行处理。

-x:释放归档。

-v:显示指令执行过程。

-f:指定归档文件名称。

4.3重命名目录名(root用户操作)

重命名:mv mysql-5.7.36-linux-glibc2.12-x86_64 mysql

全路径:/home/apps/module/mysql

4.4更改用户组和用户权限(root用户操作)

用户名和用户组:chown -R dmysql:dmysql /home/apps/module/mysql

权限修改:chmod -R 755 /home/apps/module/mysql

说明:chown -R指定目录以及其子目录下的所有文件。

说明:第一位表示文件类型。d是目录文件,l是链接文件,-是普通文件,p是管道。

说明:权限分为三种:读(r=4),写(w=2),执行(x=1)。

第一个数字,表示文件所有者的权限。

第二个数字,表示与文件所有者同属一个用户组的其他用户的权限。

第三个数字,表示其它用户组的权限。

使用dmysql用户操作

4.5修改MySQL配置(dmysql用户操作)

4.5.1配置文件全路径

配置文件全路径:/etc/my.cnf

4.5.2查看配置文件

查看配置:cat /etc/my.cnf

4.5.2修改配置文件

编辑文件:sudo vi /etc/my.cnf

修改内容:

[mysql]
default-character-set=utf8
[mysqld]
port=3306
basedir=/home/apps/module/mysql
datadir=/home/apps/module/mysql/data
max_connections=5000
character-set-server=utf8
default-storage-engine=INNODB
default-time_zone='+8:00'
lower_case_table_names=1

4.6初始化MySQL配置(dmysql用户操作)

4.6.1初始化操作目录

操作目录:cd /home/apps/module/mysql/bin

4.6.2初始化指令

初始化指令:

./mysqld --initialize --user=dmysql --datadir=/home/apps/module/mysql/data --basedir=/home/apps/module/mysql
4.6.3生成初始化密码

初始化密码:bnY!fmwfF8-o

需记录初始化密码,在首次登录是需要使用。

4.6.4初始化执行情况

2023-05-31T13:55:14.png

5启动MySQL

5.1查看MySQL是否启动

服务查询指令:ps -ef| grep mysql

端口查询指令:netstat -na | grep 3306

注意:如果netstat不可用,则先安装net-tools工具。

安装net-tools工具指令:yum -y install net-tools.x86_64

5.2启动MySQL服务

操作目录:cd /home/apps/module/mysql/support-files

5.2.1启动服务

启动指令:./mysql.server start

5.2.2查看端口

查看端口指令:netstat -na | grep 3306

5.2.3查看进程

查看进程指令:ps -ef|grep mysql

5.2.4启动成功

启动成功和端口监听成功。

2023-05-31T13:54:32.png

5.3重启服务

重启指令:./mysql.server restart

5.3停止服务

停止指令:./mysql.server stop

5.4设置便捷启动

每次启动都需进入目录:/home/apps/module/mysql/support-files操作,比较不方便,因此,需设置便捷启动。

操作目录:/home/apps/module/mysql/support-files

5.4.1设置便捷启动(root用户操作)

配置便捷启动在root操作。

5.4.1.1拷贝mysql.server到init.d目录

拷贝mysql.server到init.d目录后,重名为mysqld。

拷贝指令:
cp /home/apps/module/mysql/support-files/mysql.server /etc/rc.d/init.d/mysqld

5.4.1.2赋权mysqld可执行

如果mysqld为不可执行,则执行赋权指令。

赋权指令:chmod +x /etc/rc.d/init.d/mysqld

5.4.2便捷启动指令

在dmysql用户下,任何目录均可执行。

5.4.2.1启动MySQL

启动指令:service mysqld start

5.4.2.2重启MySQL

重启指令:service mysqld restart

5.4.2.3停止MySQL

停止指令:service mysqld stop

5.4.3设置开机自启动(root用户操作)

系统启动,就会启动MySQL

5.4.3.1添加mysqld到服务列表

添加指令:chkconfig --add mysqld

5.4.3.2查看服务列表

查看指令:chkconfig --list mysqld

5.4.3.3查看服务状态

查看指令:systemctl status mysqld

5.4.3.4配置开启开机自启动

配置指令:chkconfig --level 2345 mysqld off

5.4.3.5配置关闭开机自启动

配置指令:chkconfig --level 2345 mysqld on

6登录MySQL

6.1创建MySQL登录指令软链接

6.1.1查看MySQL登录指令软链接

查看指令:ll /usr/bin/ | grep mysql

6.1.2创建MySQL登录指令软链接(root权限)

创建指令:ln -s /home/apps/module/mysql/bin/mysql /usr/bin/mysql

注意:系统默认查看/usr/bin/命令,建立软链接。

6.1.3创建MySQL登录指令软链接原因

不在/usr/bin/创建软连接,那么执行登录需在/home/apps/module/mysql/bin/目录执行,否则报错。

执行指令:mysql -u root -p

报错信息:-bash: mysql: command not found

6.2首次登录

6.2.1首次登录目录

操作目录:/home/apps/module/mysql/bin

当配置软链接后,任意目录可启动。

6.2.2首次登录

登录指令:mysql -u root -p

首次登录密码:bnY!fmwfF8-o

6.3修改密码

登录成功后,立即修改密码。

修改指令:set password for root@localhost = password('12345678');

6.4开放root用户远程连接

6.4.1设置开放远程连接

切换数据库指令:use mysql;

开放远程连接指令:update user set user.Host='%' where user.User='root';

刷新指令:flush privileges;

6.4.2远程连接验证

IP地址:192.168.19.160

端口:3306

用户名/口令:root/12345678

2023-05-31T13:52:01.png

7应用MySQL

7.1创建MySQL数据库和用户

数据库名称:bigdatadb。

数据库用户:bigdata。

7.1.1创建数据库

创建数据库指令:CREATE DATABASE bigdatadb DEFAULT CHARACTER SET utf8;

7.1.2创建用户

创建用户指令:CREATE USER bigdata@localhost IDENTIFIED BY '12345678';

7.2开放普通用户远程连接

切换数据库:use mysql;

开放远程连接指令:update user set user.Host='%' where user.User='bigdata';

刷新权限指令:flush privileges;

7.3授权用户访问指定数据库

7.3.1数据库授权

数据库全量表全部权限,授权给指定用户。

7.3.1.1数据库授权

授权指令:grant all privileges on bigdatadb.* to bigdata@'%' identified by '12345678';

7.3.1.2刷新权限

刷新指令:flush privileges;

7.3.1.3在数据库查看信息

查看指令:select * from mysql.user;

7.3.1.4句法解析

bigdatadb.*,授权数据库bigdatadb的所有表。

bigdata@'%',授权用户bigdata对所有IP开放。

7.3.2数据库表授权

把cdhdb的表sys_user_hz授权给bigdata用户。

7.3.2.1数据库表授权

表授权指令:grant select,insert,update,delete on cdhdb.sys_user_hz TO bigdata@'%';

7.3.2.2刷新权限

刷新指令:flush privileges;

7.3.2.3在数据库查看信息

查看指令:select * from mysql.tables_priv;

7.3.2.4句法解析

说明:cdhdb.sys_user_hz,把数据库cdhdb的表sys_user_hz授权给bigdata用户,只包括select,insert,update,delete权限。

7.3.3数据库字段授权

把cdhdb的表sys_user_bj的指定字段授权给bigdata用户。

7.3.3.1数据库字段授权

字段授权指令:grant select(user_id,username) on cdhdb.sys_user_bj to bigdata@'%';

7.3.3.2刷新权限

刷新指令:flush privileges;

7.3.3.3在数据库查看信息

查看指令:select * from mysql.columns_priv;

7.3.3.4句法解析

说明:select(user_id,username)把cdhdb.sys_user_bj表字段(user_id,username)查询权限授权给bigdata用户。

7.4查看用户和数据库

查看用户指令:select * from mysql.user;

查看数据库:SHOW DATABASES;

7.5修改用户密码

7.5.1修改密码两种方式

本地连接修改指令:set password for bigdata@localhost = password('12345678');

远程连接修改指令:set password for bigdata@'%'= password('12345678');

7.5.2句法解析

bigdata@localhost,用户bigdata对localhost开放。

bigdata@'%',用户bigdata对所有IP开放。

7.5.3使用SQL查看用户开放连接状态

查看指令:select * from mysql.user;

7.6用户、访问主机、数据库、表以及表字段权限关系

7.6.1查看访问主机和用户关系

查看指令:select * from mysql.user;

7.6.2用户和数据库关系

查看指令:select * from mysql.db;

7.6.3用户访问某库指定表权限

查看指令:select * from mysql.tables_priv;

7.7设置密码不过期

7.7.1设置密码不过期

设置指令:update mysql.user set password_expired='N' where password_expired='Y';

7.7.2查看密码不过期

查看指令:select * from mysql.user;

requesets.request(method,url,kwargs) request 方法有三个参数,method url kwargs
method: 请求方式,对应 GET/HEAD/POST/PUT/PATCH/delete/OPTIONS 7种,大小写严格

前六种介绍过了

OPTIONS 是获取服务器与客户端之间通信参数,与获取资源并不直接相关,用的比较少

requesets.request('GET',url,**kwargs)
requesets.request('HEAD',url,**kwargs)
requesets.request('POST',url,**kwargs)
requesets.request('PUT',url,**kwargs)
requesets.request('PATCH',url,**kwargs)
requesets.request('delete',url,**kwargs)
requesets.request('OPTIONS',url,**kwargs)

url: 指获取 url 链接
**kwargs: 控制访问参数,共13 个, 可选项

13个参数分别如下

1、params: 字典或者字节序列,作为参数增加到 url 中,
使访问链接中增加一些参数,服务器根据参数筛选一些资源,
返回来获取指定的内容

kv = {"key1":"value1","key2":"value2"}
r = requests.request("GET","http://python123.ifno/ws",params=kv)
print(r.url) #会打印: http://python123.ifno/ws?key1=value1&key2=value2


2、data: 字典、字节序列或者文件对象,作为 Request 的内容,
把对象放在 url 链接对应的位置作为数据来存储

kv = {"key1":"value1","key2":"value2"}
r = requests.request("POST","http://python123.ifno/ws",data=kv)
body = "主要内容"
r = requests.request("POST","http://python123.ifno/ws",data=body)


3、json: JSON格式的数据,作为 Request 的内容

kv = {"key1":"value1","key2":"value2"}
r = requests.request("POST","http://python123.ifno/ws",json=kv)


4、headers: 字典,HTTP定制头,想服务器发送请求,服务器看到的是 Chrme10
可以模仿Chrome10向服务器发起访问,服务器会认为是Chrome10浏览器

hd = {"user-agent":"Chrome/10"}
r = requests.request("POST","http://python123.ifno/ws",headers=hd)


5、cookes: 字典或者CookieJar,Request 中的cookie,request库的高级功能


6、auth: 元组,支持HTTP认证功能,request库的高级功能


7、files: 字典类型,传输文件,向服务器传输文件

fs = {"file":open("data.xls","rb")}
r = requests.request("POST","http://python123.ifno/ws",files=fs)


8、timeout: 设定超时时间,秒位单位
如果在设定时间内没有返回内容,那么会有一个 timeout异常

r = requests.request("GET","http://python123.ifno/ws",timeout=10)


9、proxies: 字典类型,设定访问代理服务器,可以增加登录认证
有效隐藏用户抓取网页时的ip地址,有效被防止爬虫你追踪

pxs = {"http":"http://user:[email protected]:1234","https":"https://10.10.10.1:4321"}
r = requests.request("GET","http://python123.ifno",proxies=pxs)


10、allow_redirects: True/False,默认为True ,重定向开关,允不允许对url进行重定向


11、stream: True/False ,默认为 True ,获取内容立即下载开关,默认时允许


12、verify: True/False ,默认为 True ,认证SSL证书开关


13、cert: 本地SSL证书路径

==============================================================================
requests.get(url,params=None,keargs) # get 方法有三个参数,url params kwargs
url: 拟获取页面的 url 链接
params: url 中的额外参数,字典或者字节流格式,可选
**kwargs: 12个控制访问的参数,(request 方法控制访问参数中除了 params 以外的12 种参数)

======
requests.head(url,kwargs) # head 方法有两个参数,url kwargs
url: 拟获取页面的 url 链接
**kwargs: 13 个控制访问的参数(与 request 方法的控制访问参数一样)

======
requests.post(url,data=None,json=None,kwargs) # post 方法有四个参数,url data json kwargs
url: 拟更新页面的url 链接
data: 字典、字节序列或文件,Request 的内容(和 request 方法中控制访问参数中的 data 一样)
json: JSON格式的数据,Request的内容(和 request 方法中控制访问参数中的 json 一样)
**kwargs: 11个控制访问的参数(request 方法控制访问参数中除了 data和json 以外的11个参数一样)

======
requests.put(url,data=None,kwargs) # put 方法有三个参数,url data kwargs
url: 拟更新页面的url 链接
data: 字典、字节序列或文件,Request 的内容(和 request 方法中控制访问参数中的 data 一样)
**kwargs: 12个控制访问的参数(request 方法控制访问参数中除了 data 以外的12个参数一样)

======
requests.patch(url,data=None,kwargs) # patch 方法有三个参数,url data kwargs
url: 拟更新页面的url 链接
data: 字典、字节序列或文件,Request 的内容(和 request 方法中控制访问参数中的 data 一样)
**kwargs: 12个控制访问的参数(request 方法控制访问参数中除了 data 以外的12个参数一样)

======
requests.delete(url,kwargs) # delete 方法有两个参数,url kwargs
url: 拟删除页面的url 链接
**kwargs: 13个控制访问的参数(与 request 方法控制访问参数一样)

======
这样设计时因为后六种方法,的一两种控制访问参数比较常用,
所以就放在了函数的默认参数里面,后面的可选参数比较少用

get 方法时所有方法里面最常用的方法,因为向服务器提交信息和传输资源的时候时严格受限的
服务器不会允许无限制的提交信息和传输资源

requests.request() 构造一个请求,支以下各方法的基础方法
requests.get() 获取HTML网页的主要方法,对应于HTTP的GET
requests.head() 获取HTML网页头信息的方法,对应于HTTP的HEAD
requests.post() 向HTML网页提交POST请求的方法,对应于HTTP的POST
requests.put() 向HTML网页提交PUT请求的方法,对应于HTTP的PUT
requests.patch() 向HTML网页提交局部修改请求,对应于HTTP的PATCH
requests.delete() 向HTML页面提交删除请求,对应于HTTP的DELETE

HTTP协议对资源的操作
GET 请求获取URL位置的资源
HEAD 请求获取URL位置资源的响应消息报告,即获得该资源的头部信息
POST 请求向URL位置的资源后附加新的数据
PUT 请求向URL位置存储一个资源,覆盖原URL位置的资源
PATCH 请求局部更新URL位置的资源,即改变该处资源的部分内容
DELETI 请求删除URL位置存储的资源

获取网页头部信息
r = requests.head("http://www.baidu.com") #发送请求,使用很少的流量
r.headers #返回的头部信息
r.text #展示全部内容时,内容时空

用post()方法提交新增数据
payload = {"key1":"value1","key2":"falue2"} #定义一个字典
r = requests.post("http://httpbin.org/post",date = payload) #post一个字典
print(r.text) #打印新增的信息,会被放在 form 的字段下

如果提交的时字符串,会被放在 data字段下

使用 put() 方法与 post() 方法类似,不同的时,put 方法会覆盖原有的数据