反爬与反反爬

news/2024/7/7 20:17:40/文章来源:https://www.cnblogs.com/JJJHaoran/p/18284955

反爬原因

反爬(Anti-Scraping)机制是网站为防止自动化程序(爬虫)过度抓取或恶意访问而采取的保护措施。反爬的主要原因包括:

  1. 保护网站资源:大量的自动化访问会消耗服务器资源,影响正常用户的访问体验。
  2. 保护数据隐私:一些网站的数据具有商业价值,网站希望保护这些数据不被自动化程序大量获取。
  3. 防止恶意行为:防止垃圾邮件、数据盗窃、数据篡改等恶意行为。
  4. 维护用户体验:确保网站的正常运作,防止因爬虫行为导致的页面加载缓慢或崩溃。

什么样的爬虫会被反

以下类型的爬虫容易被反爬机制检测并阻止:

  1. 高频率请求的爬虫:短时间内发送大量请求,会触发网站的频率限制。
  2. 不遵守 robots.txt 文件的爬虫:无视网站的爬取规则和限制。
  3. 没有模拟人类行为的爬虫:请求头中缺少常见的浏览器标识(如 User-Agent),没有模拟鼠标和键盘操作。
  4. 固定 IP 地址的爬虫:长时间使用同一 IP 地址,容易被网站检测并封禁。
  5. 没有处理 JavaScript 的爬虫:很多现代网站依赖 JavaScript 加载内容,无法处理这些内容的爬虫容易被检测。

常见概念与反爬方向

以下是一些常见的反爬概念和技术:

  1. robots.txt 文件:网站通过 robots.txt 文件指定哪些页面允许爬取,哪些页面禁止爬取。
  2. User-Agent:请求头中的 User-Agent 标识可以表明请求来自哪种浏览器或爬虫,很多网站会根据 User-Agent 做出反爬判断。
  3. IP 封禁:网站可以检测到来自同一 IP 地址的大量请求,并采取封禁措施。
  4. 验证码(CAPTCHA):在用户登录、提交表单等关键操作时,通过验证码验证用户是否为机器人。
  5. Cookies 和会话:通过检测请求中的 Cookies 和会话信息来判断请求是否正常。
  6. 频率限制:限制单位时间内来自同一 IP 地址或会话的请求数量。
  7. JavaScript 检测:使用复杂的 JavaScript 加载页面内容,检测用户是否能够执行 JavaScript。
  8. 行为分析:通过分析用户的行为(如鼠标移动、点击、滚动等)来判断请求是否来自人类。

基于身份识别的反爬

这种反爬策略通过识别请求来源的身份特征来检测并阻止爬虫。常见的方法包括检查 IP 地址、User-Agent、Cookies 等。

常见方法

  1. IP 封禁:通过检测同一 IP 地址的高频请求来封禁 IP。
  2. User-Agent 检查:检查请求头中的 User-Agent 字段,识别常见的爬虫标识。
  3. Cookies 和会话:通过设置和检查 Cookies 来追踪用户会话,防止异常请求。

应对策略

  1. IP 轮换

    • 使用代理池定期更换 IP 地址。
    • 使用旋转代理服务,如 ProxyMesh 或 Bright Data。
  2. 伪装 User-Agent

    • 随机选择不同的 User-Agent 模拟不同的浏览器和设备。
    • 使用真实的浏览器指纹。
  3. 处理 Cookies

    • 模拟登录过程获取并使用有效的 Cookies。
    • 定期更新和维护 Cookies。
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options# 使用代理池和随机 User-Agent
proxy = "http://your_proxy_ip:port"
user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"# 配置 ChromeOptions
chrome_options = Options()
chrome_options.add_argument(f'--proxy-server={proxy}')
chrome_options.add_argument(f'user-agent={user_agent}')# 实例化带有配置对象的 ChromeDriver 对象
driver_path = 'path/to/chromedriver'
service = Service(driver_path)
driver = webdriver.Chrome(service=service, options=chrome_options)# 打开一个网站并获取 Cookies
url = 'http://www.example.com'
driver.get(url)
cookies = driver.get_cookies()
print("Cookies:", cookies)# 关闭浏览器
driver.quit()

 

