>백엔드 개발 >파이썬 튜토리얼 >Python 크롤러 패키지 BeautifulSoup의 재귀 크롤링 예제에 대한 자세한 설명

Python 크롤러 패키지 BeautifulSoup의 재귀 크롤링 예제에 대한 자세한 설명

高洛峰
高洛峰원래의
2017-02-03 15:59:292338검색

Python 크롤러 패키지 BeautifulSoup 재귀 크롤링 예제에 대한 자세한 설명

요약:

크롤러의 주요 목적은 네트워크를 따라 필요한 콘텐츠를 크롤링하는 것입니다. 그들의 본질은 재귀적인 프로세스입니다. 먼저 웹페이지의 콘텐츠를 얻은 다음 페이지 콘텐츠를 분석하고 다른 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이 있을 수 있습니다.

둘째, 중복되지 않는 URL도 있습니다. 사이드바, 머리글, 바닥글, 디렉토리 표시줄 링크 등이 필요합니다.

관찰을 통해 항목 페이지를 가리키는 모든 링크에는 세 가지 특성이 있음을 알 수 있습니다.

이 링크는 모두 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/b8863e833f77301c5ec8fa4e9524723d이며, 페이지의 URL은 Wikipedia의 절대 경로와 병합되어 얻어집니다. 정규식을 통해 다른 용어를 가리키는 모든 URL을 캡처하여 기본 함수로 반환합니다.

주 함수는 재귀 getlink를 호출하고 더 이상 항목이 없거나 적극적으로 중지될 때까지 방문하지 않은 URL에 무작위로 액세스합니다.

이 코드는 위키피디아 전체를 크롤링할 수 있습니다

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회이므로 인위적으로 더 큰 재귀를 설정해야 합니다. 카운터를 사용하거나 다른 수단을 사용하여 1,000회 반복 후에도 코드가 계속 실행되도록 할 수 있습니다.

읽어주셔서 감사합니다. 도움이 되기를 바랍니다. 이 사이트를 지원해 주셔서 감사합니다!

더 많은 Python 크롤러 패키지 BeautifulSoup 재귀 크롤링 예제 및 관련 기사를 보려면 PHP 중국어 웹사이트를 주목하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.