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/<항목 이름>이며, 페이지의 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 중국어 웹사이트를 주목하세요!