Python爬虫基础教程(113)在爬虫中使用Cookies之使用浏览器获取数据:偷渡Cookie的奇幻漂流:原来爬虫还能这么玩!

爬虫中使用Cookie的技巧

喂,各位正在数据海洋里挣扎的爬虫爱好者们!是不是经常遇到这种情况——你兴冲冲写好了爬虫代码,结果网站反手就给你甩了个“请登录后再访问”?别慌,今天咱们要聊的这个神器,能让你像拥有了网站VIP通行证一样,它就是Cookie

为什么你的爬虫总被当成“陌生人”?

想象一下这个场景:你第一次去家门口的水果店,老板对你爱答不理。但如果你天天去,每次去都买点东西,老板很快就会记住你,甚至给你留最新鲜的水果。Cookie就是爬虫世界的“熟客证明”。

每次你在网站登录,服务器都会在你的浏览器里塞个小纸条(Cookie),上面写着:“此人是VIP,可以放行”。而你的爬虫如果空着手去,服务器一看:“哪来的生面孔?滚粗!”

手把手教你“偷渡”Cookie

第一招:手动复制大法(新手必看)

这个方法简单到令人发指,适合刚入门的小白。

步骤1:登录网站
用你的Chrome、Firefox或者Edge,正常登录目标网站。比如咱们以豆瓣为例,先手动输入账号密码登录。

步骤2:打开开发者工具
按F12,找到Network(网络)标签。这时候刷新下页面,你会看到一堆请求。

步骤3:找到Cookie
点击任意一个请求,在Headers(请求头)里找到Cookie:那一长串看起来像乱码的东西。全选,复制!

步骤4:塞给爬虫
在你的Python代码里这样用:

import requests

# 把你复制的Cookie贴在这里
cookies = {
    'dbcl2': '"你的cookie值"',
    'bid': '你的bid值',
}

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
}

# 现在你可以畅通无阻地访问了!
response = requests.get('https://www.douban.com/people/你的ID/', 
                       cookies=cookies, 
                       headers=headers)

print(response.text[:500])  # 打印前500字符看看效果

适用场景:偶尔抓一两个页面,不想折腾的时候。

缺点:Cookie会过期,过期了就得重新复制,麻烦!

第二招:自动登录流(进阶必备)

老是手动复制太low了,咱们来点高级的——让爬虫自己学会登录。

import requests
from bs4 import BeautifulSoup

# 创建一个会话,会自动管理Cookies
session = requests.Session()

# 先访问登录页面获取必要参数
login_url = 'https://accounts.douban.com/j/mobile/login/basic'
headers = {
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36',
    'Origin': 'https://accounts.douban.com',
    'Referer': 'https://accounts.douban.com/passport/login?source=main'
}

# 准备登录数据
data = {
    'name': '你的账号',
    'password': '你的密码',
    'remember': 'false'
}

# 发起登录请求
response = session.post(login_url, data=data, headers=headers)
print('登录结果:', response.json())

# 登录成功后,session自动保存了Cookie,可以直接访问其他页面
profile_response = session.get('https://www.douban.com/people/你的ID/')
print('访问个人主页:', '成功' if '我的豆瓣' in profile_response.text else '失败')

这个方法的好处是,一旦登录成功,session会帮你自动维护Cookie状态,就像真实的浏览器一样。

第三招:Selenium大法(终极武器)

有些网站登录过程复杂,各种验证码、滑动验证,这时候就需要请出我们的大杀器——Selenium。

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import time

# 设置Chrome选项
chrome_options = Options()
chrome_options.add_argument('--user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36')

# 启动浏览器
driver = webdriver.Chrome(options=chrome_options)

try:
    # 访问登录页面
    driver.get('https://www.douban.com')
    
    # 点击登录按钮
    login_btn = driver.find_element_by_xpath('//div[@class="account-form"]//a[contains(text(),"登录")]')
    login_btn.click()
    time.sleep(2)
    
    # 切换到账号密码登录
    switch_btn = driver.find_element_by_class_name('account-tab-account')
    switch_btn.click()
    time.sleep(1)
    
    # 输入账号密码
    username = driver.find_element_by_id('username')
    password = driver.find_element_by_id('password')
    
    username.send_keys('你的账号')
    password.send_keys('你的密码')
    
    # 点击登录
    submit_btn = driver.find_element_by_xpath('//a[contains(@class,"btn-account")]')
    submit_btn.click()
    time.sleep(3)
    
    # 登录成功后,获取Cookies
    cookies = driver.get_cookies()
    print('获取到的Cookies:', cookies)
    
    # 现在你可以用这些Cookies配合requests使用了
    cookie_dict = {cookie['name']: cookie['value'] for cookie in cookies}
    
    # 使用requests继续爬取,享受速度与激情
    with requests.Session() as s:
        s.headers.update({'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36'})
        for cookie in cookies:
            s.cookies.set(cookie['name'], cookie['value'])
        
        response = s.get('https://www.douban.com/people/你的ID/')
        print('最终结果:', '成功' if '我的豆瓣' in response.text else '失败')

