Как я могу получить изображение профиля спортсмена с веб-страницы - PullRequest
0 голосов
/ 03 февраля 2012

Я хочу отобразить изображение спортсмена в зависимости от выбора игрока.Я использую JSOUP, чтобы получить остальную информацию, такую ​​как статистика и т. Д. У меня проблема, потому что html постоянно меняется с каждым игроком.Я могу передать html имя, но я не знаю идентификатор игрока evey при выборе.какие-нибудь идеи?

Пример HTNL: http://www.rotoworld.com/player/nba/784/zach-randolph/1

Я могу нажать имя, когда выбран игрок (zach-randolph), но не его код (784) ...

Обновление-- Может быть, я смогу выполнить поиск изображений в Google по имени и получить первый результат, который кто-нибудь знает, как это сделать?

КОД:

public class ImagetestdroidActivity extends Activity {
/** Called when the activity is first created. */
ImageView image = null;
//ImageView image2 = null;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    image = (ImageView)findViewById(R.id.imageView1);
    //image2 = (ImageView)findViewById(R.id.imageView2);
    GetPlayerTask fetch = new GetPlayerTask();
 String phrase = "Lebron James";
    String delims = "[ ]+";
    String[] tokens = phrase.split(delims);
    for (int i = 0; i < tokens.length; i++)
    {
        System.out.println("Token"+i+":"+tokens[i]);
    }
    fetch.execute(tokens[0], tokens[1], "nba");

}

public String getimage(String html) throws IOException
{
     try {
            Document doc = Jsoup.connect(html).get();
            Element e = doc.select("div.playerphoto > img").first();
            // If you want absolute path
            String imgSrcAbs =  e.attr("abs:src");      
            System.out.println(imgSrcAbs);
            // Or , If you want relative path
            String imgSrcRelative =  e.attr("src"); 
            System.out.println(imgSrcRelative);
            return imgSrcAbs;
            } 
        catch (IOException e) {             
        }

    return null;
}
public void onPlayerFound(String result) throws IOException {
    // TODO Auto-generated method stub
     System.out.println("in ONPLAYERFOUNFD"+result);
     String imagehtml= getimage("http://www.rotoworld.com/"+result+"/1");
     try 
     {
         System.out.println("IMG HTML "+imagehtml);
         URL feedImage = new URL(imagehtml);
         HttpURLConnection conn= (HttpURLConnection)feedImage.openConnection();
         InputStream is = conn.getInputStream();

        Bitmap img = BitmapFactory.decodeStream(is);
        image.setImageBitmap(img);

     } 
     catch (MalformedURLException e) 
     {
         e.printStackTrace();
     } 
     catch (IOException e) 
     {
         e.printStackTrace();
     }

}

