Python爬虫基础教程(5)Python网络爬虫技术核心之身份识别:神秘身份大揭秘:Python爬虫的“伪装术”与反爬虫的攻防大战!

一、开篇:爬虫界的“身份证”危机

朋友,你是否曾兴冲冲写了个爬虫,结果下一秒就被网站封IP?抓到的不是数据,而是冷冰冰的“403 Forbidden”?别慌!这八成是你的爬虫“身份证”暴露了——身份识别,正是爬虫与反爬虫大战的核心密码!

举个栗子🌰:
你用Python的requests库直接访问豆瓣电影:

import requests
response = requests.get("https://movie.douban.com/")
print(response.status_code)  # 输出418:“我是茶壶,不想泡咖啡”

(注:418是彩蛋状态码,实际可能遇到403或封IP)

为什么?因为网站服务器一看你的请求头——
User-Agent: python-requests/2.28.1
明晃晃写着:“我是爬虫,快来封我!”
这就好比戴着“我是小偷”的帽子进金库,不抓你抓谁?


二、身份识别的三大战场:请求头、IP和行为模式

1. User-Agent:爬虫的“工作服”

每个浏览器访问网站时,都会在请求头里带上User-Agent,比如Chrome的:
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36
这串“神秘代码”告诉服务器:“我是正经浏览器!”

实战技巧

  • 伪造User-Agent池,每次随机选择:
from fake_useragent import UserAgent
import requests

ua = UserAgent()
headers = {
    'User-Agent': ua.random,
    'Accept-Language': 'zh-CN,zh;q=0.9',
    'Referer': 'https://www.douban.com/'
}
response = requests.get("https://movie.douban.com/", headers=headers)

(注:安装fake_useragent库:pip install fake-useragent

2. IP地址:爬虫的“家庭住址”

单个IP高频请求?秒变“重点监控对象”!解决方案:

  • 代理IP池:让请求从不同IP发出,深藏功与名
  • 延迟策略:请求间随机休眠,模仿人类手速
import time
import random
from itertools import cycle

# 简易代理IP池示例(需替换为有效IP)
proxies_list = [
    {'http': 'http://123.456.789.1:8080'},
    {'http': 'http://123.456.789.2:8080'},
]
proxy_pool = cycle(proxies_list)

for page in range(5):
    proxy = next(proxy_pool)
    try:
        response = requests.get(url, proxies=proxy, timeout=5)
        print(f"第{page+1}页抓取成功!")
    except:
        print("代理失效,换下一个!")
    time.sleep(random.uniform(1, 3))  # 随机休眠1-3秒
3. 行为指纹:爬虫的“走路姿势”

即使伪装了身份,你的“机器人步态”也可能出卖你:

  • 鼠标轨迹太规律?
  • 点击速度反人类?
  • 总在深夜精准操作?

应对方案:

# 模拟人类随机滚动页面
from selenium import webdriver
import random

driver = webdriver.Chrome()
driver.get("https://movie.douban.com/")

# 随机滚动页面模仿人类浏览
for _ in range(5):
    height = random.randint(200, 800)
    driver.execute_script(f"window.scrollBy(0, {height});")
    time.sleep(random.uniform(0.5, 2))

三、完整实战:爬取豆瓣电影TOP250(附详细注释)

目标:在不触发反爬的情况下,获取电影名称、评分、经典台词

import requests
from bs4 import BeautifulSoup
import time
import random
from fake_useragent import UserAgent

def get_douban_movies():
    ua = UserAgent()
    base_url = "https://movie.douban.com/top250"
    movies_data = []
    
    for start in range(0, 250, 25):  # 共10页,每页25条
        # 动态构造请求头
        headers = {
            'User-Agent': ua.random,
            'Referer': 'https://movie.douban.com/chart',
            'Cookie': '你的登录Cookie(如需)'  # 重要!登录后更安全
        }
        
        params = {'start': start}
        
        try:
            # 添加随机延迟,降低请求频率
            time.sleep(random.uniform(1, 3))
            
            response = requests.get(
                base_url, 
                headers=headers, 
                params=params, 
                timeout=10
            )
            
            if response.status_code == 200:
                soup = BeautifulSoup(response.text, 'html.parser')
                items = soup.find_all('div', class_='item')
                
                for item in items:
                    # 解析电影信息
                    title = item.find('span', class_='title').text
                    rating = item.find('span', class_='rating_num').text
                    quote_elem = item.find('span', class_='inq')
                    quote = quote_elem.text if quote_elem else "暂无引用"
                    
                    movies_data.append({
                        'title': title,
                        'rating': rating,
                        'quote': quote
                    })
                    
                print(f"已爬取 {len(movies_data)} 部电影信息...")
            else:
                print(f"请求异常,状态码:{response.status_code}")
                
        except Exception as e:
            print(f"第{start//25+1}页爬取失败:{str(e)}")
            continue
    
    return movies_data

if __name__ == "__main__":
    movies = get_douban_movies()
    print("\n=== 爬取结果示例 ===")
    for i, movie in enumerate(movies[:3]):  # 展示前3条
        print(f"{i+1}. 《{movie['title']}》 评分:{movie['rating']} 经典台词:{movie['quote']}")

技术要点解析

  1. 随机User-Agent:每次请求更换浏览器身份
  2. Referer伪装:告诉服务器“我从正经页面跳转来的”
  3. 速率控制:随机休眠避免请求风暴
  4. 异常处理:单个页面失败不影响整体任务
  5. 超时设置:避免长时间等待卡死

四、高级伪装:当普通爬虫穿上“隐形斗篷”

1. 会话保持技术
session = requests.Session()
session.headers.update({'User-Agent': ua.random})

# 首次访问获取cookies
session.get("https://douban.com")
# 后续请求自动携带cookies,更像真实用户
2. 浏览器自动化伪装

使用Selenium + Chrome Driver:

options = webdriver.ChromeOptions()
options.add_argument('--headless')  # 无界面模式
options.add_argument(f'user-agent={ua.random}')
options.add_experimental_option('excludeSwitches', ['enable-automation'])

driver = webdriver.Chrome(options=options)
driver.get("https://movie.douban.com/")
3. 应对高级反爬:JavaScript渲染与验证码
  • 对于动态加载内容:使用Selenium或Playwright
  • 遇到验证码:接入打码平台或机器学习识别(成本较高)

五、伦理提醒:做个有“武德”的爬虫侠

  1. 遵守robots.txt:访问网站/robots.txt查看爬虫协议
  2. 控制访问频率:别把人家网站爬崩了
  3. 尊重版权隐私:敏感数据不乱用
  4. 商业用途需授权:赚钱的事得按规矩来

记住:技术是把双刃剑,你的爬虫可以是大数据研究的得力助手,也可能变成网络空间的“拆迁队”——分寸感是关键


六、结语:从“脚本小子”到“爬虫艺术家”

身份识别就像爬虫界的“化妆术”——

  • 初级:裸奔请求,秒被封
  • 中级:简单伪装,偶尔成功
  • 高级:多重身份,浑然天成

掌握本文技巧后,你的爬虫将完成从“铁憨憨”到“变形金刚”的进化!不过切记:能力越大,责任越大。Happy Crawling!🚀

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

值引力

持续创作,多谢支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值