我有以下代码:
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
和类似的检查。
1条答案
按热度按时间kognpnkq1#
你很接近了。但问题不在于你允许的域名中的网址格式。
根据那些零散的文件
allowed_domains¶
包含允许此爬行器爬网的域的字符串的可选列表。如果启用了OffsiteMiddleware,则不会跟踪不属于此列表中指定的域名(或其子域)的URL请求。
假设你的目标网址是https://www.example.com/1.html,然后将'example.com'添加到列表中。
不幸的是,你有一个完整的
url
与http方案和所有在您允许的域,这是抛出一个解析错误。这个问题在离线中间件的调试日志中的爬网输出中被暗示为:您需要做的就是在
allowed_domains
列表中将'https://ilibrary.ru'
更改为'ilibrary.ru'
,它将解决您的问题。范例: