Scrapy:不遍历页面

whhtz7ly  于 2023-10-20  发布在  其他
关注(0)|答案(1)|浏览(129)

我有以下代码:

import scrapy
from urllib.parse import urlsplit

class Litspider2Spider(scrapy.Spider):
    name = "litspider2"
    allowed_domains = ["https://ilibrary.ru"]
    start_urls = ["https://ilibrary.ru/text/94/p.1"]

    def parse(self, response):            

        yield {"url" : urlsplit(response.url)[2],
               "teil" : response.xpath("//h2/text()").get(),
               "kapitell" : response.xpath("//h3/text()").get(),
                "text" : " ".join(response.css("span.p::text").getall()).strip("'").strip(",").strip(" ").replace("\x97", "—")
        }
            
        next_chapter = response.css("[title='Дальше'] ::attr(href)").get()

        if next_chapter is not None:
            next_chapter_url = "https://ilibrary.ru" + next_chapter
            yield response.follow(next_chapter_url, callback=self.parse)

爬行时,Python会忽略self.parse的回调,只打印第一页。我不明白这里的错误是什么。也许,主要原因在于URL格式(/index.html后面是页码)?
由于我是Scrapy的新手,我尝试了从汤到坚果的所有东西,尽管我使用了几乎相同的蜘蛛代码,之前一切都很顺利。我改变的主要是代码中的URL。我使用不同的start_urls和类似的检查。

kognpnkq

kognpnkq1#

你很接近了。但问题不在于你允许的域名中的网址格式。
根据那些零散的文件
allowed_domains¶
包含允许此爬行器爬网的域的字符串的可选列表。如果启用了OffsiteMiddleware,则不会跟踪不属于此列表中指定的域名(或其子域)的URL请求。
假设你的目标网址是https://www.example.com/1.html,然后将'example.com'添加到列表中。
不幸的是,你有一个完整的url与http方案和所有在您允许的域,这是抛出一个解析错误。这个问题在离线中间件的调试日志中的爬网输出中被暗示为:

2023-08-27 23:10:26 [scrapy.spidermiddlewares.offsite] DEBUG: Filtered offsite request to 'ilibrary.ru': <GET https://ilibrary.ru/text/94/p.2/index.html>

您需要做的就是在allowed_domains列表中将'https://ilibrary.ru'更改为'ilibrary.ru',它将解决您的问题。
范例:

class Litspider2Spider(scrapy.Spider):
    name = "litspider2"
    allowed_domains = ["ilibrary.ru"]
    start_urls = ["https://ilibrary.ru/text/94/p.1"]

相关问题