- 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