HTML 스크래핑 옵션? [닫은]


406

HTML 스크래핑을위한 Python 패키지 인 Beautiful Soup 을 시도하고 있습니다. 살펴 봐야 할 다른 HTML 스크래핑 패키지가 있습니까? 파이썬은 요구 사항이 아니며 실제로 다른 언어에 대해서도 듣고 싶습니다.

지금까지의 이야기:



태그 수프 연결이 끊어졌습니다.
Tapper7

HtmlUnit은 완전한 Java 브라우저 구현으로, 부분으로 분리 할 수 ​​없습니다 ( html 페이지 다운로드 하여 스크랩 할 수 없으며 참조 된 모든 파일을 다운로드하고 스크립트를 실행하는 등). 따라서 나는 그것이 여기에 속한다고 생각하지 않습니다.
Mark Jeronimus

Stock Java는 XPath 표현식으로 HTML을 사용할 수 있지만 문제는 없습니다. 파서 부분 (DocumentBuilder)은 잘못된 HTML을 질식시키고 100 % 정확한 HTML은 실제로 웹에서는 매우 드 rare니다. 따라서 파서를 JTidy 로 바꾸고 싶습니다 . XPath는 Java XPathExpression1.5부터 존재하는 Java 자체를 사용할 수 있습니다
Mark Jeronimus

답변:



44

.NET 세계에서는 HTML Agility Pack을 권장합니다. 위의 옵션 중 일부 (HTMLSQL과 같은)만큼 단순하지는 않지만 매우 유연합니다. 제대로 구성된 XML 인 것처럼 잘못 구성된 HTML을 조작 할 수 있으므로 XPATH를 사용하거나 노드를 반복 할 수 있습니다.

http://www.codeplex.com/htmlagilitypack


2
linq와 결합하면 HTMLSQL과 비슷해 보입니다.
축복 야후

3
그것과 SharpQuery를 결합하면 jQuery와 같습니다! code.google.com/p/sharp-query
mpen

1
HTML Agility Pack이 시도한 많은 HTML 문서에 대한 DOM을 올바르게 구성하지 못합니다.
Ash Berlin-Taylor

37

BeautifulSoup은 HTML 스크래핑을위한 좋은 방법입니다. 저의 이전 직업은 많은 긁기 작업을했고 시작했을 때 BeautifulSoup에 대해 알고 싶습니다. 훨씬 더 유용한 옵션을 가진 DOM과 같으며 훨씬 더 파이썬입니다. Ruby를 사용하려면 BeautifulSoup을 RubyfulSoup이라고 포팅했지만 한동안 업데이트되지 않았습니다.

다른 유용한 도구로는 표준 Python 라이브러리의 일부인 HTMLParser 또는 sgmllib.SGMLParser가 있습니다. 태그를 입력 / 종료하고 html 텍스트가 나타날 때마다 메소드를 호출하여 작동합니다. 익숙하다면 해외 거주자와 같습니다. 이 라이브러리는 매우 큰 파일을 구문 분석하고 DOM 트리를 작성하는 것이 길고 비용이 많이 드는 경우에 특히 유용합니다.

정규 표현식은 그다지 필요하지 않습니다. BeautifulSoup은 정규 표현식을 처리하므로 힘이 필요하면 거기서 사용할 수 있습니다. 속도와 더 작은 메모리 공간이 필요하지 않으면 BeautifulSoup을 사용한다고 말합니다. 파이썬에서 더 나은 HTML 파서를 찾으면 알려주십시오.


21

HTMLSQL을 찾았 습니다 이 엄청나게 간단한 스크린 방법이라는 습니다. 결과를 얻는 데 문자 그대로 몇 분이 걸립니다.

쿼리는 다음과 같이 직관적입니다.

SELECT title from img WHERE $class == 'userpic'

동일한 접근법을 취하는 다른 대안이 있습니다.


