selenium和scrapy基础
1 多任务异步协程基础
-
编码流程
- 创建协程对象
- 创建任务对象
- 创建事件循环对象
- 将任务注册到事件循环对象中
-
特殊的函数:使用async修饰函数,则该函数就是一个特殊的函数,
-
async def get_request(url): print('正在请求:',url) sleep(1) print('请求结束:',url)
-
-
协程对象:特殊函数被调用后函数内部的实现语句不会被立即执行,该函数调用后会返回一个协程对象
-
c = get_request('www.1.com')
-
-
任务对象:任务对象就是对协程对象的进一步的封装
-
任务对象 == 高级的协程对象 == 特殊的函数调用
-
创建任务对象
-
task = asyncio.ensure_future('协程对象')
-
-
绑定回调
-
任务对象结束之后执行回调函数
-
#绑定回调 task.add_done_callback(parse) def parse(task): # tesk参数能获取特殊函数的返回值 print('i am task callback()!!!=----',task.result()) # task。result()就是特殊函数的返回值
-
-
-
事件循环对象
-
#创建一个事件循环对象 loop = asyncio.get_event_loop()
-
作用:将注册在事件循环对象的任务对象进行异步执行
-
#将任务对象注册到事件循环对象中并且开启事件循环 loop.run_until_complete(task),# 不修饰task会报错 loop.run_until_complete(asyncio.wait(tasks))
-
-
注意事项:在特殊函数内部的实现语句中不可以出现不支持异步的模块对应的代码,否则就是终止多任务异步协程的异步效果,例如time模块,requests模块
-
# 替代time模块 await asyncio.sleep(3) # 必须加await让程序等待阻塞完成
-
aihttp模块
-
编码流程
-
基本架构
-
with aiohttp.ClientSession() as s: with await s.get(url) as response: page_text = response.text() return page_text
-
-
补充细节
-
添加async关键字
- 每一个with前加async
-
添加await关键字
- 加在每一步的阻塞操作前加await
- 请求
- 获取响应数据(规定)
- 加在每一步的阻塞操作前加await
-
async with aiohttp.ClientSession() as s: #get/post:proxy = 'http://ip:port' 不一样,不是字典了 #url,headers,data/prames跟requests一样 async with await s.get(url) as response: page_text = await response.text()#text()字符串形式的响应数据。read()二进制的响应数据 return page_text
-
-
-
支持异步的网络请求模块替代requests模块发起网络请求,请求完毕要close,使用with自动化关闭
-
async def get_request(url): async with aiohttp.ClientSession() as s: #get/post:proxy = 'http://ip:port' 不一样,不是字典了 #url,headers,data/prames跟requests一样 async with await s.get(url) as response: page_text = await response.text()#text()字符串形式的响应数据。read()二进制的响应数据 return page_text
-
-
2 . selenium
-
概念: 基于浏览器自动化的一个模块,
-
Appnium是基于手机的自动化模块
-
作用
- 便捷的爬取到动态加载的数据,可见即可得
- 便捷的实现模拟登陆,
-
基本使用
- 环境安装
- pip install selenium
- 环境安装
-
下载浏览器的驱动程序
- http://chromedriver.storage.googleapis.com/index.html
-
浏览器版本和驱动程序的映射关系
-
https://blog.csdn.net/huilan_same/article/details/51896672
-
动作链
-
from selenium.webdriver import ActionChains #动作连的类
-
#基于动作连实现滑动操作 action = ActionChains(bro) #点击且长按 action.click_and_hold(div_tag) for i in range(5): #perform()表示让动作连立即执行 action.move_by_offset(20,20).perform() sleep(0.5)
-
在使用find系列的函数进行标签定位的时候如果出现了NoSuchElementException如何处理?
- 如果定位的标签是存在于iframe标签之下的,则在进行指定标签定位的时候
必须使用switch_to.frame()的操作才可。- ``` bro.switch_to.frame('iframeResult') #frame的参数为iframe标签的id属性值 ```
-
-
无头浏览器
-
from selenium.webdriver.chrome.options import Options # 创建一个参数对象,用来控制chrome以无界面模式打开 chrome_options = Options
-