finally:
    driver.quit()  # 记得关闭浏览器

Selenium的牛逼之处在于,它真的控制了一个浏览器,什么JavaScript渲染、复杂交互都不在话下。

实战:完整的豆瓣数据爬取示例

来,咱们整合一下刚才学的内容,搞个完整的例子:

import requests
from selenium import webdriver
import time
import json

class DoubanSpider:
    def __init__(self):
        self.session = requests.Session()
        self.session.headers.update({
            'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36'
        })
    
    def login_with_selenium(self):
        """使用Selenium登录并获取Cookies"""
        print("🚀 启动浏览器登录...")
        driver = webdriver.Chrome()
        
        try:
            driver.get('https://www.douban.com')
            time.sleep(3)
            
            # 这里根据实际情况调整选择器
            switch_btn = driver.find_element_by_class_name('account-tab-account')
            switch_btn.click()
            time.sleep(1)
            
            username = driver.find_element_by_id('username')
            password = driver.find_element_by_id('password')
            
            username.send_keys('你的账号')
            password.send_keys('你的密码')
            
            submit_btn = driver.find_element_by_xpath('//a[contains(@class,"btn-account")]')
            submit_btn.click()
            time.sleep(5)
            
            # 检查登录是否成功
            if 'douban.com' in driver.current_url:
                cookies = driver.get_cookies()
                # 将cookies设置到session中
                for cookie in cookies:
                    self.session.cookies.set(cookie['name'], cookie['value'])
                print("✅ 登录成功!")
                return True
            else:
                print("❌ 登录失败")
                return False
                
        finally:
            driver.quit()
    
    def get_user_info(self, user_id):
        """获取用户信息"""
        url = f'https://www.douban.com/people/{user_id}/'
        response = self.session.get(url)
        
        if response.status_code == 200:
            # 这里可以用BeautifulSoup解析页面获取具体信息
            if '我的豆瓣' in response.text:
                print(f"✅ 成功获取用户 {user_id} 的信息")
                # 实际开发中这里应该解析页面提取具体信息
                return True
        else:
            print(f"❌ 获取用户信息失败,状态码: {response.status_code}")
        return False
    
    def get_movie_ratings(self, user_id):
        """获取用户电影评分"""
        url = f'https://movie.douban.com/people/{user_id}/collect'
        response = self.session.get(url)
        
        if response.status_code == 200:
            print("✅ 成功获取电影评分")
            # 解析电影评分信息
            return self.parse_movie_ratings(response.text)
        return []
    
    def parse_movie_ratings(self, html):
        """解析电影评分页面"""
        # 这里简化处理,实际应该用BeautifulSoup解析
        # 返回模拟数据
        return [
            {'电影': '肖申克的救赎', '评分': 5, '时间': '2023-01-01'},
            {'电影': '阿甘正传', '评分': 4, '时间': '2023-01-15'}
        ]

# 使用示例
if __name__ == "__main__":
    spider = DoubanSpider()
    
    # 登录
    if spider.login_with_selenium():
        # 获取用户信息
        spider.get_user_info('你的ID')
        
        # 获取电影评分
        ratings = spider.get_movie_ratings('你的ID')
        print("🎬 你的电影评分:", ratings)

爬虫老司机的经验之谈

坑点1:Cookie会过期
别以为拿到Cookie就能一劳永逸。Cookie是有生命周期的,短的几小时,长的几个月。你的代码里要有重试机制,发现Cookie失效就重新登录。

坑点2:User-Agent要配套
你拿着Chrome的Cookie,却用Python默认的User-Agent去访问,这不是明摆着告诉服务器“我是爬虫”吗?记得保持一致性。

坑点3:注意Cookie的作用域
Cookie有domain和path属性,别把给A网站的Cookie用在B网站上,那样肯定不行。

最佳实践:

  • 定期更新Cookie
  • 使用会话(Session)保持状态
  • 添加适当的延时,别把服务器搞崩了
  • 遵守robots.txt,做个有道德的爬虫玩家

结语:Cookie是你的爬虫通行证

掌握了Cookie的使用,你的爬虫就从“流浪汉”升级成了“有身份证的公民”。无论是简单的复制粘贴,还是高级的自动登录,或者是Selenium的降维打击,总有一款适合你。

记住,爬虫的世界里,Cookie就是那张“芝麻开门”的魔法咒语。用好它,数据世界的大门将为你敞开!

(本文所有代码示例仅供参考,请遵守网站爬虫协议,合理使用爬虫技术。)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

值引力

持续创作,多谢支持!

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

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

打赏作者

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

抵扣说明:

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

余额充值