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

为了从 Metacritic 网站上爬取游戏的开发者和类型信息,你可以使用 Python 的网络爬虫工具,比如 requestsBeautifulSoup,或者更高级的工具如 ScrapySelenium。本文将介绍一种基于 requestsBeautifulSoup 的简单爬虫示例,并假设目标是从 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 上多个游戏的开发者和类型信息。

相关推荐
测试19984 小时前
软件测试 - 单元测试总结
自动化测试·软件测试·python·测试工具·职场和发展·单元测试·测试用例
廿一夏7 小时前
MySql存储引擎与索引
数据库·sql·mysql
曲幽7 小时前
我用了FastApiAdmin后,连夜把踩过的坑都整理出来了
redis·python·postgresql·vue3·fastapi·web·sqlalchemy·admin·fastapiadmin
前端若水8 小时前
会话管理:创建、切换、删除对话历史
前端·人工智能·python·react.js
lzhdim8 小时前
SQL 入门 15:SQL 事务:从 ACID 到四种常见的并发问题
数据库·sql
瀚高PG实验室9 小时前
瀚高企业版V9.1.1在pg_restore还原备份文件时提示extract函数语法问题
数据库·瀚高数据库
涛声依旧-底层原理研究所9 小时前
残差连接与层归一化通俗易懂的详解
人工智能·python·神经网络·transformer
csdn_aspnet9 小时前
Python 算法快闪 LeetCode 编号 70 - 爬楼梯
python·算法·leetcode·职场和发展
TDengine (老段)9 小时前
TDengine Tag 设计哲学与 Schema 变更机制
大数据·数据库·物联网·时序数据库·iot·tdengine·涛思数据
richard_yuu9 小时前
鸿蒙治愈游戏模块实战|四大轻量解压游戏、ArkTS动画交互与低功耗落地
游戏·交互·harmonyos