基于爬虫行为的反爬

这种反爬策略通过检测请求行为模式来识别爬虫。常见的方法包括频率限制、行为分析等。

常见方法

  1. 频率限制:限制单位时间内的请求数量。
  2. 行为分析:通过分析用户行为(如鼠标移动、点击、滚动等)来识别异常模式。
  3. JavaScript 检测:使用复杂的 JavaScript 加载内容,检测用户是否能够执行这些脚本。

应对策略

  1. 模拟人类行为

    • 设置合理的请求间隔,避免高频率访问。
    • 使用像 Selenium 这样的工具,模拟鼠标移动、点击、滚动等操作。
  2. 处理 JavaScript

    • 使用无头浏览器(Headless Browser)如 Headless Chrome、PhantomJS。
    • 执行页面上的 JavaScript,确保加载完整内容。
from selenium import webdriver
from selenium.webdriver.common.by import By
import time# 配置 ChromeOptions
chrome_options = Options()
chrome_options.add_argument("--headless")  # 无界面模式
chrome_options.add_argument("--disable-gpu")  # 禁用 GPU 加速# 实例化带有配置对象的 ChromeDriver 对象
driver_path = 'path/to/chromedriver'
service = Service(driver_path)
driver = webdriver.Chrome(service=service, options=chrome_options)# 打开一个网站
url = 'http://www.example.com'
driver.get(url)# 模拟人类行为
time.sleep(2)  # 等待页面加载
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")  # 滚动到底部
time.sleep(2)# 查找元素并点击
element = driver.find_element(By.ID, 'element_id')
element.click()
time.sleep(2)# 关闭浏览器
driver.quit()

 

基于数据加密进行反爬

这种反爬策略通过对网站数据进行加密,使得抓取到的数据无法直接解析和使用。

常见方法

  1. 内容加密:对网页内容进行加密,客户端需要特定的解密方法才能读取。
  2. 参数加密:对请求参数进行加密,防止爬虫直接使用 URL 参数进行请求。
  3. 动态数据加载:通过 Ajax 或其他动态加载方式获取数据,确保数据只在特定操作后才加载。

应对策略

  1. 分析和逆向工程

    • 使用浏览器开发者工具(如 Chrome DevTools)分析请求和响应。
    • 研究解密算法,编写相应的解密代码。
  2. 执行 JavaScript

    • 使用 Selenium 执行页面上的 JavaScript,确保完整加载和解密数据。
    • 模拟所有必要的用户操作。
from selenium import webdriver
from selenium.webdriver.common.by import By
import time# 配置 ChromeOptions
chrome_options = Options()
chrome_options.add_argument("--headless")  # 无界面模式
chrome_options.add_argument("--disable-gpu")  # 禁用 GPU 加速# 实例化带有配置对象的 ChromeDriver 对象
driver_path = 'path/to/chromedriver'
service = Service(driver_path)
driver = webdriver.Chrome(service=service, options=chrome_options)# 打开一个网站
url = 'http://www.example.com'
driver.get(url)# 等待动态数据加载
time.sleep(5)# 获取加密内容并解密
encrypted_element = driver.find_element(By.ID, 'encrypted_element_id')
encrypted_data = encrypted_element.text
# 假设你已经知道解密方法
decrypted_data = decrypt(encrypted_data)  # 使用自定义解密方法
print("Decrypted data:", decrypted_data)# 关闭浏览器
driver.quit()

 

验证码-验证码的知识

验证码(Completely Automated Public Turing test to tell Computers and Humans Apart,CAPTCHA)是一种用于区分用户是计算机还是人类的安全机制,常用于防止恶意自动化操作,如垃圾注册、评论灌水等。常见的验证码类型有:

  1. 文本验证码:用户需要输入图像中的字符。
  2. 图像验证码:用户需要选择特定的图像或解决拼图。
  3. 音频验证码:用户需要听取音频并输入其中的字符。
  4. 行为验证码:用户需要完成拖动滑块、点击特定区域等操作。

验证码的反制措施

