爬虫第二天

- requests模块的高级操作
    - 代理
        - 概念:代理服务器
        - 作用:请求和响应的转发
        - 免费的代理
            - www.goubanjia.com
            - 快代理
            - 西祠代理
            - 代理精灵(推荐)http://www.zhiliandaili.cn
        - 匿名度
            - 透明:对方服务器知道你使用了代理,也知道你的真实的IP
            - 匿名:知道使用了代理,不知道你的真实IP
            - 高匿:不知道使用了代理,也不知道真实的IP
        - 类型:
            - http
            - https
        - 付费的代理:
            - 代理池:列表中存储了多个字典,每个字典{'http':'ip:port'}
        - 使用:get/post(proxies = {'http': 'ip:port'})
        
    - cookie
        - 存储在客户端的键值对,可以让服务器端记录客户端的相关状态。
        - 如何处理cookie?
            - 手动处理:将抓包工具中的请求头信息中的cookie键值拷贝到headers中
            - 自动处理:session对象
                - session对象:该对象和requests有类似的功能,该对象也可以像requests一样调用get/post进行请求发送。
                如果使用session进行请求发送的过程中产生了cookie,则cookie会被自动存储到session对象中。
        
    

- 提高爬虫爬取数据的效率
    - 线程池
    - 单线程+多任务异步协程
        - 特殊的函数
            - 如果async修饰了一个函数的定义,则该函数就变成了一个特殊的函数,特殊之处在于:
                - 特殊函数被调用后,函数内部的实现语句不会被立即执行。
            - 该特殊函数调用后会给我们返回一个协程对象
        - 协程对象: 特殊函数调用后可以返回一个协程对象
            - 协程 == 特殊函数
        - 任务对象:就是对协程对象的进一步封装。就是一个高级的协程对象。
            - 任务对象 == 协程对象 == 特殊的函数
            - 绑定回调
                - task.add_done_callback(parse) # parse就是函数
                - parse的定义中
                    - parse必须有一个参数,该参数表示的就是回调函数对应的任务对象
                    - task.result():就是特殊函数的返回值
        - 事件循环对象
            - 该对象内部必须注册的是任务对象,当事件循环开启后,其内部注册的任务对象就可以基于异步被执行。
        - [注意]:在特殊函数内部不可以出现不支持异步模块对应的代码!!!
        
        - aiohttp:基于异步的网络请求模块
            - pip install aiohttp
            - 编码
                - 基本架构
                    ```python
                        with aiohttp.ClientSession() as s:  # s就是一个请求对象
                            with s.get(url) as response:  # get/post(url, data/params, headers, proxy='http://ip:port')
                                page_text = response.text()  # read() ==> content
                                return page_text
                    ```
                    
                - 补充细节
                    - 在每一个with前加上async
                    - 在每一个阻塞操作前加await
                    ```python
                        async with aiohttp.ClientSession() as s:  # s就是一个请求对象
                            async with await s.get(url) as response:  # get/post(url, data/params, headers, proxy='http://ip:port')
                                page_text = await response.text()  # read() ==> content
                                return page_text
                    
                    ```
            

- selenuim在爬虫中的应用chromedriver.exe
    - 概念:是一个基于浏览器自动化的一个模块。
    - selenium爬虫之间的关联是什么?
        - 便捷的获取动态加载的数据(可见即可得)
        - 实现模拟登陆
    - selenium的缺点
        - 效率低
    - 基本使用
        - pip install selenium
        - 获取浏览器的驱动程序 http://chromedriver.storage.googleapis.com/index.html
        
    - 动作链
        - 概念:一组连续的行为动作
    - 无头浏览器
        - PhantomJs
        - 谷歌
    - selenium的规避检查
        - Js注入 window.navigator.webdriver
            - 默认使用浏览器访问值为undefined
            - 使用selenium值为true
        
- 验证码的识别
    - 超级鹰 http://www.chaojiying.com/about.html
    - 云打码 http://www.yundama.com/about.html
    - 超级鹰的使用流程
        - 注册
        - 登录:用户中心的身份进行登录
            - 充值
            - 创建一个软件:软件ID->生成一个软件ID
            - 下载示例代码:开发文档-Python
            
            
- 气象数据爬取分析 https://www.aqistudy.cn/html/city_detail.html
    - 1.数据都是动态加载出来的
    - 2.当点击不通的选项卡的时候并没有捕获到数据包,意味着所有的数据都是在一开始的时候就被加载出来了。
    - 3.当切换不通的查询条件后,点击搜索按钮,抓包工具就可以捕获到气象数据对应的数据包。
        - url:https://www.aqistudy.cn/apinew/aqistudyapi.php <post>==>data:d
        - ajax请求
        - 请求参数d,加密后的密文数据
    - 通过火狐浏览器可以找到搜索按钮对应的监听的事件,该事件触发后执行的是getData函数
    - 分析getData函数的实现
        - type == 'HOUR'
        - 发现了getAQIData() 和getWeatherData()的调用
    - 分析 getAQIData() 和getWeatherData()
        - 实现代码几乎一致,只有method的赋值不一样(GETDETAIL/GETCITYWEATHER)
        - getServerData(method, param, )函数的调用
            - param是一个字典,四组键值对(city, type,startTime, endTime)(查询条件)
    - 分析getServerData的定义
        - 抓包工具中进行getServerData的全局搜索,定位到该函数的实现
        - 该函数的实现对应的代码进行了JS混淆
        - JS混淆:对原生的JS代码进行加密
        - 解决JS混淆的操作是JS反混淆
            - 基于该网站进行反混淆:http://www.bm8.com.cn/jsConfusion/
        - 终于找到了ajax请求对应的代码:
            - 动态变化且加密的请求参数可以由getParam(method,type)
            - decodeData(data);是将加密的响应结果进行解密
    - PyExecJS介绍:PyExecJS是一个可以使用Python来模拟运行Javascript的库。
        我们需要pip install PyExecJS对其进行环境安装。
        - 必须事先安装好nodejs环境
        
        
- 反爬机制:
    - robots
    - UA
    - 图片懒加载
    - 动态加载的数据
    - 代理
    - cookie
    - 验证码
    - js混淆
    - js加密
    - selenium的规避检测


- scrapy框架
    - Windows:
        - a. pip3 install wheel
        - b. 下载twisted http://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted
        - c. 进入下载目录,执行 pip3 install Twisted‑17.1.0‑cp35‑cp35m‑win_amd64.whl
        - d. pip3 install pywin32
        - e. pip3 install scrapy
原文地址:https://www.cnblogs.com/lilyxiaoyy/p/11768402.html