7
참고로, 이것은 PHP 라이브러리입니다
Tristan Havelick

19

Python lxml 라이브러리는 libxml2 및 libxslt 라이브러리에 대한 Pythonic 바인딩 역할을합니다. 특히 XPath 지원과 메모리 내 XML 구조의 인쇄가 마음에 듭니다. 또한 깨진 HTML 구문 분석을 지원합니다. 그리고 lxml보다 XML을 더 빨리 구문 분석하는 다른 Python 라이브러리 / 바인딩을 찾을 수 없다고 생각합니다.



16

Python에는 Beatiful Soup 외에도 HTML 스크랩에 대한 몇 가지 옵션이 있습니다. 여기 다른 것들이 있습니다 :

  • 기계화 : perl과 유사합니다 WWW:Mechanize. 웹 페이지와 무관 한 객체와 같은 브라우저를 제공합니다
  • lxml :에 대한 파이썬 바인딩 libwww. 요소를 탐색하고 선택할 수있는 다양한 옵션 지원 (예 : XPath 및 CSS 선택)
  • scrapemark : 템플릿을 사용하여 HTML에서 정보를 추출하는 고급 라이브러리.
  • pyquery : XML 문서에서 jQuery와 같은 쿼리를 만들 수 있습니다.
  • scrapy : 고급 스크래핑 및 웹 크롤링 프레임 워크 스파이더 작성, 데이터 마이닝 및 모니터링 및 자동화 된 테스트에 사용될 수 있습니다.

1
파이썬 표준 라이브러리에는 HTML 파서가 내장되어 있습니다. 왜 이것을 사용하지 않습니까? docs.python.org/2.7/library/htmlparser.html
ArtOfWarfare



11

Django 명성 의 Adrian Holovaty 의 templatemaker 유틸리티 는 매우 흥미로운 접근 방식을 사용합니다. 동일한 페이지의 변형을 제공하고 변수 데이터의 "구멍"이있는 곳에서 "학습"합니다. HTML에 국한되지 않으므로 다른 일반 텍스트 내용을 스크랩하는 데 좋습니다. 또한 일반 텍스트로 변환 된 PDF 및 HTML (각각 pdftotext 및 lynx 포함)에도 사용했습니다.


큰 HTML 페이지에서 템플릿 제작자를 어떻게 사용하게 되었습니까? 사소한 것을 줄 때 충돌이 발생했습니다.
hoju

큰 HTML 페이지가 없다고 가정합니다. code.google.com/p/templatemaker/issues/list 에 해당 문제에 대해 제기 된 문제가없는 것 같으므로 테스트 사례를 보내는 것이 좋습니다. Adrian이 라이브러리를 유지 관리하는 것처럼 보이지 않습니다. 나는 그가 매일 많은 스크래핑을하기 때문에 그가 EveryBlock에서 무엇을 사용하는지 궁금합니다.
akaihola 2019

10

나는 Screen-Scraper를 알고 사랑 합니다.

스크린 스크레이퍼는 웹 사이트에서 데이터를 추출하는 도구입니다. 스크린 스크레이퍼는 다음을 자동화합니다.

* Clicking links on websites
* Entering data into forms and submitting
* Iterating through search result pages
* Downloading files (PDF, MS Word, images, etc.)

일반적인 용도 :

* Download all products, records from a website
* Build a shopping comparison site
* Perform market research
* Integrate or migrate data

인위적인:

* Graphical interface--easy automation
* Cross platform (Linux, Mac, Windows, etc.)
* Integrates with most programming languages (Java, PHP, .NET, ASP, Ruby, etc.)
* Runs on workstations or servers

스크린 스크레이퍼의 세 가지 버전 :

* Enterprise: The most feature-rich edition of screen-scraper. All capabilities are enabled.
* Professional: Designed to be capable of handling most common scraping projects.
* Basic: Works great for simple projects, but not nearly as many features as its two older brothers.

