PythonによるWebスクレイピング[終了]


183

Webサイトから毎日の日の出/日の入り時刻を取得したいのですが。PythonでWebコンテンツをスクレイピングすることは可能ですか?使用されているモジュールは何ですか?チュートリアルはありますか?


3
Pythonには、ウェブスクレイピングのオプションがいくつかあります。同様の質問への回答として、ここでいくつかのオプションを列挙しました。
フィリッポ、

Python標準ライブラリの組み込みHTMLパーサーを使用しないのはなぜですか?確かに、非常に単純で頻度の低い(1日に1回だけ)タスクの場合、他のツールを検索する理由はほとんどありません。docs.python.org/2.7/library/htmlparser.html
ArtOfWarfare 2015

この投稿がこれに関して誰かに役立つことを願っています。初心者のための良いチュートリアル。samranga.blogspot.com/2015/08/web-scraping-beginner-python.html pythonでのWebスクレイピングに美しいスープPythonライブラリを使用します。
Samitha Chathuranga

回答:


187

鮮やかなBeautifulSoupライブラリと組み合わせてurllib2を使用します。

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行目を次のように置き換えることにより、requestsパッケージを使用してこれをわずかに簡略化できます。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 2014

62

私は本当にスクレイピーをお勧めします。

削除された回答からの引用:

  • (Twistedの上に)非同期操作を使用するため、スクレイピークロールはmechanizeよりも高速です。
  • Scrapyは、libxml2に加えて(x)htmlを解析するためのより優れた最速のサポートを備えています。
  • Scrapyは完全なUnicodeを備えた成熟したフレームワークであり、リダイレクト、gzip圧縮された応答、奇数のエンコーディング、統合されたhttpキャッシュなどを処理します。
  • Scrapyに入ると、5分未満でスパイダーを作成して画像をダウンロードし、サムネイルを作成して、抽出したデータを直接csvまたはjsonにエクスポートできます。

13
私はこの質問がすでに2歳であることに気づきませんでしたが、他の誰かが同じ質問をしている場合に備えて、Scrapyはここに名前を付ける必要があると感じています。
Sjaak Trekhaak

4
Scrapyはフレームワークであるため、恐ろしく、プロジェクトよりも重要だと考えています。Twistedの恐ろしい(不要な)制限のため、フレームワークです。
user1244215 2012

4
@ user1244215:フレームワークは素晴らしいので、フレームワークです。フレームワークとして使用したくない場合は、すべてのコードを1つのファイルに詰め込むことを妨げるものは何もありません。
Blender 2013

1
ただし、Python 3.xはサポートされていません。

17

私はWebスクレイピング作業のスクリプトをこのビットバケットライブラリにまとめました。

あなたのケースのスクリプト例:

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リクエストを作成すると、Webコンテンツが作成されます。

あなたはこのようにそれを得ることができます:

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

Beautiful Soupは、画面のスクレイピングに適しているはずのPython HTMLパーサーです。

特に、ここでは、HTML文書を解析する上でのチュートリアルです。

幸運を!


読み込まれるバイト数に最大値を設定するのもいいかもしれません。response.read(100000000)などのISOのURLでRAMがいっぱいにならないようにします。ハッピーマイニング。
andrew pate 2015年

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 Selectorsますが、HTML内のデータをスクレイピングするために使用したい

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

これがシンプルなWebクローラーです。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

Pythonには、ウェブをこするための優れたオプションがあります。フレームワークで最高のものは、スクレイピーです。初心者には少し注意が必要な場合があるので、ここで少し手助けします。
1. 3.5以上のpythonをインストールします(2.7までの下位のものは動作します)。
2. condaで環境を作成します(これを行いました)。
3.場所にスクレイピーをインストールし、そこから実行します。
4. Scrapy shellコードをテストするためのインタラクティブなインターフェースを提供します。
5. Scrapy startproject projectnameフレームワークを作成します。
6. Scrapy genspider spidernameクモを作成します。クモは好きなだけ作成できます。これを行う間、プロジェクトディレクトリ内にいることを確認してください。


簡単なのは、リクエスト美しいスープを使うことです。開始する前に、1時間の時間をかけてドキュメントに目を通すことで、疑問のほとんどが解決されます。BS4は、ユーザーが選択できる幅広いパーサーを提供します。user-agentsleepを使用すると、削り取りが簡単になります。BS4はbs.tagを返すので、を使用しますvariable[0]。実行中のjsがある場合、リクエストとbs4を直接使用してスクレイピングすることはできません。APIリンクを取得してからJSONを解析し、必要な情報を取得するか、試しseleniumます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.