我正在抓取https://myanimelist.net/anime.php#/,你可以看到有genres部分我想返回为csv只有前18页,并停止在explicit genres之前我可以怎么做?这是我的代码
# -*- coding: utf-8 -*-
import scrapy
from scrapy.exceptions import CloseSpider
class Link(scrapy.Item):
link = scrapy.Field()
class LinkListsSpider(scrapy.Spider):
name = 'link_lists'
allowed_domains = ['https://myanimelist.net/']
start_urls = ['https://myanimelist.net/anime.php#/']
def parse(self, response):
xpath = '//a[re:test(@class, "genre-name-link")]/@href'
selection = response.xpath(xpath)
for s in selection :
l = Link()
l['link'] = 'https://en.wikipedia.org' + s.get()
yield l
2条答案
按热度按时间hsgswve41#
不要认为这是“限制页面”。您可能会在链接列表中看到“页面”,但Scrapy看不到页面。它看到的是一个巨大的HTML片段。也不要认为抓取是像您的眼睛那样扫描页面。您的工作是像刀子一样使用选择器来划出您想要查看的部分。您使用XPath导航到该部分并在该部分周围绘制边界。
我使用的方法是识别名为Genres的部分,然后只收集该部分下的所有链接。(而不是像您看到它时所想的那样是一个后代),我使用了
following-sibling
axis,然后[1]
以“转到下一(1)个div
(其包含18个流派)并收集来自其下的所有链接”。换句话说,HTML如下所示:
因此,导航的方法是找到
<div>Genres</div>
,然后跳到它的下一个兄弟(下一个div
),然后在其中查找链接。请确保将
**kwargs
添加到解析函数参数btw中,以便它更准确地匹配基类签名。xfb7svmp2#
请使用@Steven answer。我只想说明如何使用XPath从页面中获取前18个链接: