zoukankan      html  css  js  c++  java
  • 爬虫第二天

    - 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
  • 相关阅读:
    hibernate4.3.5,Final hibernate.cfg.xml的配置
    mysql 入门 jdbc
    设计模式之责任链
    淘宝技术这十年
    java代码---------计算器实现
    java代码---------打印正三角形
    java代码=====实现修改while()
    java------------break;
    java代码-----循环变量的
    java代码----------实现写出循环
  • 原文地址:https://www.cnblogs.com/lilyxiaoyy/p/11768402.html
Copyright © 2011-2022 走看看