web-dev-qa-db-ja.com

Pythonを使用したWebスクレイピング

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

177
3zzy

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
185
user235064

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

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

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

Webスクレイピング作業のスクリプトをまとめて、この bit-bucket library に集めました。

ケースのスクリプト例:

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
16
hoju

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
10
scottmrogowski

rllib2 を使用してHTTPリクエストを作成すると、Webコンテンツが得られます。

次のように取得できます。

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

Beautiful Soup は、スクリーンスクレイピングに適したpython HTMLパーサーです。

特に、 here はHTMLドキュメントの解析に関するチュートリアルです。

がんばろう!

7
danben

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'}]
4
Nils

Pycoder's WeeklyRoboBrowser を見ました。

RequestsとBeautifulSoupに基づいて構築されたWebスクレイピング用のライブラリ。 Mechanizeに似ていますが、テスト、ドキュメント、Pythonインターフェイスを備えています。

2
opyate

Scrapyオープンソースフレームワークは、PythonでのWebスクラップに役立ちます。このオープンソースおよびコラボレーションフレームワークは、Webサイトから必要なデータを抽出します。

Webスクレイピングは、ボットまたはWebクローラーを使用してWeb上の情報にインデックスを付けるWebインデックス作成と密接に関連しており、ほとんどの検索エンジンで採用されている普遍的な手法です。

Webスクレイピングの詳細

2
GowriShankar

CSS Selectorsを使用して生活を楽にします

私はパーティーに遅刻したことは知っていますが、あなたにいい提案があります。

BeautifulSoupの使用は既に提案されているので、HTML内のデータをスクレイピングするためにCSS Selectorsを使用することをお勧めします

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
Umair

この質問に対する新しい回答。 lxml は、PythonでWebスクレイピングを行うための好ましい方法として浮上しています。スクレイピーとは異なり、Twistedに依存していません。 Pythonへのヒッチハイカーのガイド によっても承認されています。

0
Harry Moreno

これは単純な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
Atul Chavan

特定のカテゴリからアイテムの名前を取得することを考えている場合は、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
SIM

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


より簡単な方法は、 requests および beautiful soup を使用することです。開始する前に、1時間かけてドキュメントを確認することで、ほとんどの疑問を解決できます。 BS4は、選択できる幅広いパーサーを提供します。 user-agentおよびsleepを使用して、スクレイピングを簡単にします。 BS4はbs.tagを返すため、variable[0]を使用します。 jsが実行されている場合、リクエストとbs4を直接使用してスクレイピングすることはできません。 APIリンクを取得し、JSONを解析して必要な情報を取得するか、Seleniumを試してください。

0
Chris D'mello