day25-day26-动态内容和异步编程
复习
编写爬虫程序的步骤:
抓取页面 —> requests / aiohttp / httpx
异步编程 —> 异步I/O(AIO) —> 协作式并发 —> 提高了CPU利用率 —> (微线程、纤程)
解析页面
正则表达式 —> re
- compile —> Pattern
- match() / search() —> Match —> group()
- findall() / finditer()
CSS选择器 —> beautifulsoup4 / pyquery
pip install beautifulsoup4 —> import bs4
BeautifulSoup(pace_code, ‘html.parser’)
—> select —> ResultSet
—> select_one —> Tag —> text / attrs[]
XPath / XQuery —> 从XML文件中获取元素的查询语法
pip install lxml —> from lxml import etree
etree.HTML(page_code) —> _Element
—> xpath(’…’)
webdriver.Chrome() —>
- get(url)
- find_element_by_css
- find_element_by_xpath
保存数据(持久化)
csv —> reader / writer(file) —> writerow([…])
Excel —>
pip install xlwt openpyxl
Workbook(工作簿)
—> add_sheet(’…’) —> Worksheet(工作表) —> write(row, col, data)
—> create_sheet(’…’) —> Worksheet —> cell(row, col , data)
—> save(’…’)
数据库(Database)
- 关系型数据库(SQL)
- 非关系型数据区(NoSQL —> NewSQL)
摘要和压缩(签名/数字指纹)
- hashlib —> MD5 / SHA1 / SHA256 —> 判断唯一性
- zlib —> compress / decompress
并发爬取
多线程 —> threading —> Thread(target, args) —> start()
ThreadPoolExecutor(max_workers) —> submit()
多个线程之间要通信比较简单,因为线程可以共享进程的内存
多进程 —> multiprocessing —> Process(target, args) —> start()
- 进程之间的内存因为是相互隔离的,所以进程间通信比较麻烦,需要使用下面的方式:
管道(操作系统预留的IO通道)
套接字(网络编程的接口)
异步编程 —> 异步I/O —> 协作式并发 —> 协程
- 同步 —> 排队 —> 有顺序 —> 阻塞和等待
- 异步 —> 不排队 —> 没有顺序 —> 不阻塞和不等待
迭代器 —> iterator —> 实现了迭代器协议的对象
__iter__
__next__
动态内容的获取
JavaScript逆向 —> 找到真正提供数据的API接口 —> Response —> json()
- 浏览器开发者工具 —> Network —> XHR(JavaScript获得数据的异步请求)
- 专业抓包工具 —> Fiddler / Charles / Wireshark
直接操控浏览器 —> selenium —> WebDriver
pip install selenium —> from selenium import webdriver
把下载好的chromedriver放到虚拟环境下的Scripts(bin)目录下 —> PATH
browser = webdriver.Chrome()
—> get(url)
—> page_source —> XPath / CSS Selector
—> implicitly_wait(timeout) —> 隐式等待
—> 显示等待 —> WebDriverWait(browser, timeout) —> until
—> expected_condition —> presence_of_element_located(By.ID, ‘…’)
—> TimeouwException
—> find_element_by_xpath / find_element_by_css_selector —> WebElement
—> send_keys()
—> click()
—> find_elements_by_xpath / find_elements_by_css_selector —> list
—> close()
—> add_cookies({…}) / delete_all_cookies() / get_cookies()
—> switch_to.window(browser.window_handles[x])
—> set_window-size( ) / get_screenshot_as_file(…)
无头浏览器模式
—> ChromeOptions() —> add_argument(’–headless’)
—> webdriver.Chrome(options)
破解selenium反爬
navigator.webdriver —> undefined
option = webdriver.ChromeOptions() option.add_experimental_option('excludeSwitches', ['enable-automation']) option.add_experimental_option('useAutomationExtension', False) browser = webdriver.Chrome(options=option) # CDP - Chrome Developer Protocol - 谷歌开发者协议 browser.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument', {"source": """Object.defineProperty(navigator, 'webdriver', {get: () => undefined})""" })
异步编程
异步编程(异步I/O) - 实现了协作式并发,大幅度的提升了CPU利用率
被async修饰的函数异步函数,调用异步函数不是直接得到返回值,而是创建一个协程对象(可以跟其他子程序相互协作的子程序)
async def display(num):print(num)await asyncio.sleep(1)# 调用异步函数得到的是一个协程对象
cos_list = [display(n) for n in range(1, 11)]
# 启动一个事件循环,将协程对象注册到事件循环上(注册之后才能协作)
loop = asyncio.get_event_loop()
# 将列表中的协程对象处理成一个Task对象然后挂到事件循环上
# 相当于将10个协程对象都注册到事件循环上
loop.run_until_complete(asyncio.wait(cos_list))
loop.close()
通过异步编程获取图片,并对文件进行异步编程操作
import asyncioimport aiofile
import aiohttp
import requestsasync def download_picture(url):async with aiohttp.ClientSession() as session:async with session.get(url, ssl=False) as resp:data = await resp.read()filename = url[url.rfind('/') + 1:]async with aiofile.async_open(f'image1/{filename}', 'wb') as file:await file.write(data)def main():loop = asyncio.get_event_loop()for num in range(1, 6):resp = requests.get(f'https://image.so.com/zjl?ch=beauty&sn={num * 30}')data_dict = resp.json()cos_list = []for beauty_dict in data_dict['list']:picture_url = beauty_dict['qhimg_url']cos_list.append(download_picture(picture_url))loop.run_until_complete(asyncio.wait(cos_list))# loop.close()if __name__ == '__main__':main()
day25-day26-动态内容和异步编程相关推荐
- 笑了,面试官问我知不知道异步编程的Future。
点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 荒腔走板 老规矩,先来一个简短的荒腔走板,给冰冷的技术文注 ...
- 写给初学者的JavaScript异步编程和背后思想
导读: 对于接触JavaScript这门编程语言没有多久的本菜鸡而言,在相当长的一段时间内,我都完全无法理解这门语言中的异步编程,不明白什么叫异步编程以及为什么需要异步编程.为什么顺序执行程序就不行了 ...
- 从根本上了解异步编程体系
作者:ronaldoliu,腾讯 IEG 后台开发工程师 或许你也听说了,摩尔定律失效了.技术的发展不会永远是指数上升,当芯片的集成度越来越高,高到 1 平方毫米能集成几亿个晶体管时,也就是人们常说的 ...
- UE4异步编程专题 - TFunction
0. 关于这个专题 游戏要给用户良好的体验,都会尽可能的保证60帧或者更高的fps.一帧留给引擎的时间也不过16ms的时长,再除去渲染时间,留给引擎时间连10ms都不到,能做的事情是极其有限的.同步模 ...
- 【转】1.5异步编程:.NET4.X 数据并行
任务并行库 (TPL) 是 .NET Framework 4的 System.Threading 和 System.Threading.Tasks 命名空间中的一组公共类型和 API.TPL的目的在于 ...
- 【转】1.4异步编程:轻量级线程同步基元对象
开始<异步编程:同步基元对象(下)> 示例:异步编程:轻量级线程同步基元对象.rar 在<异步编程:线程同步基元对象>中我介绍了.NET4.0之前为我们提供的各种同步基元(包括 ...
- [进阶] --- Python3 异步编程详解(史上最全篇)
[进阶] - Python3 异步编程详解:https://blog.csdn.net/lu8000/article/details/45025987 参考:http://aosabook.org/e ...
- 网页javascript加载不出_写给初学者的JavaScript异步编程和背后思想
导读:对于接触JavaScript这门编程语言没有多久的本菜鸡而言,在相当长的一段时间内,我都完全无法理解这门语言中的异步编程,不明白什么叫异步编程以及为什么需要异步编程.为什么顺序执行程序就不行了呢 ...
- [转][进阶]-Python3 异步编程详解
目录 1 什么是异步编程 1.1 阻塞 1.2 非阻塞 1.3 同步 1.4 异步 1.5 并发 1.6 并行 1.7 概念总结 1.8 异步编程 1.9 异步之难(nán) 2 苦心异步为哪般 2. ...
最新文章
- 【springboot】配置
- scrum敏捷开发工具实践分享
- Auty 2017——WebMonitor接口本地检测平台
- jsp获取java后台数据_springMVC笔记:jsp页面获取后台数据记录列表
- [置顶] hdu 1890 伸展树区间翻转
- 线性规划与网络流24题 负载平衡问题
- C语言之struct A *b和struct A c区别
- jquery-只对新用户弹一次窗
- 最短路 HDU - 2544
- IOS Window窗口使用
- ajax验证本服务器,jquery – 使用Ajax调用的http基本身份验证
- jsp实现简易计算器
- 硬盘整数分区计算方法一般算法
- 绘制风向、风速玫瑰图
- 2020年携程校招开发方向第二题
- python-opencv 读取摄像头并保存为.mp4视频 及 VideoCapture()的使用
- 微信公众号怎么推送消息_微信公众号发送消息
- AUTOCAD——快速选择
- 推荐给中学生的数学课外书:《写给全人类的数学魔法书》
- 学会向上管理,4个提问技巧,让你事半功倍
热门文章
- HDFS的文件压缩格式
- cccccccccccccccccccc
- 十余年软件开发经历,经验总结和程序一览(涉及Socket、WPF、vc++、CAD、图像、GIS)
- 高通Android系列随身WIFI强行开启adb,关闭商家远程控制
- 如何为iOS应用训练核心ML模型
- 习题 9.5 建立一个对象数组,内放5个学生的数据(学号、成绩),设立一个函数max,用指向对象的指针作函数参数,在max函数中找出5个学生中成绩最高者,并输出其学号。
- 元旦的庆贺,是每家每户的快乐
- 【Edraw Max教程】如何有趣的创建梦幻般的思维导图
- 3D模型欣赏:原始部落女神 自带仙气 让人眼前一亮
- 诸神之眼 Nmap入门