反制验证码通常需要通过以下几种方法:

  1. 手动识别:人类用户手动输入验证码,适用于少量验证码。
  2. OCR(光学字符识别):使用OCR技术自动识别文本验证码。
  3. 打码平台:使用第三方打码服务,由人工或自动系统识别验证码。
  4. 图像识别引擎:使用深度学习和计算机视觉技术识别复杂图像验证码。

验证码-图像识别引擎

图像识别引擎利用计算机视觉和深度学习技术自动识别验证码图像。常见的方法包括:

  1. 传统图像处理:使用图像处理技术(如阈值处理、边缘检测、形态学操作等)提取验证码中的字符,然后使用OCR技术识别字符。
  2. 深度学习:使用卷积神经网络(CNN)等深度学习模型训练一个图像识别引擎,能够自动识别复杂的图像验证码。

图像处理和 OCR 识别

import cv2
import pytesseract# 加载图像
image_path = 'captcha_image.png'
image = cv2.imread(image_path)# 转为灰度图像
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 二值化处理
_, binary_image = cv2.threshold(gray, 150, 255, cv2.THRESH_BINARY_INV)# 使用 OCR 识别文本
text = pytesseract.image_to_string(binary_image, config='--psm 7')
print("识别结果:", text)

使用深度学习识别验证码

训练一个卷积神经网络(CNN)模型来识别验证码需要以下步骤:

  1. 数据收集:收集大量验证码图像及其对应的标签。
  2. 数据预处理:对图像进行归一化、分割等预处理操作。
  3. 模型训练:使用深度学习框架(如 TensorFlow、Keras)训练 CNN 模型。
  4. 模型评估和优化:评估模型性能,并进行优化。

以下是一个简化的例子,展示如何使用 Keras 训练一个 CNN 模型来识别验证码:

import numpy as np
import tensorflow as tf
from tensorflow.keras import layers, models
from tensorflow.keras.preprocessing.image import ImageDataGenerator# 加载和预处理数据
# 假设我们有一个函数 load_data() 返回训练和验证数据
(X_train, y_train), (X_val, y_val) = load_data()# 创建数据生成器
datagen = ImageDataGenerator(rescale=1.0/255.0)# 构建 CNN 模型
model = models.Sequential([layers.Conv2D(32, (3, 3), activation='relu', input_shape=(height, width, channels)),layers.MaxPooling2D((2, 2)),layers.Conv2D(64, (3, 3), activation='relu'),layers.MaxPooling2D((2, 2)),layers.Conv2D(64, (3, 3), activation='relu'),layers.Flatten(),layers.Dense(128, activation='relu'),layers.Dense(num_classes, activation='softmax')
])# 编译模型
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])# 训练模型
model.fit(datagen.flow(X_train, y_train, batch_size=32), epochs=10, validation_data=(X_val, y_val))# 评估模型
loss, accuracy = model.evaluate(X_val, y_val)
print("验证集准确率:", accuracy)

 

JavaScript (JS) 是现代网页中广泛使用的脚本语言,用于实现动态交互效果。爬取含有大量 JS 动态内容的网站时,通常需要解析和执行 JS 代码。以下是如何定位 JS 文件、分析 JS 代码,以及使用 js2py 解析和执行 JS 代码的具体方法。

js解析-定位js文件

定位 JS 文件通常可以使用浏览器的开发者工具。以下是具体步骤:

  1. 打开浏览器开发者工具:在 Chrome 中,可以按 F12Ctrl+Shift+I 打开开发者工具。
  2. 查看网络请求:切换到 “Network” 面板,刷新页面,查看所有加载的资源。
  3. 过滤 JS 文件:在过滤栏中输入 *.js 或选择 “JS” 过滤器,查看加载的 JS 文件。
  4. 查看源代码:点击任意 JS 文件,可以查看其源代码。

js解析-js代码分析

分析 JS 代码可以帮助我们了解其功能、变量和函数的使用。常见的方法包括:

  1. 阅读和理解代码:理解代码的逻辑、结构和变量作用范围。
  2. 查找关键函数:查找页面中关键功能(如数据加载、用户交互)的实现函数。
  3. 分析 AJAX 请求:查找和分析页面中所有的 AJAX 请求,了解数据是如何加载和更新的。
  4. 调试和断点:在浏览器开发者工具中设置断点,逐步调试代码,了解其执行过程。

