用scrapy剪切列表并组织它

时间:2018-12-07 14:05:32

标签: python web-scraping scrapy

我正在尝试从该页面https://myanimelist.net/animelist/MoonlessMidnite?status=7抓取每个标题和得分,并以该格式返回数据:

{"user" : moonlessmidnite, "anime" : A, "score" : x 
"user" : moonlessmidnite, "anime" : B, "score" : x 
"user" : moonlessmidnite, "anime" : C, "score" : x }

... ect

我设法得到桌子

table = response.xpath('.//tr[@class = "list-table-data"]')

score = table.xpath('.//td[@class =  "data score"]//a/text()').extract()
title = table.xpath('.//td//a[@class = "link sort"]').extract()

但是当我尝试抓取标题或得分时,我得到了一些奇怪的输出,例如:

['\n            ', '\n          ', '${ item.anime_title }']

1 个答案:

答案 0 :(得分:1)

查看网站的原始HTML:

Raw HTML

您看到它确实包含${ item.anime_title }

这表示内容是通过Javascript生成的。 对此没有简单的解决方案,您必须查看正在执行的XHR请求,看看是否可以获得有意义的东西。

如果仔细查看HTML,您会发现数据包含在表data-item attrbute中的一个大JSON字符串中。

在草率的shell中尝试一下:

fetch('https://myanimelist.net/animelist/MoonlessMidnite?status=7')
import json
json.loads(response.xpath('//table[@class="list-table"]/@data-items').extract_first()

这将输出如下内容:

{'status': 2,
  'score': 0,
  'tags': '',
  'is_rewatching': 0,
  'num_watched_episodes': 1,
  'anime_title': 'Hidan no Aria Special',
  'anime_num_episodes': 1,
  'anime_airing_status': 2,
  'anime_id': 10604,
  'anime_studios': None,
  'anime_licensors': None,
  'anime_season': None,
  'has_episode_video': False,
  'has_promotion_video': True,
  'has_video': True,
  'video_url': '/anime/10604/Hidan_no_Aria_Special/video',
  'anime_url': '/anime/10604/Hidan_no_Aria_Special',
  'anime_image_path': 'https://cdn.myanimelist.net/r/96x136/images/anime/2/29138.jpg?s=90cb8381c58c92d39862ac700c43f7b5',
  'is_added_to_list': False,
  'anime_media_type_string': 'Special',
  'anime_mpaa_rating_string': 'PG-13',
  'start_date_string': None,
  'finish_date_string': None,
  'anime_start_date_string': '12-21-11',
  'anime_end_date_string': '12-21-11',
  'days_string': None,
  'storage_string': '',
  'priority_string': 'Low'},
 {'status': 6,
  'score': 0,
  'tags': '',
  'is_rewatching': 0,
  'num_watched_episodes': 0,
  'anime_title': '.hack//Roots',
  'anime_num_episodes': 26,
  'anime_airing_status': 2,
  'anime_id': 873,
  'anime_studios': None,
  'anime_licensors': None,
  'anime_season': None,
  'has_episode_video': False,
  'has_promotion_video': True,
  'has_video': True,
  'video_url': '/anime/873/hack__Roots/video',
  'anime_url': '/anime/873/hack__Roots',
  'anime_image_path': 'https://cdn.myanimelist.net/r/96x136/images/anime/3/13050.jpg?s=db9ff70bf19742172f1d0140c95c4a65',
  'is_added_to_list': False,
  'anime_media_type_string': 'TV',
  'anime_mpaa_rating_string': 'PG-13',
  'start_date_string': None,
  'finish_date_string': None,
  'anime_start_date_string': '04-06-06',
  'anime_end_date_string': '09-28-06',
  'days_string': None,
  'storage_string': '',
  'priority_string': 'Low'}

然后,您只需要使用此命令即可获取所需的信息。