You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何手动登录Steamspy网站后使用Scrapy爬取已收集的URL列表内容

解决Steamspy手动登录后用Scrapy爬取的问题

嘿,这需求太常见了——手动登录一次网站,让爬虫复用这个登录状态去爬取需要权限的页面。核心思路就是把浏览器登录后的Cookie传递给Scrapy,让爬虫模拟成已登录的用户会话。下面给你一步步来实现:

第一步:手动登录并获取登录Cookie

  1. 打开你的常用浏览器(比如Chrome/Firefox),访问steamspy.com并完成登录。
  2. 按下F12打开开发者工具,切换到「Application」(Chrome)或「Storage」(Firefox)标签页。
  3. 在左侧找到「Cookies」>「https://steamspy.com」,这里会列出所有当前网站的Cookie。
  4. 把这些Cookie全部复制下来,整理成键值对字典的形式(重点保留sessionid、csrfmiddlewaretoken这类和登录状态绑定的Cookie)。

第二步:在Scrapy爬虫中配置Cookie

有两种简单的方式把Cookie注入到爬虫里:

方式一:直接在Spider类中定义cookies属性

把你复制的Cookie写成字典,添加到Steamspy_Spider类里,Scrapy会自动在请求时带上这些Cookie:

方式二:通过start_requests方法传递Cookie

如果需要更灵活的控制(比如不同请求用不同Cookie),可以重写start_requests方法,在每个请求里手动带上Cookie:

def start_requests(self):
    cookies = {
        'sessionid': '你的sessionid值',
        'csrfmiddlewaretoken': '你的csrf值',
        # 其他复制的Cookie键值对
    }
    for url in self.start_urls:
        yield scrapy.Request(
            url,
            cookies=cookies,
            callback=self.parse,
            # 建议加上和浏览器一致的User-Agent,避免被反爬
            headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36'}
        )

修正你现有代码里的正则问题

另外,你当前代码里的正则表达式有错误——没有用括号捕获目标内容,而且匹配逻辑也有问题(比如有些匹配的关键字顺序不对)。我给你修正了这部分,确保能正确提取每个字段:

完整修正后的代码

import scrapy
from scrapy.item import Item, Field
import re

class WorkshopItem(Item):
    developer = Field()
    publisher = Field()
    genre = Field()
    languages = Field()
    tags = Field()
    category = Field()
    release_date = Field()
    old_userscore = Field()
    metascore = Field()
    owners = Field()
    owners_7_day_average = Field()
    players_in_the_last_2_weeks = Field()
    followers = Field()
    peak_concurrent_players_yesterday = Field()
    youTube_stats = Field()
    playtime_in_the_last_2_weeks = Field()
    playtime_total = Field()

class Steamspy_Spider(scrapy.Spider):
    name = 'steamspy'
    start_urls = ['https://steamspy.com/app/440']
    
    # 替换成你手动获取的Cookie字典
    cookies = {
        'sessionid': 'your_session_id_here',
        'csrfmiddlewaretoken': 'your_csrf_token_here',
        # 添加其他Cookie键值对
    }

    def parse(self, response):
        item = WorkshopItem()
        # 获取目标信息块
        app_info = response.css(".p-r-30 > p:nth-child(2)").get()
        
        if not app_info:
            self.logger.warning("未找到目标信息区域!可能登录状态失效或页面结构已更改")
            return
        
        # 清理HTML标签,得到纯文本内容
        clean_info = re.sub('<.*?>', '', app_info).strip()
        
        # 定义每个字段对应的正则匹配规则(带捕获分组)
        field_patterns = {
            'developer': r'Developer: (.*?) Publisher',
            'publisher': r'Publisher: (.*?) Genre',
            'genre': r'Genre: (.*?) Languages',
            'languages': r'Languages: (.*?) Tags',
            'tags': r'Tags: (.*?) Category',
            'category': r'Category: (.*?) Release date',
            'release_date': r'Release date: (.*?) Free',
            'old_userscore': r'Old userscore: (.*?) Metascore',
            'metascore': r'Metascore: (.*?) Owners',
            'owners': r'Owners: (.*?) \(7 day average',
            'owners_7_day_average': r'\(7 day average: (.*?)\) Followers',
            'followers': r'Followers: (.*?) Peak concurrent players yesterday',
            'peak_concurrent_players_yesterday': r'Peak concurrent players yesterday: (.*?) YouTube stats',
            'youTube_stats': r'YouTube stats: (.*?) Playtime in the last 2 weeks',
            'playtime_in_the_last_2_weeks': r'Playtime in the last 2 weeks: (.*?) Playtime total',
            'playtime_total': r'Playtime total: (.*?)$'
        }
        
        # 遍历规则提取字段
        for field_name, pattern in field_patterns.items():
            match = re.search(pattern, clean_info, re.DOTALL)
            if match:
                item[field_name] = match.group(1).strip()
            else:
                self.logger.warning(f"字段 {field_name} 未找到匹配内容")
        
        return item

额外注意事项

  • Cookie是有有效期的,过一段时间可能会过期,到时需要重新手动登录获取新的Cookie。
  • 尽量让Scrapy的User-Agent和你登录的浏览器保持一致,避免网站识别出爬虫身份。
  • 如果网站有更严格的反爬机制(比如验证请求头),可以把浏览器里的请求头全部复制到Scrapy的请求中。

内容的提问来源于stack exchange,提问作者BrianEbrahimi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 13:17:32