Jsoup实现网络数据抓取1

最近一个做金融的同学问我,能不能写一个小的Demo,得到金十数据网上每周三22:30美国能源信息署发布的原油数据。这里使用Jsoup工具来获取网络数据。

具体思路:

(1):这里写两个Activity,FirstActivity主要使用自定义的ListView显示日期列表,该列表实现了下拉加载更多的日期项的功能,点击每一个Item可以启动SecondActivity,并传递一个日期值,根据日期值获得每周三的数据。
(2):根据当前日期,获取之前的每个周三的日期值,根据日期值,就可以得到网络的URL地址。
(3):SecondActivity用于显示从网络上得到的数据,在内部的 AsyncTask异步类的doInBackground方法中获取HTML页面的字符串。在onPostExecute方法中利用Jsoup解析HTML文档,并将解析出来的数据放入集合中保存。

FirstActivity相关代码:

1,自定义的ListView:

public class MyListView extends ListView implements AbsListView.OnScrollListener
{
    View footerView;
    private int mTotalItemCount;
    private int mLastVisibleItem;
    private boolean isLoading;
    private LoadMoreDataListener loadMoreDataListener;

    public MyListView(Context context)
    {
        super(context);
        initView(context);
    }

    public MyListView(Context context, AttributeSet attrs)
    {
        super(context, attrs);
        initView(context);
    }

    public MyListView(Context context , AttributeSet attrs , int defStyle)
    {
        super(context, attrs , defStyle);
        initView(context);
    }

    private void initView(Context context)
    {
        LayoutInflater inflater = LayoutInflater.from(context);
        footerView = inflater.inflate(R.layout.footer_view , null);
        footerView.findViewById(R.id.footer_layout).setVisibility(GONE);
        this.addFooterView(footerView);
        this.setOnScrollListener(this);
    }

    @Override
    public void onScrollStateChanged(AbsListView absListView, int scrollState)
    {
        if (mLastVisibleItem == mTotalItemCount && scrollState == SCROLL_STATE_IDLE)
        {
            //如果不是正在加载
            if (!isLoading)
            {
                isLoading = true;
                footerView.findViewById(R.id.footer_layout).setVisibility(VISIBLE);
                loadMoreDataListener.loadMore();
            }
        }
    }

    public void loadComplete()
    {
        isLoading = false;
        footerView.findViewById(R.id.footer_layout).setVisibility(GONE);
    }

    @Override
    public void onScroll(AbsListView absListView, int firstVisibleItem, int visibleItemCount, int totalItemCount)
    {
        this.mLastVisibleItem = firstVisibleItem + visibleItemCount;
        this.mTotalItemCount = totalItemCount;
    }

    public interface LoadMoreDataListener
    {
        void loadMore();
    }

    public void setLoadMoreDataListener(LoadMoreDataListener loadMoreDataListener)
    {
        this.loadMoreDataListener = loadMoreDataListener;
    }
}

2,Bean类(该类可以获取每个星期三的日期值):

public class EveryWen
{
    String year;
    String month;
    String date;
    String urlString;
    String showString;
    String title;

    public static Calendar getLastWenDay()
    {
        Calendar calendar = Calendar.getInstance();
        int off = getWednesdayOff(calendar.get(Calendar.DAY_OF_WEEK));
        calendar.add(Calendar.DATE , -off);
        return calendar;
    }

    public static int getWednesdayOff(int now)
    {
        int off = 0;
        switch (now)
        {
            case 1:
                off = 4;
                break;
            case 2:
                off = 5;
                break;
            case 3:
                off = 6;
                break;
            case 4:
                off = 0;
                break;
            case 5:
                off = 1;
                break;
            case 6:
                off = 2;
                break;
            case 7:
                off = 3;
                break;
            default:
                break;
        }
        return off;
    }

    public EveryWen(int year , int month , int date , String title)
    {
        this.year = year + "";
        if ((month + 1) < 10)
        {
            this.month = "0" + (month + 1);
        }
        else
        {
            this.month = (month + 1) + "";
        }
        if (date < 10)
        {
            this.date = "0" + date;
        }
        else
        {
            this.date = date + "";
        }

        this.title = title;

        init();
    }

