7

私はPython(およびWebスクレイピング)に非常に慣れていません。質問させて下さい。

実際、多くの Web サイトは、Firefox やその他のブラウザーで特定の URL を報告していません。たとえば、Social Security Admin は人気のある赤ちゃんの名前を順位付きで表示します (1880 年以降) が、年を 1880 から 1881 に変更しても URL は変わりません。

http://www.ssa.gov/cgi-bin/popularnames.cgi

具体的な URL がわからないため、urllib を使用して Web ページをダウンロードできませんでした。

このページ ソースには、以下が含まれます。

<input type="text" name="year" id="yob" size="4" value="1880">

おそらく、この「年」の値 (「1881」や「1991」など) を制御できれば、この問題に対処できます。私は正しいですか?私はまだそれを行う方法がわかりません。

誰でもこれの解決策を教えてもらえますか?

勉強に役立ちそうなサイトをご存知でしたら教えてください。

ありがとう!

4

4 に答える 4

7

引き続きご利用いただけますurllib。このボタンは、現在の URL に対して POST を実行します。Firefox のFirebugmemberを使用してネットワーク トラフィックを調べたところ、 、top、の 3 つのパラメータが送信されていることがわかりましたyear。同じ引数を送信できます。

import urllib
url = 'http://www.ssa.gov/cgi-bin/popularnames.cgi'

post_params = { # member was blank, so I'm excluding it.
    'top'  : '25',
    'year' : year
    }
post_args = urllib.urlencode(post_params)

URL エンコードされた引数を送信するだけです。

urllib.urlopen(url, post_args)

ヘッダーも送信する必要がある場合:

headers = {
    'Accept' : 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    'Accept-Language' : 'en-US,en;q=0.5',
    'Connection' : 'keep-alive',
    'Host' : 'www.ssa.gov',
    'Referer' : 'http://www.ssa.gov/cgi-bin/popularnames.cgi',
    'User-Agent' : 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:21.0) Gecko/20100101 Firefox/21.0'
    }

# With POST data:
urllib.urlopen(url, post_args, headers)

コードをループで実行します。

for year in xrange(1880, 2014):
    # The above code...
于 2013-06-20T18:59:00.163 に答える
3

Scrapyの使用をお勧めします。これは、Web スクレイピング用の非常に強力で使いやすいツールです。試す価値がある理由:

  1. スピード/パフォーマンス/効率

    Scrapy は、人気のある Python のイベント駆動型ネットワーク フレームワークである Twisted で作成されています。したがって、並行性のために非ブロッキング (別名非同期) コードを使用して実装されます。

  2. データベースのパイプライン

    Scrapy にはItem Pipelines次の機能があります。

    アイテムがスパイダーによってスクレイピングされた後、アイテム パイプラインに送信され、順次実行されるいくつかのコンポーネントを介して処理されます。

    そのため、各ページは、ダウンロード後すぐにデータベースに書き込むことができます。

  3. コード編成

    Scrapy は、設定、スパイダー、アイテム、パイプラインなどが論理的に分離された、素晴らしく明確なプロジェクト構造を提供します。それでも、コードがより明確になり、サポートと理解が容易になります。

  4. コーディングの時間

    Scrapy は、舞台裏で多くの作業を行います。これにより、実際のコードとロジック自体に集中し、「金属」部分 (プロセスやスレッドなどの作成) について考える必要がなくなります。

ええ、あなたはそれを手に入れました - 私はそれが大好きです。

開始するには:

それが役立つことを願っています。

于 2013-06-20T19:24:30.023 に答える
2

以前、このようなものに mechanoid/BeautifulSoup ライブラリを使用しました。今このようなプロジェクトがあれば、https://github.com/scrapy/scrapyも見ます

于 2013-06-20T19:00:17.753 に答える