js解析-js2py使用

js2py 是一个 Python 库,用于在 Python 环境中解析和执行 JS 代码。以下是安装和使用 js2py 的具体方法:

安装 js2py

pip install js2py

使用 js2py 解析和执行 JS 代码

以下是一个简单的示例代码,展示如何使用 js2py 解析和执行 JS 代码:

import js2py# 定义 JS 代码
js_code = """
function add(a, b) {return a + b;
}
"""# 解析并执行 JS 代码
context = js2py.EvalJs()
context.execute(js_code)# 调用 JS 函数
result = context.add(3, 4)
print("结果:", result)

解析和执行复杂的 JS 代码

如果需要解析和执行更复杂的 JS 代码,可以使用 js2py.translate_filejs2py.eval_js

import js2py# 从文件中加载 JS 代码
js_file_path = 'path/to/your_js_file.js'
context = js2py.EvalJs()
context.execute(open(js_file_path).read())# 调用文件中定义的 JS 函数
result = context.your_js_function()
print("结果:", result)

处理带有 this 关键字的 JS 代码

js2py 也支持处理带有 this 关键字的 JS 代码:

import js2py# 定义 JS 类
js_code = """
class Calculator {constructor() {this.result = 0;}add(a, b) {this.result = a + b;}getResult() {return this.result;}
}
"""# 解析并执行 JS 代码
context = js2py.EvalJs()
context.execute(js_code)# 创建 JS 类的实例并调用方法
calculator = context.Calculator()
calculator.add(3, 4)
result = calculator.getResult()
print("结果:", result)

示例:解析和执行动态加载数据的 JS 代码

假设我们有一个网页,其中包含通过 JS 动态加载数据的代码,我们可以使用 js2py 解析和执行这些代码,以获取动态数据。以下是一个示例:

import requests
import js2py# 获取网页内容
url = 'http://www.example.com'
response = requests.get(url)
html_content = response.text# 提取并执行 JS 代码
js_code = """
function fetchData() {return "Dynamic data from JS";
}
"""# 解析并执行 JS 代码
context = js2py.EvalJs()
context.execute(js_code)# 调用 JS 函数获取动态数据
dynamic_data = context.fetchData()
print("动态数据:", dynamic_data)

 

hashlib的使用

hashlib 是 Python 标准库中的一个模块,提供了常见的哈希算法,如 MD5、SHA-1、SHA-256 等。它可以用于生成字符串或文件的哈希值,常用于数据完整性校验和密码存储。

常见哈希算法

以下是一些常见的哈希算法及其用途:

  • MD5:生成 128 位哈希值,速度快,但已被证明不安全,适用于校验文件完整性等场景。
  • SHA-1:生成 160 位哈希值,比 MD5 更安全,但也已被证明存在安全漏洞。
  • SHA-256:生成 256 位哈希值,安全性高,适用于密码存储等安全要求高的场景。

示例代码

以下是使用 hashlib 生成字符串和文件哈希值的示例代码:

import hashlib# 生成字符串的 MD5 哈希值
def md5_hash(text):return hashlib.md5(text.encode()).hexdigest()# 生成字符串的 SHA-256 哈希值
def sha256_hash(text):return hashlib.sha256(text.encode()).hexdigest()# 生成文件的 SHA-256 哈希值
def sha256_file_hash(file_path):sha256 = hashlib.sha256()with open(file_path, 'rb') as f:while chunk := f.read(8192):sha256.update(chunk)return sha256.hexdigest()# 示例使用
text = "Hello, World!"
print("MD5 哈希值:", md5_hash(text))
print("SHA-256 哈希值:", sha256_hash(text))file_path = 'path/to/your/file.txt'
print("文件的 SHA-256 哈希值:", sha256_file_hash(file_path))

 

selenium使用代理ip

配置 Chrome 浏览器使用代理 IP

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options# 配置代理 IP
proxy = "http://your_proxy_ip:port"# 配置 ChromeOptions
chrome_options = Options()
chrome_options.add_argument(f'--proxy-server={proxy}')# 实例化带有配置对象的 ChromeDriver 对象
driver_path = 'path/to/chromedriver'
service = Service(driver_path)
driver = webdriver.Chrome(service=service, options=chrome_options)# 打开一个网站
url = 'http://www.example.com'
driver.get(url)# 关闭浏览器
driver.quit()

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/738366.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