    private void init()
    {
        StringBuilder sb = new StringBuilder();
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append(year).append(month).append(date);
        showString = stringBuilder.toString();
        sb.append(year).append("年").append(month).append("月").append(date).append("日");
        urlString = sb.toString();
    }
}

3,自定义的Adapter

public class MyAdapter extends BaseAdapter
{
    private LayoutInflater layoutInflater;
    private List<EveryWen> datas;
    public MyAdapter(Context context , List<EveryWen> listData)
    {
        layoutInflater = LayoutInflater.from(context);
        datas = listData;
    }

    public void onDataChange(List<EveryWen> dataOfList)
    {
        this.datas = dataOfList;
        this.notifyDataSetChanged();
    }

    @Override
    public int getCount()
    {
        return datas.size();
    }

    @Override
    public Object getItem(int position)
    {
        return datas.get(position);
    }

    @Override
    public long getItemId(int position)
    {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent)
    {
        ViewHolder viewHolder = null;
        if (convertView == null)
        {
            convertView = layoutInflater.inflate(R.layout.list_item , null);
            viewHolder = new ViewHolder();
            viewHolder.title = (TextView) convertView.findViewById(R.id.item_title);
            viewHolder.date = (TextView) convertView.findViewById(R.id.item_date);
            convertView.setTag(viewHolder);
        }
        else
        {
            viewHolder = (ViewHolder) convertView.getTag();
        }

        viewHolder.title.setText(datas.get(position).title);
        viewHolder.date.setText(datas.get(position).urlString);
        return convertView;
    }

    class ViewHolder
    {
        TextView title;
        TextView date;
    }
}

FirstActivity类:

public class FirstActivity extends Activity implements MyListView.LoadMoreDataListener , ListView.OnItemClickListener
{
    List<EveryWen> wenList = new ArrayList<>();
    Calendar calendar = EveryWen.getLastWenDay();
    MyAdapter adapter;

    private MyListView mListView;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.main_activity);
        getData();
        initView(wenList);
    }

    private void initView(List<EveryWen> loadDatas)
    {
        if (adapter == null)
        {
            mListView = (MyListView) findViewById(R.id.listView);
            mListView.setLoadMoreDataListener(this);
            mListView.setOnItemClickListener(this);
            adapter = new MyAdapter(this, loadDatas);
            mListView.setAdapter(adapter);
        }
        else
        {
            adapter.onDataChange(loadDatas);
        }
    }

    private void getData()
    {
        for (int i = 0 ; i < 15 ; i++)
        {
            EveryWen wenDay = new EveryWen(calendar.get(Calendar.YEAR) ,
                    calendar.get(Calendar.MONTH) , calendar.get(Calendar.DATE) , "金石财经数据一览");
            wenList.add(wenDay);
            calendar.add(Calendar.DATE , -7);
        }
    }

    private void showMoreData()
    {
        for (int i = 0 ; i < 3 ; i++)
        {
            EveryWen wenDay = new EveryWen(calendar.get(Calendar.YEAR) ,
                    calendar.get(Calendar.MONTH) , calendar.get(Calendar.DATE) , "金石财经数据一览");
            wenList.add(wenDay);
            calendar.add(Calendar.DATE , -7);
        }
    }

    @Override
    public void loadMore()
    {
        Handler handler = new Handler();
        handler.postDelayed(new Runnable()
        {
            @Override
            public void run()
            {
                //加载更多数据
                showMoreData();
                initView(wenList);
                mListView.loadComplete();
            }
        } , 2500);
    }

    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id)
    {
        String date = wenList.get(position).showString;
        Intent intent = new Intent(FirstActivity.this , SecondActivity.class);
        intent.putExtra("extra_date" , date);
        startActivity(intent);
    }
}

主页面布局比较简单,就是放入一个自定义的ListView,这里给出ListView的item的布局:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="60dp">

    <ImageView
        android:id="@+id/item_icon"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_centerVertical="true"
        android:background="@drawable/usa"
        android:layout_marginLeft="5dp"/>

    <TextView
        android:id="@+id/item_title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="12dp"
        android:layout_toRightOf="@+id/item_icon"
        android:layout_centerInParent="true"
        android:text=""
        android:textSize="16sp" />

    <TextView
        android:id="@+id/item_date"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_marginRight="5dp"
        android:layout_marginTop="30dp"
        android:layout_marginBottom="10dp"
        android:text=""/>

</RelativeLayout>
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值