首页 > 解决方案 > 用于 Boardgamegeek 的 Python Webscraper

问题描述

Scraper 的目标是分析哪些棋盘游戏获得最多赞,并将它们打印在排序列表中。基本上是一本“名字:竖起大拇指”的字典。这是我要排序的游戏列表: https ://boardgamegeek.com/geeklist/268396/20-most-anticipated-games-2020-11th-year-nominatio

我在 Python 中使用框架 Scrapy。我发现以下命令可以很好地提取标题并竖起大拇指:

response.css('.fl > a:nth-child(2)::text').getall()
response.css('.recs a::text').getall()

当游戏获得 0 个拇指时,问题就出现了,然后 Scrapy 只是跳过那个拇指。这意味着标题列表不仅仅是竖起大拇指的列表。例如,我可以使用上面的命令获得一个包含 25 个标题的列表和一个包含 20 个赞的列表。有没有办法将空字符串转换为默认值 0,以便名称列表和竖起大拇指列表相等?像:

response.css('.recs a::text').getall(default="0")

当没有竖起大拇指时,它看起来像这样:

<a aria-label="Recommendations and tip info" class="js-score" href="javascript://" onclick="RecSpy( 'listitem', '7520669', 'tippers' ); return false;"></a>

标签: pythonscrapy

解决方案


不是从主 DOM 中单独收集每个棋盘游戏及其喜欢的东西,而是可以获取包含喜欢和棋盘游戏名称的每个选择器,例如

games = response.css('.mb5') # fetch every selector with class "mb5"
for game in games:
  name = game.css('.fl > a:nth-child(2)::text').get()
  likes = game.css('.recs a::text').get() or 0
  ...

伪代码,但我希望你明白。


推荐阅读