爬虫第二天
- 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