ホームページ >バックエンド開発 >Python チュートリアル >PythonクローラーパッケージBeautifulSoupの再帰的クローリング例の詳細説明

PythonクローラーパッケージBeautifulSoupの再帰的クローリング例の詳細説明

高洛峰
高洛峰オリジナル
2017-02-03 15:59:292338ブラウズ

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 サイトに注目してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。