如何手动登录Steamspy网站后使用Scrapy爬取已收集的URL列表内容
解决Steamspy手动登录后用Scrapy爬取的问题
嘿,这需求太常见了——手动登录一次网站,让爬虫复用这个登录状态去爬取需要权限的页面。核心思路就是把浏览器登录后的Cookie传递给Scrapy,让爬虫模拟成已登录的用户会话。下面给你一步步来实现:
第一步:手动登录并获取登录Cookie
- 打开你的常用浏览器(比如Chrome/Firefox),访问steamspy.com并完成登录。
- 按下F12打开开发者工具,切换到「Application」(Chrome)或「Storage」(Firefox)标签页。
- 在左侧找到「Cookies」>「https://steamspy.com」,这里会列出所有当前网站的Cookie。
- 把这些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
相关产品推荐
相关产品推荐