class GetPlayerTask extends AsyncTask<String, Void, String> {
    private final String TAG = null;
    AndroidHttpClient   mClient = AndroidHttpClient.newInstance(
            "Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.24) Gecko/20111107 Ubuntu/10.04 (lucid) Firefox/3.6.24");
    @Override
    protected String doInBackground(String... params) {
        String result = null;
        String url = Uri.parse("http://www.rotoworld.com").buildUpon()
                .appendEncodedPath("content/playersearch.aspx")
                .appendQueryParameter("searchname", params[0] + " " + params[1])
                .build().toString();
        HttpPost post = new HttpPost(url);
        post.addHeader("Referer", "http://www.rotoworld.com");

        try {
            List<NameValuePair> parameters = new ArrayList<NameValuePair>();
            parameters.add(new BasicNameValuePair("ctl00$cp1$btnAdvancedSearch", "Search"));
            parameters.add(new BasicNameValuePair("ctl00$cp1$radSportSearch", params[2].toUpperCase()));
            parameters.add(new BasicNameValuePair("ctl00$cp1$tbFirstNameSearch", params[0]));
            parameters.add(new BasicNameValuePair("ctl00$cp1$tbLastNameSearch", params[1]));
            parameters.add(new BasicNameValuePair("ctl00$cp1$tbHeaderSearchBox", "LAST NAME, FIRST NAME"));
            parameters.add(new BasicNameValuePair("ctl00$cp1$headlinesNFL$hideHeadlineSport", ""));
            parameters.add(new BasicNameValuePair("ctl00$cp1$siteheader$hidpage", ""));
            parameters.add(new BasicNameValuePair("__EVENTARGUMENT", ""));
            parameters.add(new BasicNameValuePair("__EVENTTARGET", ""));
            parameters.add(new BasicNameValuePair("__EVENTVALIDATION", "/wEWEALJp4KIBAKHlvL3BgLA+sClCQK5vLryBgKn1MPhBAK9kM36BQKj89HmAwLA+vrmBAKk7ayNDgKj85nnAwKU87XnAwKurM6nDAK++qLmBAKD2r2iBgKQ+47mAgK//t/aB6qbH1ovSUf6LkMO7LTmIW5EbRu5"));
            parameters.add(new BasicNameValuePair("__VIEWSTATE", "/wEPDwUJMjg1NjcxOTA2D2QWAmYPZBYEAgEPZBYCAhwPFgIeBFRleHQF3AE8c2NyaXB0IGxhbmd1YWdlPSdqYXZhc2NyaXB0JyB0eXBlPSd0ZXh0L2phdmFzY3JpcHQnIHNyYz0naHR0cDovL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL2pxdWVyeS8xLjQuMi9qcXVlcnkubWluLmpzJz48L3NjcmlwdD48c2NyaXB0IGxhbmd1YWdlPSdqYXZhc2NyaXB0JyB0eXBlPSd0ZXh0L2phdmFzY3JpcHQnIHNyYz0nL3psaWJzL2ZseW91dG5hdi5qcyc+PC9zY3JpcHQ+ZAIDD2QWAgIBD2QWAgIDD2QWBAIFD2QWBgIBDxYCHwAFDVRvcCBIZWFkbGluZXNkAgIPDxYCHgdWaXNpYmxlaGRkAgQPD2QPEBYBZhYBFgIeDlBhcmFtZXRlclZhbHVlZRYBZmRkAgsPZBYCAgEPFgIfAAUbQ2hhbXBpb25zaGlwIEV2ZW50cyBUaWNrZXRzZGRb2hpHPON4Q4VOuUHYhpgRZg0o4Q=="));
            post.setEntity(new UrlEncodedFormEntity(parameters));

            HttpResponse response = mClient.execute(post);
            if (response.getStatusLine().getStatusCode() == 302) {
                Header location = response.getFirstHeader("Location");
                if (location != null) {
                    result = location.getValue();
                }
            }
        } catch (IOException e) {
            Log.e(TAG, "Unable perform request", e);
        }

        return result;
    }
    @Override
    protected void onPostExecute(String result) {
        // Call whatever method you want to notify your Activity
        // that you've found the player in question
        try {
            System.out.println("getplayer"+result);
            onPlayerFound(result);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 04 февраля 2012

попробуйте это:

String url = "http://www.rotoworld.com/player/nba/784/zach-randolph/1";
    try {
        Document doc = Jsoup.connect(url).get();
        Element e = doc.select("div.playerphoto > img").first();
        // If you want absolute path
        String imgSrcAbs =  e.attr("abs:src");      
        System.out.println(imgSrcAbs);
        // Or , If you want relative path
        String imgSrcRelative =  e.attr("src"); 
        System.out.println(imgSrcRelative);

        } 
    catch (IOException e) {             
    }
0 голосов
/ 03 февраля 2012

На сайте, который вы просматриваете, есть функция поиска, которую вы можете эмулировать, используя HttpClient и HttpPost, как показано в следующем примере.

Прежде всего, используйте HttpClient - в данном случае AndroidHttpClient,Мы имитируем User-Agent реального браузера на всякий случай:

mClient = AndroidHttpClient.newInstance(
            "Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.24) Gecko/20111107 Ubuntu/10.04 (lucid) Firefox/3.6.24", this);

Затем - AsyncTask, который будет выполнять сетевую операцию:

class GetPlayerTask extends AsyncTask<String, Void, String> {
    @Override
    protected String doInBackground(String... params) {
        String result = null;
        String url = Uri.parse("http://www.rotoworld.com").buildUpon()
                .appendEncodedPath("content/playersearch.aspx")
                .appendQueryParameter("searchname", params[0] + " " + params[1])
                .build().toString();
        HttpPost post = new HttpPost(url);
        post.addHeader("Referer", "http://www.rotoworld.com");

        try {
            List<NameValuePair> parameters = new ArrayList<NameValuePair>();
            parameters.add(new BasicNameValuePair("ctl00$cp1$btnAdvancedSearch", "Search"));
            parameters.add(new BasicNameValuePair("ctl00$cp1$radSportSearch", params[2].toUpperCase()));
            parameters.add(new BasicNameValuePair("ctl00$cp1$tbFirstNameSearch", params[0]));
            parameters.add(new BasicNameValuePair("ctl00$cp1$tbLastNameSearch", params[1]));
            parameters.add(new BasicNameValuePair("ctl00$cp1$tbHeaderSearchBox", "LAST NAME, FIRST NAME"));
            parameters.add(new BasicNameValuePair("ctl00$cp1$headlinesNFL$hideHeadlineSport", ""));
            parameters.add(new BasicNameValuePair("ctl00$cp1$siteheader$hidpage", ""));
            parameters.add(new BasicNameValuePair("__EVENTARGUMENT", ""));
            parameters.add(new BasicNameValuePair("__EVENTTARGET", ""));
            parameters.add(new BasicNameValuePair("__EVENTVALIDATION", "/wEWEALJp4KIBAKHlvL3BgLA+sClCQK5vLryBgKn1MPhBAK9kM36BQKj89HmAwLA+vrmBAKk7ayNDgKj85nnAwKU87XnAwKurM6nDAK++qLmBAKD2r2iBgKQ+47mAgK//t/aB6qbH1ovSUf6LkMO7LTmIW5EbRu5"));
            parameters.add(new BasicNameValuePair("__VIEWSTATE", "/wEPDwUJMjg1NjcxOTA2D2QWAmYPZBYEAgEPZBYCAhwPFgIeBFRleHQF3AE8c2NyaXB0IGxhbmd1YWdlPSdqYXZhc2NyaXB0JyB0eXBlPSd0ZXh0L2phdmFzY3JpcHQnIHNyYz0naHR0cDovL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL2pxdWVyeS8xLjQuMi9qcXVlcnkubWluLmpzJz48L3NjcmlwdD48c2NyaXB0IGxhbmd1YWdlPSdqYXZhc2NyaXB0JyB0eXBlPSd0ZXh0L2phdmFzY3JpcHQnIHNyYz0nL3psaWJzL2ZseW91dG5hdi5qcyc+PC9zY3JpcHQ+ZAIDD2QWAgIBD2QWAgIDD2QWBAIFD2QWBgIBDxYCHwAFDVRvcCBIZWFkbGluZXNkAgIPDxYCHgdWaXNpYmxlaGRkAgQPD2QPEBYBZhYBFgIeDlBhcmFtZXRlclZhbHVlZRYBZmRkAgsPZBYCAgEPFgIfAAUbQ2hhbXBpb25zaGlwIEV2ZW50cyBUaWNrZXRzZGRb2hpHPON4Q4VOuUHYhpgRZg0o4Q=="));
            post.setEntity(new UrlEncodedFormEntity(parameters));

            HttpResponse response = mClient.execute(post);
            if (response.getStatusLine().getStatusCode() == 302) {
                Header location = response.getFirstHeader("Location");
                if (location != null) {
                    result = location.getValue();
                }
            }
        } catch (IOException e) {
            Log.e(TAG, "Unable perform request", e);
        }

        return result;
    }
    @Override
    protected void onPostExecute(String result) {
        // Call whatever method you want to notify your Activity
        // that you've found the player in question
        onPlayerFound(result);
    }
}

BasicNameValuePair s выше былипотратил 2-3 секунды на их поисковую страницу, используя FireBug.Ответом на «успешный поиск» является сообщение о перенаправлении (302), содержащее местоположение страницы игрока - то есть идентификатор, который вам необходим для загрузки изображения.

GetPlayerTask будет использоваться следующим образом:

    GetPlayerTask fetch = new GetPlayerTask();
    // FirstName, LastName, Category (NBA/etc./etc.)
    fetch.execute("Gerald", "Henderson", "nba");

Это вернет путь относительно www.rotoworld.com, например,

"/player/nba/1614/gerald-henderson"
...