Metacritic 网站中的游戏开发者和类型信息爬取

为了从 Metacritic 网站上爬取游戏的开发者和类型信息,你可以使用 Python 的网络爬虫工具,比如 requests 和 BeautifulSoup,或者更高级的工具如 Scrapy 或 Selenium。本文将介绍一种基于 requests 和 BeautifulSoup 的简单爬虫示例,并假设目标是从 Metacritic 的单个游戏页面上提取开发者和类型信息。

1、问题背景

我们想要从 Metacritic 网站爬取游戏的信息,包括游戏标题、开发者、类型、评论得分和发行日期。我们使用该网站提供的 API 来爬取数据,但代码中遇到了问题,无法爬取游戏开发者和类型的信息。

2、解决方案

以下列出了可能出现的代码问题和可能的解决方案:

  • 问题 1: parseGame 函数中没有正确使用 meta 参数。meta 参数应该包含一个键为 item 的字典,该字典的值是需要传递给 parseGame 函数的爬取到的数据。

    • 解决方案: 修改 parseGame 函数中的 meta 参数,使其包含一个键为 item 的字典,该字典的值是需要传递给 parseGame 函数的爬取到的数据。
  • 问题 2: 使用了过时的 HtmlXPathSelector 解析器。在 Scrapy 中,现在建议使用 Selector 解析器代替 HtmlXPathSelector 解析器。

    • 解决方案: 将 HtmlXPathSelector 解析器替换为 Selector 解析器。
  • 问题 3: 使用了 extract() 方法来提取数据,但没有使用 get() 方法来获取提取结果。extract() 方法返回一个列表,而 get() 方法返回一个字符串。

    • 解决方案: 将 extract() 方法替换为 get() 方法,以获取提取结果。
  • 问题 4: 在 parseGame 函数中插入了 MySQL 数据库,这可能会导致性能问题。建议使用 Scrapy 的管道机制来处理数据的存储。

    • 解决方案: 将 parseGame 函数中的 MySQL 数据库操作移到管道机制中。
  • 问题 5: 在 parseGame 函数中使用 yield item 来输出数据,这可能会导致数据丢失。建议使用 return item 来输出数据。

    • 解决方案: 将 parseGame 函数中的 yield item 替换为 return item。

代码修改如下:

python 复制代码
from string import lowercase

from scrapy.item import Field, Item
from scrapy.spider import BaseSpider
from scrapy.http import Request
from scrapy.selector import HtmlXPathSelector, Selector

from metacritic.items import MetacriticItem


class MetacriticSpider(BaseSpider):
    name = 'metacritic'
    allowed_domains = ['metacritic.com']

    max_id = 1 # your max_id value goes here!!!

    def start_requests(self):
        for c in lowercase:
            for i in range(self.max_id):
                yield Request('http://www.metacritic.com/browse/games/title/ps4/{0}?page={1}'.format(c, i), callback=self.parseps4)

    def parseGame(self, response):
        item = response.meta['item']
        hxs = HtmlXPathSelector(response)
        site = hxs.select('//div[@class="product_wrap"]')

        item['dev'] = site.xpath('.//span[contains(@class, "summary_detail developer")]/span[1]/text()').get()
        item['genre'] = site.xpath('.//span[contains(@class, "summary_detail product_genre")]/span[1]/text()').get()

        yield item

    def parseps4(self, response):
        hxs = Selector(response)
        sites = hxs.select('//div[@class="product_wrap"]')
        for site in sites:
            item = MetacriticItem()
            item['title'] = site.xpath('.//div[contains(@class, "basic_stat product_title")]/a/text()').get().strip()
            item['cscore'] = site.xpath('.//div[contains(@class, "basic_stat product_score brief_metascore")]/div[1]/text()').get().strip()
            item['uscore'] = site.xpath('.//div/ul/li/span[contains(@class, "data textscore")]/text()').get().strip()
            item['release'] = site.xpath('.//li[contains(@class, "stat release_date full_release_date")]/span[2]/text()').get().strip()

            link = site.xpath('.//div[contains(@class, "basic_stat product_title")]/a/@href').get()
            yield Request('http://www.metacritic.com/' + link, meta={'item': item}, callback=self.parseGame)

这个扩展代码从一个包含多个游戏的列表页面爬取每个游戏的链接,然后访问每个游戏的详细页面提取信息。

通过这种方式,你可以批量爬取 Metacritic 上多个游戏的开发者和类型信息。

相关推荐
唐老板22 分钟前
uuidv7 来了:为什么别再拿 uuidv4 当主键了
数据库
锋行天下7 小时前
langgraph 后端发自定义数据,前端接收方法概括
人工智能·python
benchmark_cc9 小时前
用 QuantDash 读取单只股票五档盘口:抽样、缺失值检查与复现记录
python·数据分析·pandas·量化交易·股票数据·quantdash
曲径海盗10 小时前
【Python 学习第 55 天】列表基础
python·学习笔记·编程入门
专注仿真10 小时前
知识问答模型用到的算法集详解及代码实例
python·算法·代码·大模型训练·控制算法
jyOverQ10 小时前
我写了一个 CSDN Markdown 图片助手:告别本地图片逐张上传
python·工具·csdn
SelectDB13 小时前
让变更流出 Doris:Apache Doris 5.0 基于增量计算的 CDC 技术解析
数据库
刘马想放假13 小时前
CANviz 使用指南|Linux 安装、DBC 解码、实时曲线与 J1939 实战
linux·python·websocket
这个DBA有点耶14 小时前
MCP隔离层+行级语义审计+输出校验:AI访问数据库的安全边界拆解
数据库·人工智能·ai编程
2601_9679873714 小时前
python判断变量名不要调用任何函数实现
python·函数·语法·判断·变量名