为了从 Metacritic 网站上爬取游戏的开发者和类型信息,你可以使用 Python 的网络爬虫工具,比如 requests
和 BeautifulSoup
,或者更高级的工具如 Scrapy
或 Selenium
。本文将介绍一种基于 requests
和 BeautifulSoup
的简单爬虫示例,并假设目标是从 Metacritic 的单个游戏页面上提取开发者和类型信息。
1、问题背景
我们想要从 Metacritic 网站爬取游戏的信息,包括游戏标题、开发者、类型、评论得分和发行日期。我们使用该网站提供的 API 来爬取数据,但代码中遇到了问题,无法爬取游戏开发者和类型的信息。
2、解决方案
以下列出了可能出现的代码问题和可能的解决方案:
parseGame
函数中没有正确使用 meta
参数。meta
参数应该包含一个键为 item
的字典,该字典的值是需要传递给 parseGame
函数的爬取到的数据。
parseGame
函数中的 meta
参数,使其包含一个键为 item
的字典,该字典的值是需要传递给 parseGame
函数的爬取到的数据。HtmlXPathSelector
解析器。在 Scrapy 中,现在建议使用 Selector
解析器代替 HtmlXPathSelector
解析器。
HtmlXPathSelector
解析器替换为 Selector
解析器。extract()
方法来提取数据,但没有使用 get()
方法来获取提取结果。extract()
方法返回一个列表,而 get()
方法返回一个字符串。
extract()
方法替换为 get()
方法,以获取提取结果。parseGame
函数中插入了 MySQL 数据库,这可能会导致性能问题。建议使用 Scrapy 的管道机制来处理数据的存储。
parseGame
函数中的 MySQL 数据库操作移到管道机制中。parseGame
函数中使用 yield item
来输出数据,这可能会导致数据丢失。建议使用 return item
来输出数据。
parseGame
函数中的 yield item
替换为 return item
。代码修改如下:
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 上多个游戏的开发者和类型信息。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。