采用WPF框架构造软件交互界面,用的是开源框架库Material Design(Github地址)
使用方法
- 登录新浪微博,进入页面https://s.weibo.com/weibo?q=%E5%88%86%E6%89%8B&nodup=1
- 按F12打开开发者工具,点击Network,然后F5刷新页面
- 找到请求weibo?q=%E5%88%86%E6%89%8B&nodup=1
- 复制Request Header中的Cookie
- 打开软件,粘贴cookie,点击开始抓取
- 享受单身狗的快乐叭
开发笔记
1.Cookie值错误问题
在C#中,new Cookie(string name,string value)中,value中的字符串是不能包含逗号或分号的。
解决方案:将逗号代替为%2C
str = str.Replace(",", "%2C");
2.调用线程无法访问此对象,因为另一个线程拥有该对象。
该问题是因为,多线程之间,主线程是被保护的,即WPF窗口是主线程,而我通过System.Timers.Timer设置定时获取的函数Theout则为新建的子线程,访问主线程中的窗口控件则报错
解决方案:使用Dispatcher.Invoke方法,其中创建Dispatcher的线程才可以直接访问DispatcherObject,所以只要在Dispatcher.Invoke创建一个Action委托就可以完美的解决问题了
TxtCookie.Dispatcher.Invoke(
new Action(
delegate
{
GetWeiBoData();//抓取数据
}
)
);
3.DataGrid数据源问题及刷新问题
第一次使用WPF中的DataGrid控件,查询了微软相关文档,只需要将DataGridTextColumn中的Binding属性设置为对应数据类(假设为A)的成员名即可。然后,定义一个List<类A>对应数据容器,放入类A对象,然后
将DataGrid.ItemsSoure赋值为这个List容器对象就可以了
DataGrid.AutoGenerateColumns = false;//不自动创建列
DataGrid.ItemsSource = datas;
那么此时又遇到一个大问题,当我获取到新的微博消息,并且将类A对象放到集合中,DataGrid控件却无任何变化,重新为其ItemsSource赋值,也无法达到目的。最终,我通过查阅资料发现,WPF中的Binding是很复杂的,像我这样的操作称之为“单向绑定”,即后台集合的数据是不会实时显示在前端页面的。
解决方案:不使用List容器,而采用ObservableCollection容器,问题轻松解决!
ObservableCollection<WeiboData> datas = new ObservableCollection<WeiboData>();
本文由 admin 创作,采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为: Dec 25, 2019 at 10:53 am