/// <summary>
        /// Parse member from internet based on given member id, mode, and page number.
        /// </summary>
        /// <param name="memberId"></param>
        /// <param name="mode"></param>
        /// <param name="page"></param>
        /// <returns></returns>
        public NijieMember ParseMember(int memberId, MemberMode mode, int page)
        {
            HtmlDocument doc = null;
            try
            {
                canOperate();
                NijieMember member = new NijieMember(memberId, mode, page);
                var result = getPage(member.MemberUrl);
                var res = result.Item2;
                if (Util.IsRedirected(res.ResponseUri.ToString(), member.MemberUrl, ignoreProtocol: true))
                {
                    throw new NijieException(string.Format("Redirected to another page: {0} ==> {1}", member.MemberUrl, res.ResponseUri.ToString()), NijieException.MEMBER_REDIR);
                }

                doc = result.Item1;

                return ParseMember(doc, member, mode);
            }
            catch (NijieException)
            {
                throw;
            }
            catch (Exception ex)
            {
                if (doc != null)
                {
                    var filename = String.Format("Dump for Member {0} Mode {1}.html", memberId, mode.ToString());
                    Log.Debug("Dumping member page to: " + filename);
                    doc.Save(filename);
                }

                throw new NijieException(String.Format("Error when processing member: {0} ==> {1}", memberId, ex.Message), ex, NijieException.MEMBER_UNKNOWN_ERROR);
            }
        }
        /// <summary>
        /// Parse member from internet based on given member id, mode, and page number.
        /// </summary>
        /// <param name="memberId"></param>
        /// <param name="mode"></param>
        /// <param name="page"></param>
        /// <returns></returns>
        public NijieMember ParseMember(int memberId, MemberMode mode, int page)
        {
            HtmlDocument doc = null;

            try
            {
                canOperate();
                NijieMember member = new NijieMember(memberId, mode, page);
                var         result = getPage(member.MemberUrl);
                var         res    = result.Item2;
                if (Util.IsRedirected(res.ResponseUri.ToString(), member.MemberUrl, ignoreProtocol: true))
                {
                    throw new NijieException(string.Format("Redirected to another page: {0} ==> {1}", member.MemberUrl, res.ResponseUri.ToString()), NijieException.MEMBER_REDIR);
                }

                doc = result.Item1;

                return(ParseMember(doc, member, mode));
            }
            catch (NijieException)
            {
                throw;
            }
            catch (Exception ex)
            {
                if (doc != null)
                {
                    var filename = String.Format("Dump for Member {0} Mode {1}.html", memberId, mode.ToString());
                    Log.Debug("Dumping member page to: " + filename);
                    doc.Save(filename);
                }

                throw new NijieException(String.Format("Error when processing member: {0} ==> {1}", memberId, ex.Message), ex, NijieException.MEMBER_UNKNOWN_ERROR);
            }
        }