파이썬을 이용한 웹 스크랩 핑


183

웹 사이트에서 매일 일출 / 일몰 시간을 가져오고 싶습니다. 파이썬으로 웹 컨텐츠를 긁을 수 있습니까? 사용되는 모듈은 무엇입니까? 사용 가능한 자습서가 있습니까?


3
파이썬에는 웹 스크랩을위한 몇 가지 옵션이 있습니다. 비슷한 질문에 대한 응답으로 여기 에 몇 가지 옵션을 열거했습니다 .
filippo

왜 파이썬 표준 라이브러리에서 내장 HTML 파서를 사용하지 않습니까? 확실히 간단하고 자주 수행되지 않는 작업 (하루에 한 번)에 대해서는 다른 도구를 검색 할 이유가 거의 없습니다. docs.python.org/2.7/library/htmlparser.html
ArtOfWarfare

이 게시물이 이것에 관해 누군가에게 유용 할 수 있기를 바랍니다. 초보자를위한 좋은 튜토리얼. samranga.blogspot.com/2015/08/web-scraping-beginner-python.html 파이썬으로 웹 스크래핑을 위해 아름다운 수프 파이썬 라이브러리를 사용합니다.
Samitha Chathuranga

답변:


187

urllib2를 화려한 BeautifulSoup 라이브러리 와 함께 사용하십시오 :

import urllib2
from BeautifulSoup import BeautifulSoup
# or if you're using BeautifulSoup4:
# from bs4 import BeautifulSoup

soup = BeautifulSoup(urllib2.urlopen('http://example.com').read())

for row in soup('table', {'class': 'spad'})[0].tbody('tr'):
    tds = row('td')
    print tds[0].string, tds[1].string
    # will print date and sunrise

7
작은 의견 : 이것은 라인 6을 다음과 같이 바꾸어 요청 패키지를 사용하여 약간 단순화 할 수 있습니다 : soup = BeautifulSoup (requests.get ( ' example.com'). text )
D Coetzee

4
팁 고마워. 위의 스 니펫을 쓸 때 요청 패키지가 아직 존재하지 않습니다. ;-)

1
@DerrickCoetzee-단순화하면 MissingSchema 오류가 발생합니다 (적어도 설치시). soup = BeautifulSoup(requests.get('http://example.com').text)
kmote

@ kmote : 그것은 내가 입력 한 것이지만 backticks코드 주위를 잊어 버렸고 링크로 변환했습니다. 감사!
D Coetzee

내용이 td와 tr에 있는지 어떻게 확신하십니까? 그것은 ul과 li에있을 수 있습니까?
Shashank Hegde

62

Scrapy를 추천합니다.

삭제 된 답변에서 인용 :

  • Scrapy 크롤링은 비동기 작업 (Twisted의 상단)을 사용하기 때문에 기계화보다 빠릅니다.
  • Scrapy는 libxml2를 기반으로 구문 분석 (x) html을보다 빠르고 효과적으로 지원합니다.
  • Scrapy는 완전한 유니 코드를 가진 성숙한 프레임 워크이며, 리디렉션, gzip 응답, 홀수 인코딩, 통합 http 캐시 등을 처리합니다.
  • Scrapy에 들어가면 5 분 이내에 스파이더를 작성하여 이미지를 다운로드하고 썸네일을 생성하며 추출 된 데이터를 csv 또는 json으로 직접 내보낼 수 있습니다.

13
나는이 질문이 이미 2 살이라는 것을 알지 못했지만 다른 사람이 같은 질문을하고있는 경우 Scrapy를 여기에 지명해야한다고 생각합니다.
Sjaak Trekhaak

4
Scrapy는 프레임 워크이므로 끔찍하며 프로젝트보다 중요하다고 생각합니다. 그것은 Twisted의 끔찍한 (불필요한) 한계로 인한 프레임 워크입니다.
user1244215

4
@ user1244215 : 프레임 워크가 좋기 때문에 프레임 워크입니다. 프레임 워크로 사용하지 않으려는 경우 모든 코드를 하나의 파일로 방해하지 않아도됩니다.
Blender

1
그러나 Python 3.x는 지원하지 않습니다.

17

웹 스크래핑 작업에서이 비트 버킷 라이브러리 로 스크립트를 수집했습니다 .

귀하의 경우에 대한 예제 스크립트 :

from webscraping import download, xpath
D = download.Download()

html = D.get('http://example.com')
for row in xpath.search(html, '//table[@class="spad"]/tbody/tr'):
    cols = xpath.search(row, '/td')
    print 'Sunrise: %s, Sunset: %s' % (cols[1], cols[2])

산출:

Sunrise: 08:39, Sunset: 16:08
Sunrise: 08:39, Sunset: 16:09
Sunrise: 08:39, Sunset: 16:10
Sunrise: 08:40, Sunset: 16:10
Sunrise: 08:40, Sunset: 16:11
Sunrise: 08:40, Sunset: 16:12
Sunrise: 08:40, Sunset: 16:13

10

pyquery 확인하는 것이 좋습니다 . jquery와 같은 (일명 CSS와 같은) 구문을 사용하여 해당 배경에서 오는 사람들이 실제로 쉽게 할 수 있습니다.

귀하의 경우 다음과 같습니다.

from pyquery import *

html = PyQuery(url='http://www.example.com/')
trs = html('table.spad tbody tr')

for tr in trs:
  tds = tr.getchildren()
  print tds[1].text, tds[2].text

산출:

5:16 AM 9:28 PM
5:15 AM 9:30 PM
5:13 AM 9:31 PM
5:12 AM 9:33 PM
5:11 AM 9:34 PM
5:10 AM 9:35 PM
5:09 AM 9:37 PM

7

당신은 사용할 수 있습니다 urllib2가 HTTP 요청을하고, 당신은 웹 컨텐츠를해야합니다.

다음과 같이 얻을 수 있습니다.

import urllib2
response = urllib2.urlopen('http://example.com')
html = response.read()

Beautiful Soup 은 화면 스크래핑에 좋은 파이썬 HTML 파서입니다.

특히 다음 은 HTML 문서를 파싱하는 방법에 대한 튜토리얼입니다.

행운을 빕니다!


읽은 바이트의 최대 값을 설정하는 것이 좋습니다. response.read (100000000) 또는 ISO에 대한 해당 URL이 RAM을 채우지 않도록하는 것입니다. 행복한 채굴.
앤드류 페이트

4

Scrapemark (URL 찾기-py2)와 httlib2 (이미지 다운로드-py2 + 3) 의 조합을 사용합니다 . scrapemark.py에는 500 줄의 코드가 있지만 정규 표현식을 사용하므로 테스트가 빠르지 않을 수도 있습니다.

웹 사이트 스크랩 예 :

import sys
from pprint import pprint
from scrapemark import scrape

pprint(scrape("""
    <table class="spad">
        <tbody>
            {*
                <tr>
                    <td>{{[].day}}</td>
                    <td>{{[].sunrise}}</td>
                    <td>{{[].sunset}}</td>
                    {# ... #}
                </tr>
            *}
        </tbody>
    </table>
""", url=sys.argv[1] ))

용법:

python2 sunscraper.py http://www.example.com/

결과:

[{'day': u'1. Dez 2012', 'sunrise': u'08:18', 'sunset': u'16:10'},
 {'day': u'2. Dez 2012', 'sunrise': u'08:19', 'sunset': u'16:10'},
 {'day': u'3. Dez 2012', 'sunrise': u'08:21', 'sunset': u'16:09'},
 {'day': u'4. Dez 2012', 'sunrise': u'08:22', 'sunset': u'16:09'},
 {'day': u'5. Dez 2012', 'sunrise': u'08:23', 'sunset': u'16:08'},
 {'day': u'6. Dez 2012', 'sunrise': u'08:25', 'sunset': u'16:08'},
 {'day': u'7. Dez 2012', 'sunrise': u'08:26', 'sunset': u'16:07'}]

1

사용하여 인생을 더 쉽게 CSS Selectors

파티에 늦었다는 걸 알고 있지만 좋은 제안이 있습니다.

