网络爬虫
    1 通用网络爬虫:需要有一个初始URL,在抓取过程中,不断获取新的URL以进行数据抓取
    先将初始URL对应的网页抓取下来,然后解析网页中的URL,将新URL加入到抓取队列当中,再进行下一轮的抓取。
    2 聚焦网络爬虫:聚焦于特定的主题进行数据抓取
    它需要在通用网络爬虫的基础上进行主题的定义和抓取过程中的主题筛选,以保证抓取的是特定主题的内容。
    3 在通用网络爬虫和聚焦网络爬虫之外,还有增量式网络爬虫和深层网络爬虫。
    爬虫的核心原理
    1 为什么爬虫可以抓取到数据?
    使用浏览器打开网页与爬虫的数据抓取过程非常相似。之所以能看到网页的内容,是因为浏览器将网页抓取到本地,
    然后对网页中的HTML,JS等进行解析,再对网页的文本数据进行样式渲染。
    浏览器通过http协议与网页所在的服务器进行交互,服务器根据浏览器的http请求,将请求的网页再返回给浏览器。爬虫的数据抓取,
    也是一样的原理,通过http协议与http服务器进行交互。对http服务器来说,不论浏览器还是爬虫,都是http客户端。
    2 爬虫抓取到的是什么格式的数据?
    爬虫向网页所在的服务器发起请求以后,服务器响应的通常是HTML格式的文本数据。
    http服务器响应的不一定是HTML。在一些场景中,会返回json格式的数据。我们在编写爬虫程序时,需具体问题具体分析。
    Beautifule Soup是Python社区中的一款功能强大的解析库,利用Beautifule Soup可以轻松地解析出HTML中的数据。
    将数据解析出来以后,还需要对数据进行存储,预处理,特征提取,数据挖掘,可视化等操作。
    HTTP请求库
    1 主要讲解的是常用的urllib以及requests库,这两个库用来发起同步的HTTP请求。
    urllib的四大组件
    1 urllib是Python中的一个内置package,使用urllib中的某一个模块,直接在脚本中导入即可,例如导入urllib.request
    2 模块名 描述
    urllib.request 打开和读取url
    urllib.parse 解析url
    urllib.robotparser 解析robots.txt文件
    urllib.error 包含urllib.request模块抛出的异常
    requests库(使用最多的)
    1 requests是一个高效的第三方HTTP请求库,可以在命令行通过pip进行安装:pip install requests
    HTTP协议调试工具
    1 最快捷方便的调试工具是浏览器,以谷歌浏览器为例
    2 常用的HTTP抓包工具:fiddler
    chrome浏览器的调试面板
    1 打开chrome浏览器,按下键盘的F12键,即可进入浏览器的调试模式。
    2 点击调试面板中的Network菜单,可以对浏览器发出的网络请求进行分析和调试。
    3 点击Network面板中的All菜单,可以显示所有的HTTP请求。
    4 点击XHR可以筛选出所有XHR请求,XHR是XMLHttpRequest的简写,
    浏览器发起该请求时不需要重新加载页面,即可获取到数据
    5 点击JS则可以山选出所有的jS脚本。
    6 Doc菜单用来显示从服务端同步获取HTML文档的HTTP请求。
    XHR:XMLHttpReguest,筛选异步请求
    Preserve log:保存页面跳转之前的请求
    OCR:第三方库,图片识别。用于登录或注册时,自动识别填写验证码
    抓包工具:fiddler
    1 Fiddler是一个http协议调试代理工具,用来记录并检查本地与HTTP服务器之间的通信过程。
    2 在Fiddler中设置断点,可以查看与HTTP服务器交互的数据。
    3 fiddler的官方下载地址:https://www.telerik.com/download/fiddler-everywhere
    4 安装成功并启动fiddler以后,fiddler会自动设置浏览器的正向代理为fiddler。
    打开浏览器,即可在fiddler面板中看到所有被截获的HTTP请求。
    Fiddler接口测试
    1 在Composer面板中可以对接口进行单独测试,Headers用来指定请求头,Params用来传递请求参数。
    Fiddler配置手机端抓包
    1 Fiddler是以代理服务器的形式工作的,代理地址为127.0.0.1,监听端口可查看软件的配置信息。
    2 配置手机端抓包,需保证手机和电脑在同一局域网,然后将手机的代理服务器配置为Fiddler即可。
    3 以华为手机为例,设置—>WLAN—>找到已连接的WiFi—>修改网络—>勾选显示高级选项—>代理—>选择手动
    —>输入FIddler所在主机IP及端口—>确定。其它类型手机,也是类似的配置过程。
    4 如需抓取手机端的https包,需要安装Fiddler证书。
    爬取Ajax数据
    1 Ajax全称为Asynchronous JavaScript and XML, 即异步的Javascript和XML。
    2 Ajax技术用来异步获取服务端接口的数据,而无需刷新整个页面。
    3 其底层实现逻辑:构造了一个XMLHttpRequest对象或ActiveXObject对象(Windows),当服务器返回响应时,
    会自动触发一个回调函数的调用,在回调函数中可以获得服务端的响应数据。
    4 在获取到服务端响应的数据以后,再利用javascript进行网页结构和内容的动态渲染
    5 在chrome浏览器的调试面板中,点击Network下的xhr即可筛选出所有Ajax请求。
    6 在筛选出页面中的xhr请求以后,再分析接口的请求参数及响应数据,
    然后通过Python中的HTTP请求库来构造请求进行数据的抓取。
    接口参数的加密分析
    1 站点在反爬策略中会对接口的请求参数进行加密,我们在编写爬虫程序时应当熟悉
    前端使用的常用加密算法,以破解接口的加密参数。
    2 前端常用的加密方式:Base64, MD5, AES, RSA。
    Base64加密
    1 Base64是一种数据编码格式,Base64中的64是指在这种编码规范中包含64个字符,
    Base64编码是指按照Base64中的编码规则将字节序列转换为字符集中的字符。
    2 使用Base64编码的作用在于减弱数据的可读性,增加破解难度。
    3 加密原理:3个字节为一组,一个24位再分为4组,每组6位,高位补两个0,组成8位(一个字节),
    MD5加密
    1 MD5是一种不可逆的散列生成算法,不论输入的长度为多少,输出的都为一个128位(16字节)的散列值。
    2 相同的输入得到的是相同的MD5值,不同的输入得到的结果一定不同。
    3 利用MD5的这些特性,可检测数据在传输过程中是否被篡改。
    4 Python中可直接使用内置模块hashlib中的md5方法来生成散列。
    AES加密
    1 AES是一种对称加密算法,加密和解密共用同一个密钥。
    2 AES常用的加密模式有ECB和CBC。密钥长度必须为16字节,24字节,或者32字节,且加密的数据长度必须是16的倍数。
    3 在Python中使用AES加密需安装pycryptodome模块。
    RSA加密
    1 RSA是一种非对称加密算法,在非对称加密算法中,有一个公钥和私钥的概念。公钥即公开的密钥,私钥即非公开的密钥。
    2 数据通过私钥加密,只能用公钥解密。反之亦然,数据用公钥加密,那么只能通过私钥解密。
    3 在Python中进行RSA加密需安装rsa模块:pip install rsa
    爬虫进阶之js逆向解密
    1 逆向解密是指对加密的方式和请求过程进行破解、还原。
    2 加密无非是采用以上课件所介绍的算法,难点在于js加密代码的定位,
    找出加密密钥(js代码中的密钥,或通过服务端接口、cookie返回的密钥)。
    3 对于请求过程,需保持较大的耐心,对请求链,请求参数进行梳理和分析,分析每一步的代码逻辑,
    然后用Python进行模拟,在Python中模拟js代码的执行,可以使用第三方的模块,例如PyV8。
    模拟浏览器
    1 在实际开发中,加密参数过多导致难以破解。在项目允许的情况下,可通过模拟浏览器的方式来抓取页面数据。
    2 模拟浏览器的优势在于无需分析请求接口,不足在于抓取不稳定,速度较慢。
    3 使用Selenium来模拟浏览器,Selenium是一个自动化测试工具,通过selenium可以驱动浏览器执行点击,下拉等操作,
    同时还可以获取当前页面中的源代码。在使用selenium前需要安装浏览器驱动,以及对应的浏览器。
    4 驱动程序的网盘下载链接:https://pan.baidu.com/s/1wdPEZ3Qzz_GUBPwD-DrlQw 提取码:chip
    5 浏览器驱动ChromeDriver—>chrome浏览器,浏览器驱动geckodriver—>火狐浏览器。
    6 在Python中使用selenium需要安装selenium:pip install selenium
    Selenium的基础方法
    构造浏览器对象
    1 使用selenium中的webdriver来构造浏览器对象:
    from selenium import webdriver
    2 构造谷歌浏览器对象:
    browser = webdriver.Chrome()
    3 构造火狐浏览器对象:
    browser = webdriver.Firefox()
    访问页面
    1 使用浏览器对象的get方法来发起请求,请求成功以后再通过浏览器对象的pagesource属性来获取网页源码:
    from selenium import webdriver
    browser = webdriver.Chrome()浏览器对象
    browser.get(‘https://www.baidu.com')get方法来发起请求
    print(browser.page_source)page_source属性来获取网页源码
    查找节点
    1 查找特定的HTML节点用来模拟输入表单,模拟点击等操作。
    2 常用的操作方法有find_element_by_name, find_element_by_id。
    前者根据标签的name来进行定位,后者根据标签的id来进行定位:
    from selenium import webdriver
    browser = webdriver.Chrome()浏览器对象
    browser.get(‘https://www.baidu.com')get方法来发起请求
    input = browser.find_element_by_id(‘kw’)通过id来定位节点
    模拟用户行为
    1 获取到html标签对象以后,再通过标签对象的send_keys方法来模拟输入, 通过click方法来模拟点击:
    from selenium import webdriver
    browser = webdriver.Chrome()浏览器对象
    browser.get(‘https://www.baidu.com')get方法来发起请求
    input = browser.find_element_by_id(‘kw’)通过id来定位节点
    input.send_keys(‘python’)模拟输入
    button = browser.find_element_by_id(‘su’)通过id来定位节点
    button.click()模拟点击
    解析爬取到的网页
    1 常用的网页解析框架Beautiful Soup:直接通过pip来进行安装:pip install beautifulsoup4
    BeautifulSoup对象的构造
    1 BeautifulSoup的构造函数,需重点掌握markup参数以及features参数。
    markup参数用来指定标记语言文本,例如xml,html。features参数用来指定具体的网页解析器。
    2 BeautifulSoup常用的网页解析器有
    html.parser—>构造方法:BeautifulSoup(markup,features=”html.parser”)
    lxml—>构造方法:BeautifulSoup(markup,features=”lxml”)
    lxml-xml—>构造方法:BeautifulSoup(markup,features=”xml”)
    html5lib—>构造方法:BeautifulSoup(markup,features=”html5lib”)
    3 在这些解析器中,html.parser是Python自带的解析器,无需额外安装,lxml与html5lib都需要额外安装。
    标签对象的常用属性
    1 构造完毕BeautifulSoup对象以后,可以直接以对象属性访问的方式来访问文档中的标签。
    例如构造后的对象为bs,那么访问文档中的title标签,写法为:bs.title
    2 BeautifulSoup对象中的属性为标签对象,标签对象的常用属性如下所示:
    属性名name:表示标签的名称,例如p标签的标签名为p
    属性名string:表示标签的文本,例如

    爬虫

    中的文本为爬虫
    属性名parent:表示该标签的父标签对象
    访问标签中的属性
    1 对于标签中的属性,可以通过字典的方式来进行访问:
    html=’薯条编程官网
    bs = BeautifulSoup(html,features=”html.parser”)print(bs.a[“href”])
    BeautifulSoup的常用方法
    1 方法find(name=None, attrs={}, recursive=True, text=None, **kwargs),
    (1) 参数name表示查找的标签名
    (2) 参数attrs表示标签中的属性值对
    (3) 参数recursive表示是否进行递归搜索
    (4) 参数text表示标签的文本
    (5) kwargs表示可变参数,例如可以通过关键字id和class
    来查找指定id,class的标签
    2 方法find_all(name=None, attrs={}, recursive=True, text=None, limit=None, kwargs),
    参数同find方法,limit参数表示限定获取的标签数。
    3 方法select(selector, namespaces=None, limit=None,
    kwargs),
    (1) 参数selector表示CSS选择器
    (2) 参数namespaces用来传递一个字典类型的命名空间对象,通常使用其默认值即可。
    (3) 参数limit表示限定获取的标签数
    (4) kwargs表示可变参数,具体的关键字参数可查阅官方文档

    Nginx
    1 Nginx是一款轻量,高性能的HTTP服务器,常用于反向代理,负载均衡。
    2 架构:主进程、里面有多个子进程
    Nginx常用命令
    1 nginx -h:查看命令的帮助信息
    nginx -t:检查配置文件是否有误
    nginx -c file_path:指定nginx启动的配置文件,file_path表示配置文件的路径
    nginx -s reload:重新加载配置文件
    nginx -s stop:强制停止nginx服务器
    nginx -s quit:优雅停止nginx服务器
    Nginx常用配置
    1 worker_processes 1;
    worker_processes用来配置子进程数目。
    2 #error_log logs/error.log;
    #用来注释文件内容。
    3 #error_log logs/error.log notice;
    error_log用来配置nginx的错误日志。
    4 #error_log logs/error.log info;
    error_log用来配置nginx的错误日志。
    5 #pid logs/nginx.pid;
    pid用来配置程序的pid文件。
    6 events {
    worker_connections 1024;
    }
    events模块用来对服务器的事件处理进行配置。events中的worker_connections用来配置工作进程的最大连接数。
    7 http { http模块用来定义与服务器相关的配置。
    default_type application/octet-stream; default_type用来配置默认的mime类型。
    keepalive_timeout 65; keepalive_timeout配置连接保活的超时时间。
    server { server是http的子模块,用来配置虚拟服务器。可以同时配置多个虚拟服务器。
    listen 80; listen配置服务器的监听的ip和端口。
    server_name localhost; server_name配置虚拟服务器的主机名。
    location / { location模块用来配置请求的路由。
    root html; root表示主机目录的相对路径,index用来设置默认主页。
    index index.html index.htm;
    } } }
    Location中的路径匹配规则
    1 在路径匹配的过程中,首先进行精确匹配,如果匹配失败,再进行正则匹配,否则使用通用匹配 。
    2 匹配规则 描述
    = 表示精确匹配,例如location = /
    ^~ 表示url必须以某个字符串开头,例如 location ^~/static/
    ~ 表示区分大小写的正则匹配,例如:location ~ .(gif|jpg|png)$
    ~ 表示不区分大小写的正则匹配,在规则前面加一个!表示非操作
    / 通用匹配,任何请求都会匹配到,例如 location /
    Nginx反向代理
    1 所谓反向代理,是指代为源服务器处理客户端的请求。
    2 反向代理服务器通常用于Web加速,降低服务器的负载,提高访问效率。
    Nginx反向代理配置
    1 Nginx使用proxy_pass指令来配置转发的服务器,使用proxy_set_header指令来配置发送到源服务器的请求头。
    2 proxy_set_header常用选项
    选项 描述
    Host 常用的导出变量有$http_host, $host, $proxy_host。
    X-Real-IP 获取用户真实IP,常用的导出变量有$remote_addr
    X-Forwarded-For 该请求头表示客户端,常用的导出变量有$proxy_add_x_forwarded_for。
    其包含客户端请求头中的”X-Forwarded-For”,与$remote_addr用逗号分开,
    如果没有”X-Forwarded-For” 请求头,则$proxy_add_x_forwarded_for等同于$remote_addr。
    Nginx负载均衡
    1 四层负载均衡
    这里的”四层”对应的是网络协议栈中的传输层。所谓的四层负载均衡,即通过虚拟IP+端口接收客户端请求,
    然后转发到真实服务器。四层负载均衡通常采用DR模式(例如LVS),客户端与真实服务器建立实际的连接。
    LVS软件:
    DR:
    nat:网络地址转换
    2 七层负载均衡
    “七层”对应的是网络协议栈中的应用层,在七层负载均衡模式中,通过应用层协议中的请求数据来实现负载均衡。
    例如在http协议中,通过请求的资源类型,Host,Url等来实现负载均衡。
    在七层负载均衡模式中,需要根据应用层的请求数据来做负载均衡,客户端与代理服务器需要建立实际的连接。
    arp:
    nginx即可做四层负载均衡,也能做七层负载均衡。
    Nginx四层负载均衡
    1 Nginx1.9之后,才支持四层负载均衡,需要在编译nginx时指定—with-stream参数。
    stream { stream模块与配置文件的http模块同级。
    upstream chips{ upstream指令用来配置上游的服务器集群。
    server 192.168.25.1:8080; server指令后面还可以添加max_fails, fail_timeout等选项。
    }
    server { server模块配置代理服务器监听的地址和端口。
    listen 80;
    proxy_connect_timeout 3s; proxy_conenct_timeout配置连接的超时时间。
    proxy_pass chips; }
    }
    Nginx七层负载均衡
    1 upstream tornado-server{ 在Nginx中配置七层负载均衡与配置四层负载均衡是类似的。
    server 192.168.2.2:8080;
    }
    upstream django-server{
    server 192.168.2.1:8090;
    }
    location / {
    if ($request_uri ~
    .html$){ 可以通过if以及nginx中的导出变量来实现智能的转发。
    proxy_pass http://django-server;
    } }
    例如导出变量$request_uri表示请求的路径,配置文件中的代码表示根据请求的url来实现转发。
    健康检查
    1 除了使用nginx自带模块的max_fails,fail_timeout等来实现健康检查,也可以使用第三方模块,
    比如nginx_upstream_check_module,来进行更细粒度的健康检查。需要在编译nginx时添加该模块。
    2 选项 描述
    interval 用来定义心跳检查的间隔,单位为秒,e.g.: check interval=5,表示每5秒检查一次服务器是否存活
    rise 如果连续探测的成功次数达到阈值,服务器就被认为是存活。e.g.:check interval=5 rise=3
    fall 如果连续探测的失败次数达到阈值,服务器就被认为是宕机。e.g.:check interval=5 rise=3 fall=3
    timeout 表示每次探测的超时时间,单位为秒,e.g.:check interval=5 timeout=30
    type 用来指定健康检查包的类型,主要支持tcp,http等类型。e.g.:check interval=5 rise=3 fall=3 timeout=60 type=tcp
    负载均衡调度算法
    1 nginx默认采用轮询的方式,将客户端请求转发给后端服务器。nginx支持的调度算法如下所示
    调度算法 描述
    round robin 按请求的先后顺序,将请求逐一分配到列表中的后端服务器。在server中加上一个weight的选项,
    用来配置服务器的权重,权重越高,被选中的概率越大。(轮询转发)
    ip_hash 根据客户端IP地址的hash值来分配,这样同一个IP会固定分配至同一台服务器
    hash 根据特定变量的hash值来分配,例如hash $request_uri。在nginx中通过set变量,可以设置变量。
    静态哈希:因其有缺点,就出现了动态哈希,也叫一致性哈希。
    least_conn 最少连接数,哪台服务器连接数少就发分发至哪台服务器
    Nginx其它配置
    1 除了反向代理和负载均衡,在Nginx中还可以配置https, 伪静态,防盗链,数据缓存等