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クロールで突然すべての人を悩ませることはありません。
どんな助けでも大歓迎です!
すべてのドメインのクロールを許可する場合は、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
ブロードクロール 専用のスクレイプガイドのセクション全体があります。これを成功させるために、設定をきめ細かくすることをお勧めします。
スクレイプで必要な動作を再現するには、
テストされていない例(もちろん、洗練されている可能性があります):
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)