사용은 BeautifulSoup이미 차라리 사용하여 선호 제안되어있다 CSS SelectorsHTML 내부에 스크랩 데이터에

import urllib2
from bs4 import BeautifulSoup

main_url = "http://www.example.com"

main_page_html  = tryAgain(main_url)
main_page_soup = BeautifulSoup(main_page_html)

# Scrape all TDs from TRs inside Table
for tr in main_page_soup.select("table.class_of_table"):
   for td in tr.select("td#id"):
       print(td.text)
       # For acnhors inside TD
       print(td.select("a")[0].text)
       # Value of Href attribute
       print(td.select("a")[0]["href"])

# This is method that scrape URL and if it doesnt get scraped, waits for 20 seconds and then tries again. (I use it because my internet connection sometimes get disconnects)
def tryAgain(passed_url):
    try:
        page  = requests.get(passed_url,headers = random.choice(header), timeout = timeout_time).text
        return page
    except Exception:
        while 1:
            print("Trying again the URL:")
            print(passed_url)
            try:
                page  = requests.get(passed_url,headers = random.choice(header), timeout = timeout_time).text
                print("-------------------------------------")
                print("---- URL was successfully scraped ---")
                print("-------------------------------------")
                return page
            except Exception:
                time.sleep(20)
                continue 

1

특정 범주에서 항목 이름을 가져 오려는 경우 css 선택기를 사용하여 해당 범주의 클래스 이름을 지정하면됩니다.

import requests ; from bs4 import BeautifulSoup

soup = BeautifulSoup(requests.get('https://www.flipkart.com/').text, "lxml")
for link in soup.select('div._2kSfQ4'):
    print(link.text)

부분 검색 결과입니다.

Puma, USPA, Adidas & moreUp to 70% OffMen's Shoes
Shirts, T-Shirts...Under ₹599For Men
Nike, UCB, Adidas & moreUnder ₹999Men's Sandals, Slippers
Philips & moreStarting 99LED Bulbs & Emergency Lights

0

다음은 간단한 웹 크롤러입니다. BeautifulSoup을 사용했으며 클래스 이름이 _3NFO0d 인 모든 링크 (앵커)를 검색합니다. Flipkar.com을 사용했는데 온라인 소매점입니다.

import requests
from bs4 import BeautifulSoup
def crawl_flipkart():
    url = 'https://www.flipkart.com/'
    source_code = requests.get(url)
    plain_text = source_code.text
    soup = BeautifulSoup(plain_text, "lxml")
    for link in soup.findAll('a', {'class': '_3NFO0d'}):
        href = link.get('href')
        print(href)

crawl_flipkart()

0

파이썬에는 웹을 긁어내는 좋은 옵션이 있습니다. 프레임 워크와 가장 좋은 일이다 scrapy . 초보자에게는 약간 까다로울 수 있으므로 여기에 약간의 도움이 있습니다.
1. 3.5 이상의 파이썬을 설치하십시오 (2.7까지는 작동합니다).
2. conda에서 환경을 만듭니다 (이 작업을 수행했습니다).
3. 특정 위치에 scrapy를 설치하고 거기에서 실행하십시오.
4. Scrapy shell코드 테스트를위한 대화식 인터페이스를 제공합니다.
5. Scrapy startproject projectname프레임 워크를 만듭니다.
6. Scrapy genspider spidername거미를 만듭니다. 원하는만큼 거미를 만들 수 있습니다. 이 작업을 수행하는 동안 프로젝트 디렉토리 안에 있는지 확인하십시오.


가장 쉬운 방법은 요청아름다운 수프 를 사용하는 것 입니다. 시작하기 전에 한 시간 동안 문서를 살펴보면 대부분의 의심을 해결할 것입니다. BS4는 사용자가 선택할 수있는 광범위한 파서를 제공합니다. 사용 user-agent하고 sleep쉽게된다고 할 수 있습니다. BS4는 bs.tag를 반환하므로을 사용하십시오 variable[0]. js가 실행 중이면 요청과 bs4를 사용하여 직접 긁을 수 없습니다. api 링크를 얻은 다음 JSON을 구문 분석하여 필요한 정보를 얻거나 시도하십시오 selenium.

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