scrapy 设置剪贴页限制

vaqhlq81  于 2022-11-09  发布在  其他
关注(0)|答案(2)|浏览(127)

我正在抓取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
hsgswve4

hsgswve41#

不要认为这是“限制页面”。您可能会在链接列表中看到“页面”,但Scrapy看不到页面。它看到的是一个巨大的HTML片段。也不要认为抓取是像您的眼睛那样扫描页面。您的工作是像刀子一样使用选择器来划出您想要查看的部分。您使用XPath导航到该部分并在该部分周围绘制边界。
我使用的方法是识别名为Genres的部分,然后只收集该部分下的所有链接。(而不是像您看到它时所想的那样是一个后代),我使用了following-siblingaxis,然后[1]以“转到下一(1)个div(其包含18个流派)并收集来自其下的所有链接”。
换句话说,HTML如下所示:

<div>Genres</div>
<div class="genre-link">
    -- Anime Genre Links here --
</div>
<div>Explicit Genres</div>
<div class="genre-link">
    -- Explicit Genre Links here --

因此,导航的方法是找到<div>Genres</div>,然后跳到它的下一个兄弟(下一个div),然后在其中查找链接。

class LinkListsSpider(scrapy.Spider):
    name = 'link_lists'
    allowed_domains = ['https://myanimelist.net/']
    start_urls = ['https://myanimelist.net/anime.php#/']

    def parse(self, response,**kwargs):
        xpath = '//div[text()="Genres"]/following-sibling::div[@class="genre-link"][1]//a/@href'
        selection = response.xpath(xpath)
        for s in selection:
            l = Link()
            l['link'] = 'https://en.wikipedia.org' + s.get()
            yield l

请确保将**kwargs添加到解析函数参数btw中,以便它更准确地匹配基类签名。

xfb7svmp

xfb7svmp2#

请使用@Steven answer。我只想说明如何使用XPath从页面中获取前18个链接:

'(//a[@class="genre-name-link"])[position() <= 18]/@href'

相关问题