불행히도 기본 버전조차 FOSS가 아닙니다. 맥주처럼 무료 인 것 같습니다.
Andreas Kuckartz

9

먼저 문제의 사이트가 필요한 데이터에 액세스하기 위해 API 서버 또는 RSS 피드를 제공하는지 확인합니다.


8

Scraping Stack Overflow는 ShoesHpricot에서 특히 쉽습니다 .

require 'hpricot'

Shoes.app :title => "Ask Stack Overflow", :width => 370 do
  SO_URL = "http://stackoverflow.com"
  stack do
    stack do
      caption "What is your question?"
      flow do
        @lookup = edit_line "stackoverflow", :width => "-115px"
        button "Ask", :width => "90px" do
          download SO_URL + "/search?s=" + @lookup.text do |s|
            doc = Hpricot(s.response.body)
            @rez.clear()
            (doc/:a).each do |l|
              href = l["href"]
              if href.to_s =~ /\/questions\/[0-9]+/ then
                @rez.append do
                  para(link(l.inner_text) { visit(SO_URL + href) })
                end
              end
            end
            @rez.show()
          end
        end
      end
    end
    stack :margin => 25 do
      background white, :radius => 20
      @rez = stack do
      end
    end
    @rez.hide()
  end
end

8

Perl의 또 다른 옵션은 Ruby의 Scrapi를 기반으로하는 Web :: Scraper 입니다 . 간단하고 훌륭하고 간결한 구문으로 강력한 스크레이퍼를 데이터 구조로 직접 가져올 수 있습니다.


7

Java에서 HtmlUnit으로 약간의 성공을 거두었습니다 . 웹 UI에서 단위 테스트를 작성하기위한 간단한 프레임 워크이지만 HTML 스크래핑에도 유용합니다.


필요하다면 자바 스크립트 실행을 평가하는 데 사용할 수도 있습니다. :
David




5

루비에서 Hpricot을 사용합니다. 예를 들어 이것은 HireThings 계정의 6 페이지에서 모든 책 제목을 검색하는 데 사용하는 코드 스 니펫입니다 (이 정보가 포함 된 단일 페이지를 제공하지 않는 것 같습니다).

pagerange = 1..6
proxy = Net::HTTP::Proxy(proxy, port, user, pwd)
proxy.start('www.hirethings.co.nz') do |http|
  pagerange.each do |page|
    resp, data = http.get "/perth_dotnet?page=#{page}" 
    if resp.class == Net::HTTPOK
      (Hpricot(data)/"h3 a").each { |a| puts a.innerText }
    end
  end
end 

거의 완성되었습니다. 이 앞에 오는 것은 라이브러리 가져 오기 및 프록시 설정입니다.


5

나는 Beautiful Soup을 파이썬과 함께 많이 사용했습니다. HTML의 형식이 잘못되어 있어도 DOM을 사용하는 것처럼 작동하기 때문에 정규식 검사보다 훨씬 낫습니다 . 정규식보다 간단한 구문으로 HTML 태그와 텍스트를 빠르게 찾을 수 있습니다. 요소를 찾으면 해당 요소와 해당 하위 요소를 반복하여 정규식보다 코드의 내용을 이해하는 데 더 유용합니다. 몇 년 전에 스크린 스크래핑을 많이해야했던 Beautiful Soup이 있었으면 좋겠습니다. 사람들이 그것을 검증하기 전에 HTML 구조가 너무 열악했기 때문에 많은 시간과 두통을 아끼지 않았을 것입니다.


5

.NET 웹 테스트 용으로 설계되었지만 이 목적으로 WatiN 프레임 워크를 사용하고 있습니다. DOM 기반이기 때문에 HTML, 텍스트 또는 이미지를 쉽게 캡처 할 수 있습니다. 최근에는 MediaWiki All Pages 네임 스페이스 쿼리에서 Excel 스프레드 시트로 링크 목록을 덤프하는 데 사용했습니다 . 다음 VB.NET 코드 조각은 매우 조잡하지만 작동합니다.


