【问题标题】:Scrapy get all links from any websiteScrapy 从任何网站获取所有链接
【发布时间】:2018-02-23 11:01:22
【问题描述】:

我在 Python 3 中有以下网络爬虫代码:

import requests
from bs4 import BeautifulSoup
import re

def get_links(link):

    return_links = []

    r = requests.get(link)

    soup = BeautifulSoup(r.content, "lxml")

    if r.status_code != 200:
        print("Error. Something is wrong here")
    else:
        for link in soup.findAll('a', attrs={'href': re.compile("^http")}):
            return_links.append(link.get('href')))

def recursive_search(links)
    for i in links:
        links.append(get_links(i))
    recursive_search(links)


recursive_search(get_links("https://www.brandonskerritt.github.io"))

代码基本上从我的 GitHub pages 网站上获取所有链接,然后从这些链接中获取所有链接,依此类推,直到时间结束或发生错误。

我想在 Scrapy 中重新创建这段代码,这样它就可以服从 robots.txt 并成为一个整体上更好的网络爬虫。我在网上研究过,我只能找到关于如何抓取特定域的教程/指南/stackoverflow/quora/博客文章(例如,allowed_domains=["google.com"])。我不想这样做。我想创建递归抓取所有网站的代码。

这不是什么大问题,但所有的博客文章等都只显示了如何从特定网站获取链接(例如,他的链接可能在列表标签​​中)。我上面的代码适用于所有锚标签,无论它在哪个网站上运行。

我不想在野外使用它,我需要它用于演示目的,所以我不会突然因为过度的网络抓取而惹恼每个人。

任何帮助将不胜感激!

【问题讨论】:

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


    【解决方案1】:

    scrapy 指南有一整节专门针对broad crawls。我建议您细化设置以成功完成此操作。

    为了在scrapy中重建你需要的行为,你必须

    • 在您的页面中设置您的起始网址。
    • 编写一个解析函数,跟踪所有链接并递归调用自身,将请求的 url 添加到蜘蛛变量

    一个未经测试的例子(当然可以改进):

    class AllSpider(scrapy.Spider):
        name = 'all'
    
        start_urls = ['https://yourgithub.com']
    
        def __init__(self):
            self.links=[]
    
        def parse(self, response):
            self.links.append(response.url)
            for href in response.css('a::attr(href)'):
                yield response.follow(href, self.parse)
    

    【讨论】:

      【解决方案2】:

      如果您想允许抓取所有域,只需不要指定allowed_domains,而是使用提取所有链接的LinkExtractor。

      一个跟踪所有链接的简单蜘蛛:

      class FollowAllSpider(CrawlSpider):
          name = 'follow_all'
      
          start_urls = ['https://example.com']
          rules = [Rule(LinkExtractor(), callback='parse_item', follow=True)]
      
          def parse_item(self, response):
              pass
      

      【讨论】:

      • 当我添加deny_extensions=[]时,我有一个包含4个pdf链接的页面,为什么它只返回一个链接?
      猜你喜欢
      • 1970-01-01
      • 2021-09-20
      • 2013-10-04
      • 2023-03-03
      • 2021-08-19
      • 1970-01-01
      • 2014-08-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多