2

重複の可能性:
Perl でスクレイプをスクリーニングするにはどうすればよいですか?
PythonによるWebスクレイピング

これは私の専門分野ではないので、一般的な知識不足はご容赦ください。サイトスクレイピング用の Python または Perl ライブラリを探しています (サイトから製品情報を取得したり、さまざまなページのテーブルを作成したり、よりユーザーフレンドリーな形式 (Excel) に変換したりします。どちらの言語にも十分なオプションがあります)。

誰かがこの主題に関する推奨事項または出発点を与えることができますか? グーグルはいくつかの興味深い一致を提供しますが、少し時間があれば、間違った道を探しに行くのではなく、その問題についてある程度の経験を持つ人を信頼したいと思います.

4

3 に答える 3

5

Pythonには、scrapyと呼ばれるライブラリとlxmlbeautifulsoupなどのパーサーでmechanizeまたは他のインターフェースを使用するなどのより基本的なライブラリがあります

コメントでは、チュートリアルがないことが言及されていましたが、mechanize を使用するのは (ブラウザ オブジェクトを使用して) 比較的簡単ですが、lxml は xpath を使用して dom を簡単に移動する方法を提供します。

私はそれを使用したことはありませんが、Seleniumも良い選択肢のように思えますが、はるかに複雑です。

于 2012-08-02T00:03:01.180 に答える
1

私は数日前に厄介なHTMLクラスのすべてのインスタンスを探し出す必要があり、すぐに次のものをまとめました-それはスクレーパーとクローラーの両方であり、それは小さいです。

import sys
import urllib.parse as uparse
import httplib2
from bs4 import BeautifulSoup

http = httplib2.Http()

hit_urls = set()

def crawl(url, check, do, depth=1):
    global hit_urls
    if url in hit_urls:
        #print("**Skipping %s" % url)
        return
    #print("Crawling %s" % url, file=sys.stderr)
    hit_urls.add(url)

    _, response = http.request(url)
    soup = BeautifulSoup(response)

    resp = do(url, soup)

    if depth > 0:
        for link in soup.find_all('a'):
            if link.has_key('href'):
                rel_url = link['href']
                if(check(rel_url)):
                    crawl(uparse.urljoin(url,rel_url), check, do, depth-1)

    return resp

def isLocal(url):
    if not url.startswith('/'):
        return False
    if url.startswith('/goToUrl'): # 3rd party redirect page
        return False
    return True

def findBadClass(url, soup):
    for t in soup.find_all(True,{'class': 'badClass'}):
        print(url+":"+str(t))

if __name__ == '__main__':
    crawl('http://example.com', isLocal, findBadClass)
于 2012-08-02T00:15:23.180 に答える
-2

一握りのサイトを一貫したフォーマットでスクレイピングしたいだけなら、おそらく最も簡単な方法は、正規表現と Python の組み込み文字列処理を組み合わせたリクエストを使用することでしょう。

import re

import requests


resp = requests.get('http://austin.craigslist.org/cto/')

regex = ('<a href="(http://austin.craigslist.org/cto/[0-9]+\.html)">'
         '([a-zA-z0-9 ]+)</a>')

for i, match in enumerate(re.finditer(regex, resp.content)):
    if i > 5:
        break
    url = match.group(1)
    print 'url:', url
    resp = requests.get(url)
    title = re.search('<h2>(.+)</h2>', resp.content).group(1)
    print 'title:', title
    body = resp.content.split('<div id="userbody">', 1)[1]
    body = body.split('<script type="text/javascript">')[0]
    body = body.split('<!-- START CLTAGS -->')[0]
    print 'body:', body
    print

編集:明確にするために、私はBeautiful Soupを使用しましたが、過大評価されていると思います. 奇妙で不安定で、実際の状況では使いにくいと思いました。また、1 回限りのスクレーパー用の新しいライブラリを学習するのは大変な作業です。Python スクリプトを実行するときに他の場所に適用できる標準的な手法 (つまり、上記で提案したもの) を使用する方がよいでしょう。

于 2012-08-02T00:34:15.543 に答える