模拟登录微博通,抓取新浪微博c#
在前天我到公司就接到一个惊人的消息,说是新浪1.0的搜索接口关闭了,那我们的业务岂不是受很大影响,这个事太紧急了,大家在一起商讨该怎么办,跟新浪买2.0的接口肯定时间很长,最后决定抓取新浪网页的,新浪网页未登录状态10分钟只能抓取不到200次,然后就让你手动输入验证码了,很显然,这个方案有落空了。然后我们想是否有其他的办法,后来去看孔明和微博通,这俩家居然正常跑,就把我乐坏了。稍微研究了下,发现抓取还很容易,然后决定搞微博通的。为什么放弃孔明了,因为孔明的微博默认都是不带图片的,你还得抓一次,一次带图片的,一次不带图片的,然后倆者拼在一起才算有效数据。
废话少说,下面的东西就在俩个小时内完成了。
一、首先我们要提到模拟登录微博通,我用fiddler查看了下,发现登录走下面三个流程:
1、第一个请求地址:http://www.wbto.cn/?c=login&m=index_login ,这个请求是Post提交的,生成一个用户身份唯一标识的cookie,但是这个cookie不全,需要下面一个请求来补全,那么下面一个请求的地址从哪来了?从第一个post请求返回
2、第二个请求地址:http://www.wbto.cn/bbs/api/uc.php?time=1350530131&code=9888GfRzqS0FVoZFT1EoH6UsF0JklnvPdaiKrhN%2FD5BPYdzdwzyBTIbk5roC8YVn9AeTjsNFDqD1LONBwdGCQqjL%2BqX6uqSXUT6w9Si6JOlNA5BFLYEHIfl1A96Cf5bACA4O447xUah%2FM9JxMc47qOFtlnjjqWSRb%2FNPNMrJsxjCuex8V6Wri%2Ft8ZP7Q87s8,这个请求地址在上面描述了,是第一个Post请求返回的,下面代码里会演示如何获取。
3、第三个请求地址:http://www.wbto.cn 这个是登录地址,其实第二个请求完成后,用户身份标识的cookie已经完全形成,那么拿着这个cookie就可以访问任何一个页面了,包括首页以及我们主要关心的微博搜索页。
下面来上代码,完成上面的描述,很简单,如下:
(1 )我们先定义一个全局变量:
private static CookieContainer cc = new CookieContainer();
(2 )模拟第一个post请求:
/// <summary>/// 模拟post请求/// </summary>/// <param name="url">Post请求后会返回下一次get请求的地址</param>/// <param name="cookie">返回的cookie</param>/// <param name="nick">用户昵称/邮箱</param>/// <param name="password">用户登录密码</param>/// <returns></returns>public void SimulatePost(string nick,string password, out string url,out string cookie){HttpWebRequest req = null;HttpWebResponse rep = null;Stream stream = null;try{string postdata = "action=submit&to=/&username={0}&password={1}&cookietime=2592000";postdata = string.Format(postdata, nick, password); //拼装数据string LoginUrl = "http://www.wbto.cn/?c=login&m=index_login"; //登录地址#region 信息头req = (HttpWebRequest)WebRequest.Create(LoginUrl);req.Method = "POST";req.ContentType = "application/x-www-form-urlencoded";byte[] postdatabytes = Encoding.UTF8.GetBytes(postdata);req.ContentLength = postdatabytes.Length;req.Referer = "http://www.wbto.cn/";req.AllowAutoRedirect = false;req.CookieContainer = cc;req.KeepAlive = true;#endregion#region 提交数据并返回COOKIEstream = req.GetRequestStream();stream.Write(postdatabytes, 0, postdatabytes.Length);rep = (HttpWebResponse)req.GetResponse();cc = req.CookieContainer;cookie = req.CookieContainer.GetCookieHeader(req.RequestUri); //字符串形式的COOKIE跟你在浏览器看到的一样StreamReader stre = new StreamReader(rep.GetResponseStream(), Encoding.GetEncoding("utf-8"));#endregionstring html = stre.ReadToEnd();url = html.Substring(html.IndexOf("src=\"") + 5, (html.IndexOf("\"", html.IndexOf("src=\"") + 5) - html.IndexOf("src=\"") - 5));rep.Close();stream.Close();}catch {if (rep != null){rep.Close();}if (stream != null){stream.Close();}url = null;cookie = null;}}
(3) 模拟第二个请求:
/// <summary>/// 模拟Get请求/// </summary>/// <param name="url">请求地址</param>/// <param name="cookie">cookie对象</param>/// <param name="cookieStr">cookie字符串</param>/// <param name="host">host,可选</param>/// <param name="newCookie">新的cookie字符串</param>/// <returns></returns>public string SimulateGet(string url, CookieContainer cookie,string cookieStr, string host,out string newCookie){string json = string.Empty;HttpWebRequest req = null;HttpWebResponse rep = null;Stream st = null;try{req = req = (HttpWebRequest)HttpWebRequest.Create(url);req.ContentType = "application/x-www-form-urlencoded";req.Method = "Get";req.Timeout = 1000 * 30;if (!string.IsNullOrEmpty(host))req.Host = host;req.Referer = "http://www.wbto.cn/?c=login&m=index_login";req.CookieContainer = cookie;req.Headers.Add("Cookie:" + cookieStr);rep = (HttpWebResponse)req.GetResponse();newCookie = req.CookieContainer.GetCookieHeader(req.RequestUri);st = rep.GetResponseStream();StreamReader stre = new StreamReader(st, Encoding.GetEncoding("utf-8"));json = stre.ReadToEnd();}catch{if (rep != null){rep.Close();}if (st != null){st.Close();}newCookie = null;}return json;}
这里讲一下,当我们第二个请求完成后,我前面讲过cookie已经完全形成了,这个时候你拿着这个cookie就可以访问任何一个页面了,所以聪明的你会发现,第二个方法是通用的,你可以接着用他请求其他的地址,只要传入正确的请求地址和cookie字符串即可。
下面贴上最后一段代码,是我测试用的,如下:
结束:搞定。这个只是一个简单的写法,各位朋友看着改即可。
模拟登录微博通,抓取新浪微博c#相关推荐
- python3爬虫系列23之selenium+腾讯OCR识别验证码登录微博且抓取数据
python3爬虫系列23之selenium+腾讯OCR识别验证码登录微博且抓取数据 1.前言 上一篇是一个 python3爬虫系列22之selenium模拟登录需要验证码的微博且抓取数据, 我们是首 ...
- 【Android+OkHttp3+Jsoup】 模拟登录教务系统 抓取课表和成绩
原文链接:https://blog.csdn.net/u013347241/article/details/52711018 今天这篇文章为大家带来的是模拟登录教务系统并抓取课表和成绩的详细实现过程. ...
- 【爬虫学习】Python登录微博并抓取微博热点信息
1.获取Cookie模拟登陆微博 注意:使用.find_element_by_id()公式时,注意selenium库版本,我自己使用的时Selenium 3.141版本 2.爬取微博热搜榜信息 完整代 ...
- java登录抓取网页_java模拟登录内部系统抓取网页内容
@Component public class Login extends BaseJobs { SimpleDateFormat sdf = new SimpleDateFormat("y ...
- python 模拟微信浏览器请求_如何用Python模拟登录微信,抓取所有好友个人信息!微信后台很强...
微信模拟登录的过程比较复杂,当然不管怎么样方法都是万变不离其宗,我们还是使用fiddler抓包工具来模拟登录的过程. 好了,下面让我们一步一步的详细讲解一下如何实现的这个复杂的过程. 2.模拟获取二维 ...
- Python+selenium+firefox模拟登录微博并爬取数据(1
1:环境python3.5,最新 firefox,selenium-3.14.0. 本来准备用无界面的,但是感觉效果不好看出来所以先用有界面的浏览器来做.分几次来慢慢写.这节先配置好环境. 2:安装: ...
- python微博评论抓取_python抓取新浪微博评论并分析
1,实现效果 2,数据库 3.主要步骤 1,输入账号password,模拟新浪微博登陆 2,抓取评论页的内容 3.用正則表達式过滤出username,评论时间和评论内容 4,将得到的内容存入数据库 5 ...
- python爬取微博评论_python爬虫抓取新浪微博数据
需求分析 微博主页 抓取的内容包括:微博发布的时间,正文(仅提取文字),转发数,评论数,点赞数 抓取的内容 数据是怎么加载的 新浪微博的数据是用ajax异步下拉加载的,在chrome的调试模式下可捕捉 ...
- 测试开发Python培训:抓取新浪微博抓取数据-技术篇
测试开发Python培训:抓取新浪微博抓取数据-技术篇 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.在poptest的sele ...
最新文章
- 元旦去哪玩?用Python告诉你哪些景点爆满!
- MySQL主键与索引的联系和区别
- java 当前类_Java获取当前类名的两种方法
- 前端学习(2054)vue.js课程介绍
- 2017年3月27日上午学习日志
- mysql关闭12260端口_windows 如何查看端口占用情况?
- python二维图自动保存_Autodesk Inventor工程图自动保存PDF文件iLogic代码
- MCS-51单片机寻址方式详解
- scintilla下载地址及scintilla文档教程
- 悉尼大学计算机工程专业世界排名,悉尼大学世界排名及专业排名汇总(QS世界大学排名版)...
- pytorch保存模型pth_pytorch模型文件pth详解
- 【Microarchitecture of Intel and AMD CPU】 9 Sandy Bridge and Ivy Bridge pipeline 【9.8-9.10】
- c/c++中的转义字符
- 【CodeForces】Educational Codeforces Round 118 (Rated for Div. 2)【A-C】
- mosquitto 群晖下载_告诉你如何轻松解决NAS系统搬家任务,群晖系统的乾坤大挪移...
- 九宫重排 蓝桥杯c++ 题解 字符串hash+bfs
- 电子取证和司法鉴定笔记
- HTML和CSS中如何设置中文字体
- JAVA之Swing组件(常用)
- 五金模具设计制造完整的流程方式跟方法