Python クローラー パッケージ BeautifulSoup 再帰的クロールの例の詳細な説明
概要:
クローラーの主な目的は、ネットワークに沿って必要なコンテンツをクロールすることです。それらの本質は再帰的なプロセスです。まず Web ページのコンテンツを取得し、次にページ コンテンツを分析して別の URL を見つけ、次にこの URL のページ コンテンツを取得し、このプロセスを繰り返す必要があります。
ウィキペディアを例に見てみましょう。
Wikipedia の Kevin Bacon エントリ内の他のエントリを指すすべてのリンクを抽出したいと考えています。
# -*- coding: utf-8 -*- # @Author: HaonanWu # @Date: 2016-12-25 10:35:00 # @Last Modified by: HaonanWu # @Last Modified time: 2016-12-25 10:52:26 from urllib2 import urlopen from bs4 import BeautifulSoup html = urlopen('http://en.wikipedia.org/wiki/Kevin_Bacon') bsObj = BeautifulSoup(html, "html.parser") for link in bsObj.findAll("a"): if 'href' in link.attrs: print link.attrs['href']
上記のコードは、ページ上のすべてのハイパーリンクを抽出できます。
/wiki/Wikipedia:Protection_policy#semi #mw-head #p-search /wiki/Kevin_Bacon_(disambiguation) /wiki/File:Kevin_Bacon_SDCC_2014.jpg /wiki/San_Diego_Comic-Con /wiki/Philadelphia /wiki/Pennsylvania /wiki/Kyra_Sedgwick
まず第一に、抽出された URL にはいくつかの重複が含まれる可能性があります
次に、サイドバー、ヘッダー、フッター、ディレクトリ バーのリンクなど、必要のない URL がいくつかあります。
観察を通じて、エントリページを指すすべてのリンクには 3 つの特徴があることがわかります:
それらはすべて bodyContent の ID を持つ div タグ内にあります
URL リンクにはコロンが含まれていません
URL リンクはすべて / で始まりますwiki/ 先頭の相対パス (http から始まる完全な絶対パスにもクロールされます)
from urllib2 import urlopen from bs4 import BeautifulSoup import datetime import random import re pages = set() random.seed(datetime.datetime.now()) def getLinks(articleUrl): html = urlopen("http://en.wikipedia.org"+articleUrl) bsObj = BeautifulSoup(html, "html.parser") return bsObj.find("div", {"id":"bodyContent"}).findAll("a", href=re.compile("^(/wiki/)((?!:).)*$")) links = getLinks("/wiki/Kevin_Bacon") while len(links) > 0: newArticle = links[random.randint(0, len(links)-1)].attrs["href"] if newArticle not in pages: print(newArticle) pages.add(newArticle) links = getLinks(newArticle)
getLinks のパラメータは /wiki/<エントリ名> であり、 の絶対パスとマージされます。 Wikipedia ページの URL を取得します。正規表現を通じて他の用語を指すすべての URL をキャプチャし、メイン関数に返します。
メイン関数は再帰的な getlinks を呼び出し、エントリがなくなるかアクティブに停止するまで、未訪問の URL にランダムにアクセスします。
このコードは Wikipedia 全体をクロールできます
from urllib.request import urlopen from bs4 import BeautifulSoup import re pages = set() def getLinks(pageUrl): global pages html = urlopen("http://en.wikipedia.org"+pageUrl) bsObj = BeautifulSoup(html, "html.parser") try: print(bsObj.h1.get_text()) print(bsObj.find(id ="mw-content-text").findAll("p")[0]) print(bsObj.find(id="ca-edit").find("span").find("a").attrs['href']) except AttributeError: print("This page is missing something! No worries though!") for link in bsObj.findAll("a", href=re.compile("^(/wiki/)")): if 'href' in link.attrs: if link.attrs['href'] not in pages: #We have encountered a new page newPage = link.attrs['href'] print("----------------\n"+newPage) pages.add(newPage) getLinks(newPage) getLinks("")
一般的に言えば、Python の再帰制限は 1000 回であるため、人為的により大きな再帰カウンタを設定するか、他の手段を使用してコードを実行する必要があります。 1000回の反復後。
読んでいただきありがとうございます、皆さんのお役に立てれば幸いです、このサイトをサポートしていただきありがとうございます!
Python クローラー パッケージ BeautifulSoup の再帰的クロールの例と関連記事の詳細については、PHP 中国語 Web サイトに注目してください。