web-dev-qa-db-ja.com

Scrapyは任意のWebサイトからすべてのリンクを取得します

Python 3:にWebクローラー用の次のコードがあります

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 Webサイトからすべてのリンクを取得し、その後、時間の終わりまたはエラーが発生するまで、それらのリンクからすべてのリンクを取得します。

このコードをScrapyで再作成して、robots.txtに準拠し、全体的に優れたWebクローラーになるようにします。私はオンラインで調査しましたが、特定のドメイン(allowed_domains = ["google.com"]など)をスクレイプする方法についてのチュートリアル/ガイド/ stackoverflow/quora /ブログの投稿しか見つかりません。私はこれをしたくありません。すべてのWebサイトを再帰的にスクレイプするコードを作成したいと思います。

これはそれほど問題ではありませんが、すべてのブログ投稿などは、特定のWebサイトからリンクを取得する方法のみを示しています(たとえば、リンクがリストタグに含まれている可能性があります)。上記のコードは、実行されているWebサイトに関係なく、すべてのアンカータグで機能します。

私はこれを実際に使用したくありません。デモンストレーションの目的で必要なので、過度のWebクロールで突然すべての人を悩ませることはありません。

どんな助けでも大歓迎です!

5

すべてのドメインのクロールを許可する場合は、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
2
stranac

ブロードクロール 専用のスクレイプガイドのセクション全体があります。これを成功させるために、設定をきめ細かくすることをお勧めします。

スクレイプで必要な動作を再現するには、

  • ページに開始URLを設定します。
  • すべてのリンクをたどり、それ自体を再帰的に呼び出す解析関数を記述し、要求された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)
0
Lore