在UWP中,如果使用.NET framework4.5以上或者UWP中的.NET Core的话,就可以使用HTTPClient进行更方便的网络访问。
在本次项目中,选择“快递100”网站进行爬取。
首先随便查询一个快递,在F12开发人员工具中,可以发现请求的url为
http://www.kuaidi100.com/query?type={0}&postid={1}", com, ExpressNum
其中com为公司的代码,如“顺丰”则代替为shunfeng,
postid为快递单号。
获取到正确的url后,需要解析返回的json数据。
推荐使用开源的Newtonsoft.Json;免得在反序列化的路上折磨自己。
过程代码:
var client = new HttpClient();
//快递单号格式http://www.kuaidi100.com/query?type=shunfeng&postid=xxxxxxxx
var response = await client.GetAsync(String.Format("http://www.kuaidi100.com/query?type={0}&postid={1}", com, ExpressNum));
var result = await response.Content.ReadAsStringAsync();
ExpressData reExpress = (ExpressData)JsonConvert.DeserializeObject<ExpressData>(result);
比较容易理解过程。注意GetAsync为异步方法,所以需要await,函数也声明为async
class ExpressItem
{
//com为快递公司的字符串转换,ExpressNum为快递单号,userInfo为数据绑定的集合。
public static async void GetResponse(string com, string ExpressNum, ObservableCollection<Detail> userInfo)
{
var client = new HttpClient();
var response = await client.GetAsync(String.Format("http://www.kuaidi100.com/query?type={0}&postid={1}", com, ExpressNum));
var result = await response.Content.ReadAsStringAsync();
ExpressData reExpress = (ExpressData)JsonConvert.DeserializeObject<ExpressData>(result);
userInfo.Clear();
//倒序显示。
for (int i = reExpress.data.Count - 1; i >= 0; --i)
//reExpress.data.ForEach(p => userInfo.Add(p));
userInfo.Add(reExpress.data[i]);
}
}
public class ExpressData
{
public int status;
public int errCode;
public string message;
public string html;
public int mailTo;
public string tel;
public string expTextName;
public List<Detail> data;
}
public class Detail
{
public string time;
public string context;
}
这个是根据获得的json数据包含的内容设置的,类型也是自选,因为返回的序列化数据为json字符串。
可以在在线json解析网站先观察一下。
使用jsonconverter后,可以获得我们想要的类型的数据。
如果是在python中使用,获得json字符串后
eval(result)
即可。
至此,一个快递查询核心已完毕,剩余应当是异常处理等,不再赘述。