全网最适合入门的面向对象编程教程:09 类和对象的Python实现-类之间的关系,你知道多少?

本文主要对类之间的关系进行了基本介绍,包括继承、组合、依赖关系,并辅以现实中的例子加以讲解,同时说明了不同关系的特点和应用场景。全网最适合入门的面向对象编程教程:09 类和对象的 Python 实现-类之间的关系,你知道多少? 摘要: 本文主要对类之间的关系进行了基本介…

[LeetCode] 274. H-Index

意外的简单。 class Solution:def hIndex(self, citations: List[int]) -> int:sorted_list = sorted(citations, reverse=True)ret = 0for i,element in enumerate(sorted_list[:1000]):curr = min(i+1, element)if curr > ret:ret = currreturn ret

数据换机

图1为本系统的方法的流程示意图图2为首次拷贝到X中断需要遍历的文件示意图图3为非首次拷贝找到X中断点需要遍历的文件示意图 实现的功能支持换机对SD卡的数据迁移大文件按阈值切成切片文件小文件和切片文件按阈值分段拷贝切片文件的恢复小文件和切片文件从换机cache下恢复到三…

实战篇——文件上传漏洞upload-labs-master靶场实战一

实战篇——文件上传漏洞upload-labs-master靶场实战(1) 前端验证绕过 (1) 篡改js代码 直接上传一句话木马失败:查看页面源代码:可见前端通过checkFile函数对上传文件的后缀名进行了验证。 使用Tampermonkey自定义js脚本,用于删除form表单的onsubmit属性:启用脚本,刷新页面…

国产数据库人大金仓Kingbase数据迁移工具

