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 上多个游戏的开发者和类型信息。

相关推荐
En^_^Joy26 分钟前
PyQt常用控件的使用:QFileDialog、QMessageBox、QTreeWidget、QRadioButton等
开发语言·python·pyqt
英英_31 分钟前
MySQL 日志数据同步的详细教程
数据库·mysql
蹦蹦跳跳真可爱58933 分钟前
Python----目标检测(《YOLOv3:AnIncrementalImprovement》和YOLO-V3的原理与网络结构)
人工智能·python·深度学习·神经网络·yolo·目标检测·目标跟踪
twentyonepilots37 分钟前
Prompt Engineering Notes
python
胡耀超1 小时前
大语言模型提示词(LLM Prompt)工程系统性学习指南:从理论基础到实战应用的完整体系
人工智能·python·语言模型·自然语言处理·llm·prompt·提示词
fen_fen1 小时前
学习笔记(25):线性代数,矩阵-矩阵乘法原理
笔记·学习·线性代数
luofeiju1 小时前
矩阵QR分解
线性代数·算法
闻缺陷则喜何志丹1 小时前
【分治法 容斥原理 矩阵快速幂】P6692 出生点|普及+
c++·线性代数·数学·洛谷·容斥原理·分治法·矩阵快速幂
TDengine (老段)1 小时前
TDengine 替换 Hadoop,彻底解决数据丢失问题 !
大数据·数据库·hadoop·物联网·时序数据库·tdengine·涛思数据