当前位置: 首页 > news >正文

Python 爬虫突破反爬虫机制实战

做开发的朋友大概都知道,爬取网页数据时,经常会碰到网站的反爬虫机制,我最近在做一个电商数据爬取项目时,就被这 “拦路虎” 折腾得够呛。下面跟大伙唠唠我是怎么攻克它的。​

我这次的任务是爬取某电商平台商品的详细信息,一开始,我用 Python 写了个简单的爬虫脚本,主要用requests库发送请求获取网页内容,用BeautifulSoup库解析数据。代码如下:​

import requests
from bs4 import BeautifulSoup

url = 'https://www.example.com/products'
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')

products = soup.find_all('div', class_='product-item')
for product in products:
    name = product.find('a', class_='product-name').text
    price = product.find('span', class_='product-price').text
    print(f'商品名称: {name}, 价格: {price}')

满心欢喜运行代码,结果只返回了一个验证码页面,根本获取不到商品信息。很明显,网站检测到这是爬虫请求,启动了反爬虫机制。​

我首先想到的是伪装请求头,模拟浏览器行为。给requests.get()方法添加请求头参数:​

 

headers = {
    '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'
}
response = requests.get(url, headers=headers)

本以为这下万事大吉,可运行后还是被拦截了。看来网站的反爬虫机制比我想象的更复杂。​

一番研究后,我发现网站还会检测请求频率。于是,我在代码里添加time.sleep()方法,控制请求间隔:​

import time

for i in range(10):
    response = requests.get(url, headers=headers)
    # 处理响应数据
    time.sleep(3)

虽说能获取部分数据了,但爬取速度太慢,效率低得可怜。​

后来我发现网站使用了 JavaScript 动态加载数据,requests库无法执行 JavaScript 代码,导致获取的页面内容不完整。我引入Selenium库,借助浏览器驱动来执行 JavaScript。安装selenium和 ChromeDriver 后,代码改成这样:​

from selenium import webdriver
from bs4 import BeautifulSoup

driver = webdriver.Chrome()
driver.get(url)
html = driver.page_source
soup = BeautifulSoup(html, 'html.parser')

products = soup.find_all('div', class_='product-item')
for product in products:
    name = product.find('a', class_='product-name').text
    price = product.find('span', class_='product-price').text
    print(f'商品名称: {name}, 价格: {price}')
driver.quit()

这下,成功突破了反爬虫机制,顺利获取到商品数据。​

这次经历让我深刻认识到,反爬虫与爬虫之间就像一场没有硝烟的 “战争”。遇到问题别慌,多查阅资料,不断尝试新方法,总能找到解决办法。

相关文章:

  • 文献分享: DESSERT基于LSH的多向量检索(Part1——原理与实现)
  • C++中std::priority_queue的使用说明
  • #MySQL 语句大全(完整实用教程)
  • 生成对抗网络(GAN)详解
  • Java代理(四)动态代理之CGLIB
  • 单网卡上绑定多个虚拟IP(AI回答)
  • linux部署成功,但外网无法访问
  • 数据结构与算法:子数组最大累加和问题及扩展
  • 百度查询的ip与命令行输入 ipconfig 显示的IP地址有以下主要区别:
  • 管家婆财贸ERP BB102.采购销售订金管理
  • 快速生成mysql测试数据10w条
  • CSP/信奥赛C++中格式化输入输出scanf和printf的使用详解
  • 快速上手示例(以BEVFormer为例)
  • 【蓝桥杯】考前冲刺!
  • Unity中的静态合批使用整理
  • Oracle 数据库中,并行 DML
  • XSLFO XSLT:深入解析两种强大的XML转换技术
  • leetcode0069. x 的平方根-easy
  • 从零构建大语言模型全栈开发指南:第五部分:行业应用与前沿探索-5.1.2行业落地挑战:算力成本与数据隐私解决方案
  • 操作系统(二):实时系统介绍与实例分析