最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#實(shí)現(xiàn)百度網(wǎng)站收錄和排名查詢功能思路及實(shí)例

 更新時(shí)間:2015年01月28日 11:05:21   投稿:junjie  
這篇文章主要介紹了C#實(shí)現(xiàn)百度網(wǎng)站收錄和排名查詢功能思路及實(shí)例,本文思路同樣適用必應(yīng)、搜狗、搜搜、360等搜索引擎,需要的朋友可以參考下

一、前言

偶然一次在vs2012默認(rèn)的項(xiàng)目文件夾里發(fā)現(xiàn)了以前自己做的一個(gè)關(guān)于SEO的類庫,主要是用來查詢某個(gè)網(wǎng)址的收錄次數(shù)還有網(wǎng)站的排行數(shù),后來重構(gòu)了下,今天拿出來寫篇文章,說說自己是如何思考的并完成的。

二、問題描述

首先需要考慮的是能夠支持哪些搜索引擎的查詢,首先是百度,然后是必應(yīng)、搜狗、搜搜、360。本來想支持Google但是一想不對(duì),根本不好訪問的,所以暫時(shí)不算在內(nèi)。而我們實(shí)際要做的就是根據(jù)一個(gè)網(wǎng)址能夠檢索出這個(gè)網(wǎng)址的在各個(gè)搜索引擎的收錄次數(shù)以及在不同關(guān)鍵詞下的網(wǎng)址排行,這里出入的只有網(wǎng)址還有若干的關(guān)鍵詞,而輸出則是該網(wǎng)址在不同搜索引擎下的收錄次數(shù)以及在各個(gè)關(guān)鍵詞下的排行數(shù)。

但是這里有個(gè)問題,就是排行數(shù),如果檢索的網(wǎng)址在前100還好,如果排名很后面,那么問題就來了,那樣會(huì)讓用戶等待很長(zhǎng)時(shí)間才能看到結(jié)果,但是用戶可能只想知道排行前100的具體排名,而那些超過的則只要顯示100以后就可以了,而這些就需要我們前期考慮好,這樣后面的程序才好做。

三、解決思路

相信很多人都能夠想到,就是利用WebClient將將需要的頁面下載下來,然后用正則從中獲取我們感興趣的部分,然后利用程序去處理。而關(guān)鍵難度就是在這個(gè)正則的編寫,首先我們先從簡(jiǎn)單的開始。

四、收錄次數(shù)

首先是網(wǎng)站的收錄次數(shù),我們可以在百度中輸入site:www.cnblogs.com/然后我們就可以看到如下的頁面:

而我們所需要的收錄次數(shù)就是 5,280,000 這段數(shù)字,我們接著查看頁面元素:

接著我們?cè)儆^察其他的搜索引擎可以發(fā)現(xiàn)都是類似的,所以我們的思路這個(gè)時(shí)候應(yīng)該就得出了,最后就是如何組織網(wǎng)址,這部分我們看地址欄?wd=site%3Awww.cnblogs.com%2F這段就知道怎么寫了。

稍等這個(gè)時(shí)候我們可能心急一個(gè)一個(gè)實(shí)現(xiàn),這樣后面我們就沒法集中的調(diào)用,同時(shí)也會(huì)影響以后的新增,所以我們要規(guī)定一個(gè)要實(shí)現(xiàn)收錄數(shù)功能的抽象類,這樣就能夠在不知曉具體實(shí)現(xiàn)的情況統(tǒng)一使用,并且還能夠在以后輕松的新增新的搜索引擎,而這種方式屬于策略模式(Stategry),下面我們來慢慢分析出這個(gè)抽象類的具體內(nèi)容。

首先每個(gè)實(shí)現(xiàn)這個(gè)抽象類的具體類都應(yīng)該是對(duì)應(yīng)某個(gè)搜索引擎,那么就需要有一個(gè)基本網(wǎng)址,同時(shí)還要留下占位符,比如根據(jù)上面百度的這個(gè)我們就得出這樣一個(gè)字符串

http://www.baidu.com/s?wd=site%3A{0}

其中{0}就是為真正需要檢索網(wǎng)址的占位符,獲取下載頁面的路徑是所有具體類都需要的所以我們直接將實(shí)現(xiàn)放在抽象類中,比如下面的代碼:

