复习

编写爬虫程序的步骤:

  1. 抓取页面 —> requests / aiohttp / httpx

    异步编程 —> 异步I/O(AIO) —> 协作式并发 —> 提高了CPU利用率 —> (微线程、纤程)

  2. 解析页面

    • 正则表达式 —> 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
  3. 保存数据(持久化)

    • 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)
  4. 摘要和压缩(签名/数字指纹)

    • hashlib —> MD5 / SHA1 / SHA256 —> 判断唯一性
    • zlib —> compress / decompress
  5. 并发爬取

    • 多线程 —> threading —> Thread(target, args) —> start()

      ​ ThreadPoolExecutor(max_workers) —> submit()

      ​ 多个线程之间要通信比较简单,因为线程可以共享进程的内存

    • 多进程 —> multiprocessing —> Process(target, args) —> start()

      • 进程之间的内存因为是相互隔离的,所以进程间通信比较麻烦,需要使用下面的方式:
    • 管道(操作系统预留的IO通道)

    • 套接字(网络编程的接口)

    • 异步编程 —> 异步I/O —> 协作式并发 —> 协程

      • 同步 —> 排队 —> 有顺序 —> 阻塞和等待
      • 异步 —> 不排队 —> 没有顺序 —> 不阻塞和不等待
      1. 迭代器 —> iterator —> 实现了迭代器协议的对象

        __iter__

        __next__

动态内容的获取

  1. JavaScript逆向 —> 找到真正提供数据的API接口 —> Response —> json()

    1. 浏览器开发者工具 —> Network —> XHR(JavaScript获得数据的异步请求)
    2. 专业抓包工具 —> Fiddler / Charles / Wireshark
  2. 直接操控浏览器 —> selenium —> WebDriver

    1. pip install selenium —> from selenium import webdriver

    2. 把下载好的chromedriver放到虚拟环境下的Scripts(bin)目录下 —> PATH

    3. 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-动态内容和异步编程相关推荐

  1. 笑了,面试官问我知不知道异步编程的Future。

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 荒腔走板 老规矩,先来一个简短的荒腔走板,给冰冷的技术文注 ...

  2. 写给初学者的JavaScript异步编程和背后思想

    导读: 对于接触JavaScript这门编程语言没有多久的本菜鸡而言,在相当长的一段时间内,我都完全无法理解这门语言中的异步编程,不明白什么叫异步编程以及为什么需要异步编程.为什么顺序执行程序就不行了 ...

  3. 从根本上了解异步编程体系

    作者:ronaldoliu,腾讯 IEG 后台开发工程师 或许你也听说了,摩尔定律失效了.技术的发展不会永远是指数上升,当芯片的集成度越来越高,高到 1 平方毫米能集成几亿个晶体管时,也就是人们常说的 ...

  4. UE4异步编程专题 - TFunction

    0. 关于这个专题 游戏要给用户良好的体验,都会尽可能的保证60帧或者更高的fps.一帧留给引擎的时间也不过16ms的时长,再除去渲染时间,留给引擎时间连10ms都不到,能做的事情是极其有限的.同步模 ...

  5. 【转】1.5异步编程:.NET4.X 数据并行

    任务并行库 (TPL) 是 .NET Framework 4的 System.Threading 和 System.Threading.Tasks 命名空间中的一组公共类型和 API.TPL的目的在于 ...

  6. 【转】1.4异步编程:轻量级线程同步基元对象

    开始<异步编程:同步基元对象(下)> 示例:异步编程:轻量级线程同步基元对象.rar 在<异步编程:线程同步基元对象>中我介绍了.NET4.0之前为我们提供的各种同步基元(包括 ...

  7. [进阶] --- Python3 异步编程详解(史上最全篇)

    [进阶] - Python3 异步编程详解:https://blog.csdn.net/lu8000/article/details/45025987 参考:http://aosabook.org/e ...

  8. 网页javascript加载不出_写给初学者的JavaScript异步编程和背后思想

    导读:对于接触JavaScript这门编程语言没有多久的本菜鸡而言,在相当长的一段时间内,我都完全无法理解这门语言中的异步编程,不明白什么叫异步编程以及为什么需要异步编程.为什么顺序执行程序就不行了呢 ...

  9. [转][进阶]-Python3 异步编程详解

    目录 1 什么是异步编程 1.1 阻塞 1.2 非阻塞 1.3 同步 1.4 异步 1.5 并发 1.6 并行 1.7 概念总结 1.8 异步编程 1.9 异步之难(nán) 2 苦心异步为哪般 2. ...

最新文章

  1. 【springboot】配置
  2. scrum敏捷开发工具实践分享
  3. Auty 2017——WebMonitor接口本地检测平台
  4. jsp获取java后台数据_springMVC笔记:jsp页面获取后台数据记录列表
  5. [置顶] hdu 1890 伸展树区间翻转
  6. 线性规划与网络流24题 负载平衡问题
  7. C语言之struct A *b和struct A c区别
  8. jquery-只对新用户弹一次窗
  9. 最短路 HDU - 2544
  10. IOS Window窗口使用
  11. ajax验证本服务器,jquery – 使用Ajax调用的http基本身份验证
  12. jsp实现简易计算器
  13. 硬盘整数分区计算方法一般算法
  14. 绘制风向、风速玫瑰图
  15. 2020年携程校招开发方向第二题
  16. python-opencv 读取摄像头并保存为.mp4视频 及 VideoCapture()的使用
  17. 微信公众号怎么推送消息_微信公众号发送消息
  18. AUTOCAD——快速选择
  19. 推荐给中学生的数学课外书:《写给全人类的数学魔法书》
  20. 学会向上管理,4个提问技巧,让你事半功倍

热门文章

  1. HDFS的文件压缩格式
  2. cccccccccccccccccccc
  3. 十余年软件开发经历,经验总结和程序一览(涉及Socket、WPF、vc++、CAD、图像、GIS)
  4. 高通Android系列随身WIFI强行开启adb,关闭商家远程控制
  5. 如何为iOS应用训练核心ML模型
  6. 习题 9.5 建立一个对象数组,内放5个学生的数据(学号、成绩),设立一个函数max,用指向对象的指针作函数参数,在max函数中找出5个学生中成绩最高者,并输出其学号。
  7. 元旦的庆贺,是每家每户的快乐
  8. 【Edraw Max教程】如何有趣的创建梦幻般的思维导图
  9. 3D模型欣赏:原始部落女神 自带仙气 让人眼前一亮
  10. 诸神之眼 Nmap入门