转载:国产数据库人大金仓Kingbase数据迁移工具-CSDN博客 注意:Kingbase自带的迁移工具,只能从其它数据库迁移到Kingbase数据库 适配数据库安装的时候建议使用完全安装(数据库可以不启动),后续也可以全部默认(如安装数据库,相关 参数设置可参考人大金仓(Kingbase)部署…

selenium操作

selenium介绍开发使用有头浏览器,部署使用无界面浏览器 selenium工作原理利用浏览器原生的API,封装成一套更加面向对象的Selenium WebDriver API,直接操作浏览器页面里的元素,甚至操作浏览器本身(截屏,窗口大小,启动,关闭,安装插件,配置证书之类的) selenium模块与d…

《Deep Learning》(深度学习)中英文双版PDF免费下载

“深度学习”经典著作《Deep Learning》中文版pdf免费下载。 《Deep Learning》(深度学习)是一本皆在帮助学生和从业人员进入机器学习领域的教科书,以开源的形式免费在网络上提供,这本书是由学界领军人物 Ian Goodfellow、Yoshua Bengio 和 Aaron Courville 合力打造。中文…

微服务异常问题

多服务间,被依赖服务代码更新,依赖服务不生效问题被依赖服务代码更新后,jar包会更新 依赖服务并不是通过http直接调用依赖服务的代码,而是通过依赖jar包的方式,把被依赖服务更新后的jar包更新到依赖服务中即可。 举例: 有A服务,B服务;其中A服务依赖B服务。 当A服务有代…

深度学习--强化学习--基本概念Q V--94

目录1. 强化学习2. 马尔科夫链3. Q值和V值 1. 强化学习 首先我们需要明确,强化学习的任务是什么? 这用大白话说:就是我们希望用强化学习的方式,使智能体获得独立自主地完成某种任务的能力。 智能体学习和工作的地方,我们就称为环境。 注意!所谓独立自主,就是智能体一旦启…

京东毫秒级热key探测框架设计与实践,已实战于618大促

在拥有大量并发用户的系统中,热key一直以来都是一个不可避免的问题。或许是突然某些商品成了爆款,或许是海量用户突然涌入某个店铺,或许是秒杀时瞬间大量开启的爬虫用户, 这些突发的无法预先感知的热key都是系统潜在的巨大风险。 风险是什么呢?主要是数据层,其次是服务层…

刷题Phuck2--data协议差异

刷题Phuck2 使用arjun扫出hl参数,获取到源码 ​​ 源码: <?phpstream_wrapper_unregister(php);if(isset($_GET[hl])) highlight_file(__FILE__);$mkdir = function($dir) {system(mkdir -- .escapeshellarg($dir));};$randFolder = bin2hex(random_bytes(16));$mkdir(us…

常见Linux命令

1、查看目录:ls 常用用法: ls -l :以列表的形式展示;简写ll效果展示:2、终端清屏:clear 常用用法: ctr+L:清空屏幕当前的内容,不会重置终端效果展示: 使用前使用后3、切换目录:cd 常用用法:cd /:切换到根目录cd /xx(目录名) :切换到根目录下的xx目录cd ..:切换…

R语言大学城咖啡店消费问卷调查报告:信度分析、主成分分析可视化

全文链接:https://tecdat.cn/?p=34656 原文出处:拓端数据部落公众号 本次调查旨在了解文汇路咖啡店的市场状况,以便为学校周边咖啡店的经营发展提供积极的引导意义。我们通过问卷调查的方式,收集了大量的数据,通过r软件对数据进行了基本情况分析、信度分析、问卷调查数据…

R语言武汉流动人口趋势预测:灰色模型GM(1,1)、ARIMA时间序列、logistic逻辑回归模型|附代码数据

全文链接:http://tecdat.cn/?p=32496 原文出处:拓端数据部落公众号 人口流动与迁移,作为人类产生以来就存在的一种社会现象,伴随着人类文明的不断进步从未间断。 人力资源是社会文明进步、人民富裕幸福、国家繁荣昌盛的核心推动力量。当前,我国经济正处于从以政府主导的投…

1panel搭建halo+alist+兰空图床

由于服务器更新过后,ssh连接不上,机商vnc延迟卡的很,输个命令都不行,刚好centos断更了,换ubuntu系统了。也顺便从MySQL转到PostgreSQL。这个算是个记录,给有基础的人看的,你连ssh都不会连,那你得自己一步一步慢慢百度来。其实还是比较无脑的,除了1panel的反代,感觉设…

7.4

1005.K次取反后最大化的数组和 题意描述:[!NOTE] 给你一个整数数组 nums 和一个整数 k ,按以下方法修改该数组:选择某个下标 i 并将 nums[i] 替换为 -nums[i] 。重复这个过程恰好 k 次。可以多次选择同一个下标 i 。 以这种方式修改数组后,返回数组 可能的最大和 。 示例 1…

【专题】2024年6月数字化行业报告合集汇总PDF分享(附原数据表)

原文链接:https://tecdat.cn/?p=36658 原文出处:拓端数据部落公众号 随着科技的飞速发展和全球数字化进程的加速推进,我们正处在一个充满变革与机遇的时代。从人工智能的深入应用到工业互联网的蓬勃发展,从智慧医疗的兴起到新能源汽车的普及,每一个领域都在经历着前所未有…

Body SurfaceModel Geometry

Body SurfaceModel Geometry 实体曲面模型几何图形是通过曲面模型表示产品的三维形状。应使用保持该几何表示的IfcShapeResentation的以下属性值:IfcShapeRepresentation.RepresentationIdentifier = Body IfcShapeRepresentation.RepresentationType = SurfaceModel IfcShape…

CSRF攻击与修复

基本原理受害者登录a.com,并保留了登录凭证(Cookie)。 攻击者引诱受害者访问了b.com。 b.com 向 a.com 发送了一个请求:a.com/act=xx。浏览器会默认携带a.com的Cookie。 a.com接收到请求后,对请求进行验证,并确认是受害者的凭证,误以为是受害者自己发送的请求。 a.com以…

同步、异步、阻塞、非阻塞、Linux五种 I/O 模型,一篇文章搞定

●什么是同步、什么是异步?什么是阻塞、什么非阻塞?我自己的理解,大白话啊,同步和异步指的是函数调用完成任务的程度。一个任务的完成,包括发起、执行和结果返回三个阶段。   同步(synchronize)调用涵盖了这三个阶段。调用结束之后,任务肯定是有结果的,无论成败。  …