復(fù)制代碼 代碼如下:

/// <summary>
        /// 服務(wù)提供者
        /// </summary>
        protected String SearchProvider { get; set; }

        /// <summary>
        /// 需要檢索的網(wǎng)址
        /// </summary>
        protected String SiteUrl { get; set; }

        /// <summary>
        /// 搜索服務(wù)提供網(wǎng)址
        /// </summary>
        protected String BaseUrl { get; set; }

        /// <summary>
        /// 后頁面網(wǎng)址
        /// </summary>
        /// <param name="site">需要查詢的網(wǎng)址</param>
        /// <returns>拼接后的網(wǎng)址</returns>
        protected String GetDownUrl(string site)
        {
            return string.Format(BaseUrl, HttpUtility.UrlEncode(site));
        }

其中SiteUrl和SearchProvider是用來保存檢索網(wǎng)址和搜索引擎名稱。

上面我們說了將會(huì)利用WebClient來下載頁面,所以初始化WebClient的工作也在抽象類中完成,盡可能的減少重復(fù)代碼,而為了防止阻塞當(dāng)前線程所以我們采用了Async方法。

具體代碼如下所示:

復(fù)制代碼 代碼如下:

/// <summary>
        /// 查詢?cè)谠撍阉饕嬷械氖珍洿螖?shù)
        /// </summary>
        /// <param name="siteurl">網(wǎng)站URL</param>
        public void SearchIncludeCount(string siteurl)
        {
            SiteUrl = siteurl;
            WebClient client = new WebClient();
            client.Encoding = Encoding.UTF8;
            client.DownloadStringCompleted += DownloadStringCompleted;
            client.DownloadStringAsync(new Uri(GetDownUrl(siteurl)));
        }

        /// <summary>
        /// 檢索收錄次數(shù)的具體實(shí)現(xiàn)
        /// 子類必須要實(shí)現(xiàn)該方法
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected abstract void DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e);

當(dāng)WebClient完成下載后將會(huì)回調(diào)DownloadStringCompleted方法,而這個(gè)方法的是抽象方法也就意味著具體類必須要實(shí)現(xiàn)這個(gè)方法。

雖然我們內(nèi)部的實(shí)現(xiàn)是異步的但是對(duì)于其他開發(fā)者調(diào)用這個(gè)方法還是同步的,所以我們就需要借助委托因此我們還要新建一個(gè)委托類型:

復(fù)制代碼 代碼如下:

/// <summary>
        /// 當(dāng)完成一個(gè)網(wǎng)站的收錄查詢后回調(diào)
        /// </summary>
        public Action<SiteIncludeCountResult> OnComplatedOneSite { get; set; }

其中SiteIncludeCountResult的結(jié)構(gòu)如下所示:

復(fù)制代碼 代碼如下:

/// <summary>
    /// 用于網(wǎng)站收錄中委托的參數(shù)
    /// </summary>
    public class SiteIncludeCountResult
    {
        /// <summary>
        /// 收錄次數(shù)
        /// </summary>
        public long IncludeCount { get; set; }

        /// <summary>
        /// 搜索引擎類型
        /// </summary>
        public String SearchType { get; set; }

        /// <summary>
        /// 網(wǎng)站URL
        /// </summary>
        public String SiteUrl { get; set; }
}

最后還有一個(gè)方法用于DownloadStringCompleted完成后回調(diào)OnComplatedOneSite委托:
        /// <summary>
        /// 完成處理后調(diào)用該方法將結(jié)果返回
        /// </summary>
        /// <param name="result">網(wǎng)址的收錄數(shù)結(jié)果</param>
        protected void SetCompleted(SiteIncludeCountResult result)
        {
            if (OnComplatedOneSite != null)
                OnComplatedOneSite(result);
        }

這樣我們需要的抽象類就完成了,下面我們就可以開始實(shí)現(xiàn)第一個(gè)了,通過上面的截圖我們可以發(fā)現(xiàn)要匹配這段字符串的正則表達(dá)式很簡(jiǎn)單:

復(fù)制代碼 代碼如下:

百度為您找到相關(guān)結(jié)果約([\w,]+?)個(gè)

最后再將獲取的字符串去掉逗號(hào)就可以強(qiáng)制轉(zhuǎn)換了,這樣結(jié)果就出來了,具體實(shí)現(xiàn)就像下面這樣:
復(fù)制代碼 代碼如下:

/// <summary>
    /// 百度網(wǎng)站收錄次數(shù)查詢
    /// </summary>
    public class BaiDuSiteIncludeCount : SiteIncludeCountBase
    {
        public BaiDuSiteIncludeCount()
        {
            BaseUrl = "http://www.baidu.com/s?wd=site%3A{0}";
            SearchProvider = "百度";
        }

        protected override void DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
        {
            var result = new SiteIncludeCountResult();
            result.SiteUrl = SiteUrl;
            result.SearchType = SearchProvider;
            result.IncludeCount = 0;
            Regex reg = new Regex(@"百度為您找到相關(guān)結(jié)果約([\w,]+?)個(gè)", RegexOptions.IgnoreCase | RegexOptions.Singleline);
            var matchs = reg.Matches(e.Result);
            if (matchs.Count > 0)
            {
                string count = matchs[0].Groups[1].Value.Replace(",", "");
                result.IncludeCount = long.Parse(count);
            }
            SetCompleted(result);
        }
}

以此類推,其他的都是按照這種就可以了,有興趣的可以下載我的源碼查看。

五、關(guān)鍵詞排名

我們按照之前的思路,還是要先規(guī)定一個(gè)抽象類,但是其結(jié)構(gòu)跟上面的抽象類很相似,所以筆者這里直接給出具體的代碼:

復(fù)制代碼 代碼如下:

/// <summary>
    /// 實(shí)現(xiàn)關(guān)鍵詞查詢必須繼承該類
    /// </summary>
    public abstract class KeyWordsSeoBase
    {
        protected String BaseUrl { get; set; }

        protected String SearchProvider { get; set; }

        protected String GetDownUrl(string keyword, string site, long current)
        {
            return String.Format(BaseUrl, HttpUtility.UrlEncode(keyword), current);
        }

        protected void SetCompleted(KeyWordsSeoResult result)
        {
            if (OnComplatedOneKeyWord != null)
            {
                OnComplatedOneKeyWord(result);
            }
        }

        /// <summary>
        /// 完成一個(gè)關(guān)鍵詞的查詢后回調(diào)該委托
        /// </summary>
        public Action<KeyWordsSeoResult> OnComplatedOneKeyWord { get; set; }

        /// <summary>
        /// 查詢指定關(guān)鍵詞和網(wǎng)站在該搜索引擎中的排行
        /// 子類需要重寫該方法
        /// </summary>
        /// <param name="keywords">關(guān)鍵詞</param>
        /// <param name="site">網(wǎng)站URL</param>
        public abstract void SearchRanking(IEnumerable<string> keywords, string site,long count);
}

最大的區(qū)別在于具體的實(shí)現(xiàn)全部集中在SearchRanking中,通過keywords參數(shù)可以看出我們會(huì)支持多個(gè)關(guān)鍵詞的查詢,最后不同的就是下載路徑的組織,因?yàn)樯婕暗椒撍远嗔艘粋€(gè)參數(shù)。

其中KeyWordsSeoResult的結(jié)構(gòu)如下所示:

復(fù)制代碼 代碼如下:

/// <summary>
    /// 用于關(guān)鍵詞排行查詢的委托參數(shù)
    /// </summary>
    public class KeyWordsSeoResult
    {
        /// <summary>
        /// 搜索引擎類型
        /// </summary>
        public String SearchType { get; set; }

        /// <summary>
        /// 關(guān)鍵詞
        /// </summary>
        public String KeyWord { get; set; }

        /// <summary>
        /// 排行
        /// </summary>
        public long Ranking { get; set; }
    }

廢話不多說,我們來看百度的搜索結(jié)果頁:

以上是筆者在百度中搜索程序員的排名第九個(gè)的html結(jié)構(gòu),或許你會(huì)覺得很簡(jiǎn)單只要獲取div的id以及網(wǎng)址就可以了,但是很多搜索引擎的路徑并不是直接的路徑,而是會(huì)先鏈到百度然后重定向的,如果非要匹配我們就需要多做一件事就是訪問這個(gè)路徑得到真實(shí)的路徑,那樣就會(huì)加大這中間的等待時(shí)間,所以筆者采用的是直接截取上圖中的<span class=”g”>后面的內(nèi)容,這樣就避免了一次請(qǐng)求。(不知道當(dāng)初筆者怎么想的,實(shí)現(xiàn)的時(shí)候并沒有采用id那個(gè)值而是在內(nèi)部遞增,估計(jì)這個(gè)id的序號(hào)在翻頁后會(huì)出現(xiàn)問題吧),最后亮出我們神圣的正則表達(dá)式:

復(fù)制代碼 代碼如下:

<span\s+class=""(?:g|c-showurl)"">([^/&]*)

以為這樣就大公告成了?錯(cuò)了,在某些結(jié)果里面百度會(huì)給這個(gè)網(wǎng)址加上b標(biāo)簽,而筆者則采用全部趕盡殺絕的方式,利用正則全部刪掉(反正又不看頁面,只要拿到我想要的就OK了),實(shí)現(xiàn)的時(shí)候我們可不能直接實(shí)現(xiàn)多個(gè)關(guān)鍵詞的判明,應(yīng)該是實(shí)現(xiàn)一個(gè)關(guān)鍵詞的,然后循環(huán)調(diào)用即可了,下面是筆者的單個(gè)關(guān)鍵詞的實(shí)現(xiàn):

復(fù)制代碼 代碼如下:

protected KeyWordsSeoResult SearchFunc(string key, string siteurl, long total)
        {
            var result = new KeyWordsSeoResult();
            result.KeyWord = key;
            result.Ranking = total + 1;
            var reg = new Regex(@"<span\s+class=""(?:g|c-showurl)"">([^/&]*)", RegexOptions.IgnoreCase | RegexOptions.Singleline);
            var replace = new Regex("</?b>", RegexOptions.IgnoreCase | RegexOptions.Singleline);
            var client = new WebClient();
            long current = 0;
            long pos = 0;
            for (; ; )
            {
                String url = GetDownUrl(key, siteurl, current);
                String downstr = client.DownloadString(url);
                downstr = replace.Replace(downstr, "");
                var matchs = reg.Matches(downstr);
                foreach (Match match in matchs)
                {
                    pos++;
                    string suburl = match.Groups[1].Value;
                    try
                    {
                        if (suburl.ToLower() == siteurl.ToLower())
                        {
                            result.Ranking = pos;
                            return result;
                        }
                    }
                    catch
                    {
                        continue;
                    }
                }
                current += 10;
                if (current > total)
                {
                    current -= 10;
                    if (current >= total)
                    {
                        break;
                    }
                    current = total;
                }
            }
            return result;
        }

 注意for循環(huán)的結(jié)束部分,這里是用來處理分頁的,以翻到下一頁繼續(xù)檢索。其他的大體部分都跟筆者說的一樣,下載頁面->正則匹配->根據(jù)匹配結(jié)果判斷。剩下的就是SearchRanking的實(shí)現(xiàn),就是循環(huán)關(guān)鍵詞,只是這里筆者為每個(gè)搜索引擎新建線程來實(shí)現(xiàn),當(dāng)然這不怎么好,所以讀者可以改用更好的方式來做:

 

復(fù)制代碼 代碼如下:

 public override void SearchRanking(IEnumerable<string> keywords, string site, long count)
        {
            new Thread(() =>
            {
                foreach (string key in keywords)
                {
                    KeyWordsSeoResult result = SearchFunc(key, site, count);
                    result.SearchType = SearchProvider;
                    SetCompleted(result);
                }
            }).Start();
        }
 

六、統(tǒng)一管理

有了這些我們就可以寫出一個(gè)簡(jiǎn)潔的類來負(fù)責(zé)管理,筆者這里直接給出代碼:

復(fù)制代碼 代碼如下:

/// <summary>
    /// 查詢網(wǎng)站的收錄次數(shù)以及排行
    /// </summary>
    public class RankingAndIncludeSeo
    {
        /// <summary>
        /// 關(guān)鍵詞列表
        /// </summary>
        public IList<KeyWordsSeoBase> KeyWordsSeoList { get; private set; }
       
        /// <summary>
        /// 收錄次數(shù)列表
        /// </summary>
        public IList<SiteIncludeCountBase> SiteIncludeCountList { get; private set; }

        public RankingAndIncludeSeo()
        {
            KeyWordsSeoList = new List<KeyWordsSeoBase>();
            SiteIncludeCountList = new List<SiteIncludeCountBase>();
        }

        /// <summary>
        /// 當(dāng)完成一個(gè)關(guān)鍵詞的查詢后回調(diào)該委托
        /// </summary>
        public Action<KeyWordsSeoResult> OnComplatedAnyKeyWordsSearch { get; set; }

        /// <summary>
        /// 當(dāng)完成一個(gè)網(wǎng)站的收錄次數(shù)查詢后回調(diào)該委托
        /// </summary>
        public Action<SiteIncludeCountResult> OnComplatedAnySiteIncludeSearch { get; set; }

        /// <summary>
        /// 查詢網(wǎng)址的排行
        /// </summary>
        /// <param name="keywords">關(guān)鍵詞組</param>
        /// <param name="siteurl">查詢的網(wǎng)址</param>
        /// <param name="count">最大限制排行數(shù)</param>
        public void SearchKeyWordsRanking(IEnumerable<string> keywords, string siteurl, long count = 100)
        {
            if (keywords == null)
                throw new ArgumentNullException("keywords", "必須存在關(guān)鍵詞");
            if (siteurl == null)
                throw new ArgumentNullException("siteurl", "必須存在網(wǎng)站URL");
            foreach (KeyWordsSeoBase kwsb in KeyWordsSeoList)
            {
                kwsb.OnComplatedOneKeyWord = kwsb.OnComplatedOneKeyWord ?? OnComplatedAnyKeyWordsSearch;
                kwsb.SearchRanking(keywords, siteurl, count);
            }
        }

        /// <summary>
        /// 查詢網(wǎng)址的收錄次數(shù)
        /// </summary>
        /// <param name="siteurl">查詢的網(wǎng)址</param>
        public void SearchSiteIncludeCount(string siteurl)
        {
            if (siteurl == null)
                throw new ArgumentNullException("siteurl", "必須指定網(wǎng)站");
            foreach (SiteIncludeCountBase sicb in SiteIncludeCountList)
            {
                sicb.OnComplatedOneSite = sicb.OnComplatedOneSite ?? OnComplatedAnySiteIncludeSearch;
                sicb.SearchIncludeCount(siteurl);
            }
        }
}

RankingAndIncludeSeo中提供了公共的委托,如果單個(gè)搜索引擎沒有提供委托那么就采用這個(gè)公共的,如果已經(jīng)指定了單獨(dú)的委托就不會(huì)被賦值了,而其他開發(fā)者調(diào)用的時(shí)候只要向KeyWordsSeoList和SiteIncludeCountList中添加已經(jīng)實(shí)現(xiàn)的類就可以了,方面其他開發(fā)者開發(fā)出自己的實(shí)現(xiàn)并加入其中。

七、小節(jié)

這篇隨筆總的來說并不是講述什么高端技術(shù)的,僅僅只是提供一種大致的思路以及結(jié)構(gòu)上的設(shè)計(jì),如果讀者需要應(yīng)用于實(shí)際開發(fā)中,最好加以驗(yàn)證,筆者并不能保證關(guān)鍵詞的排名沒有任何誤差,因?yàn)樗阉鞯慕Y(jié)果會(huì)由于任何因素發(fā)生改變。

^.^我是源碼下載

相關(guān)文章

  • c#如何利用定時(shí)器自動(dòng)備份數(shù)據(jù)庫詳解

    c#如何利用定時(shí)器自動(dòng)備份數(shù)據(jù)庫詳解

    在開發(fā)過程當(dāng)中,你一定遇到文件損壞活或丟失的煩惱,而每天備份又很麻煩,你只要設(shè)置每天備份的時(shí)間,并將程序加入啟動(dòng)項(xiàng)中,就可以自動(dòng)完成備份,這篇文章主要給大家介紹了關(guān)于c#如何利用定時(shí)器自動(dòng)備份數(shù)據(jù)庫的相關(guān)資料,需要的朋友可以參考下
    2021-10-10
  • C#刪除文件目錄或文件的解決方法

    C#刪除文件目錄或文件的解決方法

    本篇文章是對(duì)C#中如何刪除文件目錄或文件的解決方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C#檢測(cè)DataSet是否為空的方法

    C#檢測(cè)DataSet是否為空的方法

    這篇文章主要介紹了C#檢測(cè)DataSet是否為空的方法,涉及C#操作DataSet的技巧,非常簡(jiǎn)單實(shí)用,需要的朋友可以參考下
    2015-04-04
  • unity實(shí)現(xiàn)手機(jī)端搖桿控制人物移動(dòng)

    unity實(shí)現(xiàn)手機(jī)端搖桿控制人物移動(dòng)

    這篇文章主要為大家詳細(xì)介紹了unity實(shí)現(xiàn)手機(jī)端搖桿控制人物移動(dòng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • 混合語言編程—C#使用原生的Directx和OpenGL繪圖的方法

    混合語言編程—C#使用原生的Directx和OpenGL繪圖的方法

    本文要說的是混合C#和C/C++語言編程,在C#的Winform和WPF下使用原生的Direct和OpenGL進(jìn)行繪圖
    2013-09-09
  • C#中圖片的Base64編碼與解碼轉(zhuǎn)換詳解

    C#中圖片的Base64編碼與解碼轉(zhuǎn)換詳解

    在C#中,我們可以使用Base64編碼將圖片轉(zhuǎn)換為字符串,也可以將Base64編碼的字符串轉(zhuǎn)換回圖片,這通常用于在需要文本表示圖像數(shù)據(jù)的場(chǎng)合(例如在Web開發(fā)中傳輸圖像數(shù)據(jù)),本文介紹了C#中圖片的Base64編碼與解碼轉(zhuǎn)換,需要的朋友可以參考下
    2024-12-12
  • C# SimpleJSON字典反序列化實(shí)戰(zhàn)教程

    C# SimpleJSON字典反序列化實(shí)戰(zhàn)教程

    C# 解析JSON道路千萬條,其中最流行的還是由Newtonsoft出品的Json.NET,只需要將Json的結(jié)構(gòu)做成C#的class,即可實(shí)現(xiàn)完美的序列化和反序列化,這篇文章主要介紹了C# SimpleJSON字典反序列化實(shí)戰(zhàn)教程,需要的朋友可以參考下
    2024-03-03
  • 巧用Dictionary實(shí)現(xiàn)日志數(shù)據(jù)批量插入

    巧用Dictionary實(shí)現(xiàn)日志數(shù)據(jù)批量插入

    這篇文章主要介紹了巧用Dictionary實(shí)現(xiàn)日志數(shù)據(jù)批量插入,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-02-02
  • c#文件操作示例帶詳細(xì)注釋

    c#文件操作示例帶詳細(xì)注釋

    System.IO.Directory類和System.DirectoryInfo類主要提供關(guān)于目錄的各種操作,使用時(shí)需要引用System.IO命名空間。下面通過程序?qū)嵗齺斫榻B其主要屬性和方法
    2014-01-01
  • c# 插入數(shù)據(jù)效率測(cè)試(mongodb)

    c# 插入數(shù)據(jù)效率測(cè)試(mongodb)

    這篇文章主要介紹了c# 插入數(shù)據(jù)效率測(cè)試(mongodb),插入的速度要比Mysql和sqlserver都要快需要的朋友可以參考下
    2018-03-03

最新評(píng)論

新和县| 横峰县| 武威市| 日照市| 新郑市| 喀喇沁旗| 卫辉市| 察隅县| 黄骅市| 云浮市| 彝良县| 新竹县| 肃宁县| 全州县| 大渡口区| 桂平市| 淄博市| 河曲县| 胶南市| 林周县| 婺源县| 山西省| 郴州市| 绥江县| 盐边县| 正蓝旗| 剑河县| 云梦县| 兴城市| 肃宁县| 浮梁县| 新疆| 开化县| 城市| 南郑县| 东城区| 台山市| 磐石市| 沐川县| 阿巴嘎旗| 聂荣县|