【问题标题】:Using Scrapy to crawl all pages that are linked to a website with any depth we want使用 Scrapy 以我们想要的任何深度抓取链接到网站的所有页面
【发布时间】:2019-01-12 22:08:06
【问题描述】:

我很想知道是否有可能以任意深度抓取网站上的所有页面和链接,即使在跟踪几个链接后顶部 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 上吗?

它的深度有限制吗? 有没有代码示例告诉我如何做到这一点?

感谢您的帮助。

【问题讨论】:

    标签: python-3.x web-scraping scrapy web-crawler


    【解决方案1】:

    看看scrapy的CrawlSpider spider class

    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))
    

    上面的爬虫会爬取网站上每个匹配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
    

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

    # settings.py
    SCHEDULER_ORDER = 'BFO'
    

    【讨论】:

    • 感谢您的回复。这也能找到不在allowed_domains 上的链接吗?例如,正如我所解释的,如果我的 allowed_domains 是 www.topURL.com,代码是否可以找到 www.thirdURL.com/link1,然后查找并在那里找到所有链接的列表?
    • 不,但您可以删除允许的域或在其中添加 topURL 和 thirdURL。
    • 那么如果我删除允许的域,那么不会有任何限制吗?在这种情况下如何指定起始 URL?
    • 是的,如果您删除 allowed_domains,所有域都将被允许。您使用 start_urls 类变量指定起始 url :)
    • stackoverflow.com/questions/68193300/… 你能看看这里吗? @Granitosaurus
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-17
    • 1970-01-01
    • 2019-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多