为了从 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
。
代码修改如下:
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 上多个游戏的开发者和类型信息。