0

URL のリストを含む入力ファイルがあります。これらの各 URL でスクリプトを実行し、そのスクリプトの結果を CSV に出力しようとしています。

例として、サイトの特定のリストが Google アナリティクスを使用しているかどうかを確認しようとしています。以下のスクリプトをページのコンテキストで実行すると、"{'GA': true}" のような JSON が返されます。

var scripts = document.getElementsByTagName("script");
var source = [];
for (var i = 0; i < scripts.length; i ++) {
    var s = scripts[i];
    if (!s.src) continue;
    source.push(s.src);
}
checkforGA();


function checkforGA() {
    var tools = {};
    for (var j = 0 ; j < source.length; j ++) {
        if (/google-analytics.com\/(ga|urchin).js/i.test(source))
        {
            tools.GA = true;
            return JSON.stringify(tools);
        }
        else 
        {
            tools.GA = false;
            return JSON.stringify(tools);
        }
    }
}

私の入力は、サイトのリストを含むcsvファイルです

Google, http://google.com
Wikipedia, http://wikipedia.com
Techcrunch, http://techcrunch.com
Stackoverflow, http://stackoverflow.com
Yahoo, http://yahoo.com

私の望む出力は

Google, http://google.com, {'GA': false}
Wikipedia, http://wikipedia.com, {'GA': false}
Techcrunch, http://techcrunch.com, {'GA': true}
Stackoverflow, http://stackoverflow.com, {'GA': true}
Yahoo, http://yahoo.com, {'GA': false}

Pythonスクリプト内からjsを実行できるかどうかはわかりませんが、開始方法に関するアイデアを探しています。

4

3 に答える 3

0

REを使用してHTMLを実行すると、複雑なドキュメントで問題が発生する場合があります。代わりにBeautifulSoupを使ってみませんか?リクエストモジュールを使用して、SOでこれを試す例を含めました。

from bs4 import BeautifulSoup
import requests

r = requests.get('http://www.stackoverflow.com')

soup = BeautifulSoup(r.text)

alist =  soup.find_all('script')
for script in alist:
    try:
        if script.text.find('var _gaq=_gaq') != -1:
            print 'found'
        else:
            print 'not found'
    except KeyError:
        print 'no src'

ところで、他のスクリプトにGA initを配置する場合、この方法ではすべてをキャッチできるわけではありません...代わりにSeleniumを使用して'_gaq'変数の存在を確認することをお勧めします...

于 2012-04-15T19:38:47.703 に答える
0

あなたの最善の策は、ページのテキストを読み込んでから、 re モジュールを使用して正規表現を検索することです。

于 2012-04-15T16:53:10.283 に答える
0

JSですべてを実行しないのはなぜですか-たとえば、PhantomJSを使用して- https://code.google.com/p/phantomjs/ ?

于 2012-04-16T02:48:30.990 に答える