使用Scrapy抓取链接到我们想要的任何深度的网站的所有页面

TJ1*_*TJ1 2 web-crawler scrapy web-scraping python-3.x

我很想知道是否可以抓取网站上任意深度的所有页面和链接,即使在跟踪几个链接后顶部 URL 发生变化?这是一个例子:

热门网址:www.topURL.com
有 3 个链接:www.topURL.com/link1、www.topURL.com/link2 和 www.topURL.com/link3

然后,如果我们点击 www.topURL.com/link1,它会将我们带到一个页面,该页面本身有
2 个链接:www.topURL.com/link4 和 www.topURL.com/link5

但如果我们点击 www.topURL.com/link4 ,它会将我们带到一个包含以下 2 个链接的页面:www.anotherURL.com/link1 和 www.thirdURL.com/link1

scrapy 或任何 python 爬虫/蜘蛛是否可以从 www.topURL.com 开始,然后跟踪链接并最终到达 www.thirdURL.com/link1?

它的深度有限制吗?有任何代码示例向我展示如何做到这一点吗?

谢谢您的帮助。

Gra*_*rus 7

看一下scrapy的CrawlSpiderspider类

CrawlSpider 是最常用的爬行常规网站的蜘蛛,因为它通过定义一组规则提供了一种方便的跟踪链接的机制。

为了实现你的目标,你只需要设定非常基本的规则:

class MySpider(CrawlSpider):
    name = 'example.com'
    allowed_domains = ['example.com']
    start_urls = ['http://www.example.com']

    rules = (
        # Extract and follow all links!
        Rule(LinkExtractor(callback='parse_item'), follow=True),
    )

    def parse_item(self, response):
        self.log('crawling'.format(response.url))
Run Code Online (Sandbox Code Playgroud)

上面的爬虫会抓取网站上每一个与 allowed_domains 匹配的 url,并回调到parse_item.
应该注意的是,默认情况下LinkeExtractor会忽略媒体页面(如 pdf、mp4 等)

为了扩展深度主题,scrapy 确实有深度限制设置,但默认设置为 0(又名无限深度)
https://doc.scrapy.org/en/0.9/topics/settings.html#depth-limit

# settings.py
DEPTH_LIMIT = 0
Run Code Online (Sandbox Code Playgroud)

默认情况下,scrapy 也会优先抓取深度,但如果您想要更快的覆盖广度优先,可能会改进:https: //doc.scrapy.org/en/0.9/topics/settings.html#depth-limit

# settings.py
SCHEDULER_ORDER = 'BFO'
Run Code Online (Sandbox Code Playgroud)