2
<form action="http://www.lyricsfreak.com/search.php">
    <input name="a" value="search" type="hidden">
    <input type="hidden" name="type" value="song">
    <input type="text" name="q" class="searchinp" placeholder="Search artist, albums and songs">
    <input value="Search" type="submit" class="srchbtn searchst" data-tracking='["Search","Lyrics","Search button"]'>
    <a href="http://www.lyricsfreak.com/search.php" class="srchadv" data-tracking='["Search","Lyrics","Advanced search"]'>Advanced search</a>
</form>

この質問はすでに尋ねられていることは知っていますが、それは私にはうまくいきません。実際、このサイトでは、URL をコピーして他のタブに貼り付けても、最初にエラーが表示され、数秒後に再度リロードして目的のページが表示されるため、最初の試行で値を取得できません。誰かが私に解決策を教えてくれれば素晴らしいことです。私の評判を見ると、私はstackoverflowに非常に慣れていないので、何か間違いをした場合は申し訳ありません...

4

1 に答える 1

1

リンクhttp://www.lyricsfreak.com/search.phpが利用できないため、エラーが表示されます。時々リストアップすると言うと、実際に起こるのはホームページへのリダイレクトです。したがって、http://www.lyricsfreak.com/search.php を使用する代わりに、ホームページ リンク http://www.lyricsfreak.com/ を使用できます

コメントに基づくサンプル

Ok。jsoup を使用して Java プログラムから検索した後にトラックを読みたいとします。Lyricsfreak の問題は、結果を返す前にソースをチェックすることです。クエリのソースが Lyricsfreak.com でない場合、access_error.htm にリダイレクトされ、そこから以下のスクリプトを使用して再度送信し、3.5 秒後に結果を取得します。

<script type="text/javascript">
    var redirect_url = document.location.href.match(/\?(.*)/);
    redirect_url = redirect_url ? '/search.php?' + redirect_url[1] : '/';
    setTimeout(function() { document.location.href = (redirect_url); }, 3500);
</script>

ここでできることは、referrerjsoup を介して 'lyricsfreak.com' として設定することで、access_error なしで適切な結果が得られます。したがって、サンプルコードは次のようになります。もちろん、より良い方法でページを解析することもできますが、これはアイデアを提供するためのものです。

import java.util.ArrayList;
import java.util.List;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;

public class LyricsParser {

    public static void main(String[] args) throws Exception {

        String SEARCH_STRING = "Madonna";
        String URL = "http://www.lyricsfreak.com/search.php?a=search&type=song&q=";

        List<String> artists = new ArrayList<String>();
        List<String> songs = new ArrayList<String>();
        List<String> hits = new ArrayList<String>();

        Document doc = Jsoup.connect(URL + SEARCH_STRING)
                .referrer(URL + SEARCH_STRING).get();

        for(Element tracks : doc.select("td.colfirst")){
            for(Element links : tracks.getElementsByTag("a")){
                artists.add(links.text());
            }
        }

        for(Element tracks : doc.select("td > a.song")){
            for(Element links : tracks.getElementsByTag("a")){
                songs.add(links.text());
            }
        }

        for(Element tracks : doc.select("td.colast")){
            hits.add(tracks.text());
        }

        int length = artists.size();
        for(int i=0; i<length; i++){
            System.out.println("[" + artists.get(i) + ",\t" + songs.get(i) + ",\t" + hits.get(i+1) + "]");
        }
    }

}
于 2014-05-12T12:15:50.727 に答える