Sub GetLinks(ByVal PagesIE As IE, ByVal MyWorkSheet As Excel.Worksheet)

    Dim PagesLink As Link
    For Each PagesLink In PagesIE.TableBodies(2).Links
        With MyWorkSheet
            .Cells(XLRowCounterInt, 1) = PagesLink.Text
            .Cells(XLRowCounterInt, 2) = PagesLink.Url
        End With
        XLRowCounterInt = XLRowCounterInt + 1
    Next
End Sub


3

당신은 펄을 사용하지 않는 바보가 될 것입니다. 여기 불꽃이옵니다 ..

다음 모듈을 골라 긁어 모으십시오.

use LWP
use HTML::TableExtract
use HTML::TreeBuilder
use HTML::Form
use Data::Dumper

3

나는 LWPHTML :: TreeBuilder 를 Perl과 함께 사용 했고 그것들이 매우 유용하다는 것을 알았다.

LWP (libwww-perl의 줄임말)를 사용하면 웹 사이트에 연결하고 HTML을 긁을 수 있습니다. 여기에서 모듈을 얻을 수 있으며 O'Reilly 책 은 온라인 상태 인 것 같습니다 .

TreeBuilder를 사용하면 HTML에서 트리를 구성 할 수 있으며 HTML 구문 트리를 작성하는 HTML :: TreeBuilder-Parser 에서 문서와 소스를 사용할 수 있습니다 .

그래도이 방법과 관련하여 너무 많은 노력이 필요할 수 있습니다. 다른 답변에서 제안한 Mechanize 모듈을 보지 않았 으므로 잘 수행 할 수 있습니다.



3

브라우저 만 사용하여 클라이언트 측에서 수행하려면 jcrawl.com이 있습니다. 웹 응용 프로그램 ( http://www.jcrawl.com/app.html ) 에서 스크랩 핑 서비스를 설계 한 후 생성 된 스크립트를 HTML 페이지에 추가하기 만하면 데이터를 사용 / 표시 할 수 있습니다.

모든 폐기 로직은 JavaScript를 통해 브라우저에서 발생합니다. 도움이 되셨기를 바랍니다. Yahoo 테니스에서 최신 뉴스 를 추출하는 라이브 예제를 보려면이 링크를 클릭하십시오 .


2

당신은 아마 이미 많은 것을 가지고 있지만, 이것이 당신이하려는 일이라고 생각합니다.

from __future__ import with_statement
import re, os

profile = ""

os.system('wget --no-cookies --header "Cookie: soba=(SeCreTCODe)" http://stackoverflow.com/users/30/myProfile.html')
with open("myProfile.html") as f:
    for line in f:
        profile = profile + line
f.close()
p = re.compile('summarycount">(\d+)</div>') #Rep is found here
print p
m = p.search(profile)
print m
print m.group(1)
os.system("espeak \"Rep is at " + m.group(1) + " points\""
os.remove("myProfile.html")


2

Google 스프레드 시트의 ImportXML (URL, XPath) 기능이 마음에 듭니다.

XPath 표현식이 둘 이상의 값을 리턴하면 열 아래로 셀을 반복합니다.

importxml()하나의 스프레드 시트에서 최대 50 개의 기능을 사용할 수 있습니다 .

RapidMiner의 웹 플러그인도 사용하기 매우 쉽습니다. 게시물을 작성하고 쿠키를 허용하며 user-agent를 설정할 수 있습니다 .


2

또한 Aptana의 Jaxer + jQuery를 사용하여 페이지를 구문 분석하는 데 큰 성공을 거두었습니다. 본질적으로 빠르거나 '스크립트 같은'것은 아니지만 jQuery 선택기 + 실제 JavaScript / DOM은 더 복잡한 (또는 잘못된) 페이지에서 생명의 은인입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.