
在进行网页数据抓取时,requests库是python中最常用且高效的工具之一。它能够发送http请求并接收响应,适用于抓取静态html内容。然而,当目标网站部署了高级反爬机制(如cloudflare、akamai等)或页面内容需要javascript动态渲染时,requests库往往会遭遇瓶颈,导致无法成功获取预期数据。
考虑以下使用requests库尝试抓取网页的示例代码:
import requests
url = "https://cafe.bithumb.com/view/boards/43?keyword=¬iceCategory=9"
headers = {
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36',
    "Referer": "https://cafe.bithumb.com/",
}
try:
    response = requests.get(url, headers=headers, timeout=10)
    response.raise_for_status() # 检查HTTP状态码,如果不是200则抛出异常
    print(response.text)
except requests.exceptions.RequestException as err:
    print(f"请求发生错误: {err}")尽管代码中设置了User-Agent和Referer等HTTP头信息,尝试模拟浏览器访问,但如果网站使用了Cloudflare等安全服务进行流量过滤,或者页面内容在客户端通过JavaScript动态加载,requests库将无法执行这些JavaScript代码,从而获取到的可能是一个空白页面、一个验证码页面,或者直接被拒绝访问。此时,即使在浏览器中可以正常访问,requests也可能失败。
为了应对上述挑战,我们需要一个能够模拟真实浏览器行为的工具,即能够执行JavaScript、处理Cookie、渲染页面并与页面元素进行交互。Selenium正是这样一款强大的浏览器自动化测试框架,它可以通过驱动真实的浏览器(如Chrome、Firefox)来访问网页。
Selenium通过WebDriver协议与浏览器进行通信。当你使用Selenium时,它会启动一个真实的浏览器实例(可以是无头模式),然后像用户一样操作这个浏览器:输入URL、点击按钮、填写表单,并等待页面加载和JavaScript执行完毕。这意味着Selenium可以有效绕过那些依赖JavaScript验证或动态渲染的反爬机制。
立即学习“Python免费学习笔记(深入)”;
在开始使用Selenium之前,需要安装selenium库并下载对应浏览器的WebDriver。
pip install selenium
以下是使用Selenium(Chrome浏览器)抓取之前无法访问的网站的示例代码:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By # 导入By模块用于元素定位
from selenium.webdriver.support.ui import WebDriverWait # 导入WebDriverWait用于等待元素
from selenium.webdriver.support import expected_conditions as EC # 导入expected_conditions用于设置等待条件
url = "https://cafe.bithumb.com/view/boards/43?keyword=¬iceCategory=9"
# 配置Chrome浏览器选项
chrome_options = Options()
# 设置User-Agent,进一步模拟真实浏览器
chrome_options.add_argument('user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36')
# 启用无头模式,即不显示浏览器界面,在服务器环境或后台运行时非常有用
chrome_options.add_argument('--headless')
# 其他常用选项,可根据需要添加
chrome_options.add_argument('--disable-gpu') # 禁用GPU加速,在无头模式下可能有用
chrome_options.add_argument('--no-sandbox') # 禁用沙箱模式,在某些Linux环境下可能需要
chrome_options.add_argument('--disable-dev-shm-usage') # 解决/dev/shm分区太小的问题
# 初始化WebDriver,启动Chrome浏览器
# 如果chromedriver不在系统PATH中,需要指定executable_path
# driver = webdriver.Chrome(executable_path='/path/to/chromedriver', options=chrome_options)
driver = webdriver.Chrome(options=chrome_options)
try:
    print(f"正在访问URL: {url}")
    driver.get(url) # 访问目标URL
    # 可以添加等待机制,确保页面完全加载和JavaScript执行完毕
    # 例如,等待某个特定元素出现,表示页面内容已加载
    # WebDriverWait(driver, 10).until(
    #     EC.presence_of_element_located((By.CSS_SELECTOR, 'div.some-content-class'))
    # )
    # 获取当前页面的完整HTML源代码
    page_source = driver.page_source
    print("成功获取页面内容,前500字符:")
    print(page_source[:500]) # 打印部分内容以验证
except Exception as e:
    print(f"访问或获取页面内容时发生错误: {e}")
finally:
    # 无论是否发生错误,都确保关闭浏览器实例,释放资源
    print("关闭浏览器实例。")
    driver.quit()当传统的requests库无法满足爬取需求时,Selenium提供了一个强大的替代方案,尤其适用于以下场景:
然而,Selenium并非没有缺点:
因此,在实际开发中,应根据具体需求选择合适的工具:
通过灵活运用requests和Selenium,开发者可以构建出更加健壮和高效的Python爬虫系统,应对各种复杂的网页抓取挑战。
以上就是Python爬虫应对反爬机制:从requests到Selenium的进阶策略的详细内容,更多请关注php中文网其它相关文章!
 
                        
                        每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
 
                Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号