Xamarin小说阅读器系列(五)-编写搜索页2

 jvxiang   2018-03-08 13:15   1,534 人阅读  0 条评论

这几天由于弄了个腾讯云的学生服务器,需要转备案,所以更新可能会慢起来,另外最近在出差,不是搞这玩意,所以更新速度就更慢了~

开始

上篇文章我们将搜索页的xaml写完了,但是关键内容我们还没有涉及,就是真正码代码的过程。

获取热门搜索

首先,我们打开要抓取的页面,这里我们用book.km.com作为我们抓取的目标站,在目标站中寻找热门搜索最好的抓取的地方。

经过一番寻找,我们发现在搜索框点击,会出现10个热门搜索,正好符合我们的要求,而且使用了json+ajax获取内容,处理起来相对简单,于是我们决定使用这10个搜索结果作为热门搜索。

使用httpwebrequest获取网页内容并用json.net解析

由于我们使用了.net standard 2.0而不是之前的PCL,所以我们可以用跟.net 4.6.1相同的方式获取网页内容,不再需要考虑PCL与.net的差异。所以我们这里使用了苏飞论坛的HttpHelper来获取网页内容。这个帮助类使用httpwebrequest获取网页内容,并且已经处理了编码之类的问题。可以省我们不少事,并且是一个开源的单类文件,方便我们对其进行修改。

具体用法也很简单,先new一个HttpItem,然后在HttpItem中添加需要的信息就好了。一般我们的爬虫除了必须的URL之外,还需要添加Host,Refer,UA等元素,才能保证我们的爬虫被认为是正常的。

所以我们使用F12打开开发者工具,然后进入Network选项卡,点击搜索框,发现浏览器向服务端发送了一个AJAX请求,我们看请求头。

从请求头我们看到,URL为http://book.km.com/index.php?c=search&a=,上送了Accept、Accept-Encoding、Accept-Language、Connection、Cookie、Host、Referer、User-Agent、X-Requested-With这几个参数。这其中很多参数都有默认值或者可以省略,比如User-Agent是有默认值的,Cookie在非登录的情况下一般不需要送。我们这里着重只需要送Host、Referer就可以了。构造HtttpItem的方法如下:

HttpItem hi = new HttpItem(){ Referer = http://book.km.com/", Host = "book.km.com"};

调用
HttpResult result = new HttpHelper().GetHtml(hi)

就可以获取到result,其中result.Html就是我们要爬取的网页内容。

但是这个网站貌似做了一些处理,直接爬取发现返回的Html为空,所以我们继续对比头,发现其还送了X-Requested-With,这个是一般是浏览器加上标识是Ajax调用的,大部分网站不需要添加此头,这里我们添加上做一下实验。

hi.Header.Add("X-Requested-With", "XMLHttpRequest");

再次请求,发现可以获取到返回的json了。我们观察json的结构,
{ "from": "rank", "list": [{ "title": "<strong>恶魔总裁霸道宠:老婆,太惹火<\/strong>", "title_def": "恶魔总裁霸道宠:老婆,太惹火", "link": "\/shuku\/1413701.html" }, { "title": "<strong>斗破苍穹<\/strong>", "title_def": "斗破苍穹", "link": "\/shuku\/165352.html" }, { "title": "<strong>最强神医混都市<\/strong>", "title_def": "最强神医混都市", "link": "\/shuku\/1364517.html" }, { "title": "<strong>少帅你老婆又跑了<\/strong>", "title_def": "少帅你老婆又跑了", "link": "\/shuku\/1410181.html" }, { "title": "<strong>乡村小神医<\/strong>", "title_def": "乡村小神医", "link": "\/shuku\/1392329.html" }, { "title": "<strong>都市奇门医圣<\/strong>", "title_def": "都市奇门医圣", "link": "\/shuku\/1288197.html" }, { "title": "<strong>武神至尊<\/strong>", "title_def": "武神至尊", "link": "\/shuku\/1338317.html" }, { "title": "<strong>绝世武魂<\/strong>", "title_def": "绝世武魂", "link": "\/shuku\/1390685.html" }, { "title": "<strong>绝色总裁的贴身神医<\/strong>", "title_def": "绝色总裁的贴身神医", "link": "\/shuku\/1413409.html" }, { "title": "<strong>恶魔少爷别吻我<\/strong>", "title_def": "恶魔少爷别吻我", "link": "\/shuku\/289996.html" }]}

发现所有的节点都在list节点下,因为我们不需要html,所以可以直接使用title_def作为我们的名字。这里的JsonPath为$.list[*].title_def(关于JsonPath,请自行百度用法)

我们使用Json.net使用JsonPath来获取内容:

JObject o = JObject.Parse(json);var tokens = o.SelectTokens(jpath);tokens.Select(x => x.ToString()).ToList();

就可以获取到所有的10个最热搜索。我们将其展示在界面上即可。
HotItems = new ObservableCollection<HotSearchEntity>(返回的List);

 

同理,搜索页面也是相同的,只不过搜索的时候URL多了一个搜索值,比如我搜索q,得到的URL为http://book.km.com/index.php?c=search&a=thinkup&keyword=q&atype=

获取搜索的json与解析搜索结果与热门搜索完全相同。

本文地址:https://www.jvxiang.com/xamarin小说阅读器系列(五)-编写搜索页2.html
版权声明:本文为原创文章,版权归 jvxiang 所有,欢迎分享本文,转载请保留出处!
NEXT:已经是最新一篇了

 发表评论


表情