Scrapy无法抓取深层链接求助:如何获取更多层级URL?
嘿,我看了你的代码,问题大概率出在Rule的follow参数上!你当前的Rule只爬取了起始页面提取的第一层级链接,没有递归跟进更深层级的页面,所以才只拿到63条。
核心修改:开启follow=True
在CrawlSpider的Rule里,如果你指定了callback,follow默认是False——意思是爬完当前页面、处理完item后,不会继续从这个页面提取新链接再爬。把它改成True,就能让爬虫递归跟进每个抓取到的页面,提取更深层级的URL了。
修改后的rules代码:
rules = ( Rule(LinkExtractor(), callback='parse_url', follow=True), )
其他可能的优化方向
除了follow,还有几个点可以检查,帮你拿到更多有效URL:
精准控制LinkExtractor的提取范围:如果网站里有很多不需要的链接(比如登录页、静态资源),可以用
allow或deny参数过滤,避免浪费爬虫资源。比如只爬取/article开头的内容页:Rule(LinkExtractor(allow=r'/article/'), callback='parse_url', follow=True),检查爬取深度限制:Scrapy默认
DEPTH_LIMIT=0(无限制),但如果网站层级极深,你可以在settings.py里调整这个值,比如:DEPTH_LIMIT = 5 # 最多爬5层处理反爬限制:如果网站限制了爬取速度,可能会导致部分请求失败,你可以在
settings.py里加个延迟:DOWNLOAD_DELAY = 2 # 每次请求间隔2秒另外,Scrapy默认遵守robots.txt,如果网站的robots.txt禁止爬取某些页面,你可以设置
ROBOTSTXT_OBEY = False(注意要合法合规哦)。调试LinkExtractor的提取结果:用Scrapy Shell测试当前页面能提取多少链接,确认是不是LinkExtractor没抓到所有链接:
scrapy shell https://www.example.com然后在shell里执行:
from scrapy.linkextractors import LinkExtractor le = LinkExtractor() print(len(le.extract_links(response))) # 看当前页面提取到的链接数量
完整修改后的代码示例
from scrapy.spiders import CrawlSpider, Rule from scrapy.linkextractors import LinkExtractor from scrapy import Item, Field class UrlItem(Item): url = Field() class RetriveUrl(CrawlSpider): name = 'retrive_url' allowed_domains = ['example.com'] start_urls = ['https://www.example.com'] rules = ( # 开启follow,递归跟进所有符合条件的链接 Rule(LinkExtractor(), callback='parse_url', follow=True), ) def parse_url(self, response): item = UrlItem() item['url'] = response.url return item
这样调整后,爬虫应该就能抓取到更深层级的URL了,数量会明显增加~
内容的提问来源于stack exchange,提问作者Webdev

