一、查看代码 :

  

namespace ToutiaoSpider
{
class Program
{
static void Main(string[] args)
{
var db = Db.GetDataHelper();
db.CreateOrUpdateTable(typeof(Models.ArticleMonitorModule));
while (true)
{
var src = LoadSource();
try
{
//var item = GetItem(src);
//if (item != null)
//{
// try
// {
// db.Insert(item.ToArray());
// Console.WriteLine("Insert a row in :" + DateTime.UtcNow.AddHours(8).ToString("yyyy-MM-dd HH:mm:ss"));
// }
// catch (Exception ex)
// { Console.WriteLine("Insert to database error:" + ex.Message); }
//}
if (!Directory.Exists("C:\\TempFiles\\")) Directory.CreateDirectory("C:\\TempFiles\\");
File.WriteAllText("C:\\TempFiles\\" + DateTime.Now.ToString("yyyy_MM_dd_HH_mm_ss") + ".html", src);
}
catch (Exception ex) { Console.WriteLine("Get item error:" + ex.Message); }
Thread.Sleep( * * );
}
}
static List<Models.ArticleMonitorModule> GetItem(string src)
{
List<Models.ArticleMonitorModule> lst = new List<ArticleMonitorModule>();
HtmlAgilityPack.HtmlDocument docs = new HtmlAgilityPack.HtmlDocument();
docs.LoadHtml(src);
var jsonText = docs.DocumentNode.InnerText;
var json = (JObject)JsonConvert.DeserializeObject(jsonText);
if (json["message"].Value<string>() == "success")
{
var token = json.GetValue("data");
if (token == null) return lst;
foreach (var data in token)
{
var title = data["title"]?.Value<string>();
//if (title != "中国与巴拿马建立外交关系") continue;
var go_detail_count = data["go_detail_count"]?.Value<int>();
var url = data["display_url"]?.Value<string>();
var itemId = data["item_id"]?.Value<string>();
var comments_count = data["comments_count"]?.Value<int>();
var site = "toutiao.com";
ArticleMonitorModule item = new ArticleMonitorModule()
{
__id = Guid.NewGuid(),
article_id = itemId,
site = site,
url = url,
comment_count = comments_count,
visit_count = go_detail_count,
fetch_time = DateTime.UtcNow.AddHours(),
like_count = null
};
lst.Add(item);
}
}
return lst;
}
static IWebDriver CreateDriver()
{
var service = PhantomJSDriverService.CreateDefaultService();
var driver = new OpenQA.Selenium.PhantomJS.PhantomJSDriver(service, new PhantomJSOptions(), TimeSpan.FromSeconds());
//var service = ChromeDriverService.CreateDefaultService();
//var driver = new ChromeDriver(service, new ChromeOptions(), TimeSpan.FromSeconds(120));
//var service = OpenQA.Selenium.Firefox.FirefoxDriverService.CreateDefaultService();
//var driver = new OpenQA.Selenium.Firefox.FirefoxDriver(service, new OpenQA.Selenium.Firefox.FirefoxOptions(), TimeSpan.FromSeconds(120));
return driver;
}
static string LoadSource()
{
var driver = CreateDriver();
var nav = driver.Navigate();
var cookies = driver.Manage().Cookies;
//nav.GoToUrl("http://www.toutiao.com/c/user/favourite/?page_type=2&user_id=61045799395&max_behot_time=0&count=20&as=A15569B3CF98ED7&cp=593F781EDDB7FE1&max_repin_time=0");
int retryCount = ;
while (true)
{
try
{
//nav.GoToUrl("http://www.toutiao.com/c/user/favourite/?page_type=2&user_id=61045799395&max_behot_time=0&count=20&as=A14529438F1A7A4&cp=593F3A47DAD44E1&max_repin_time=0");
var url = "http://is.snssdk.com/2/article/information/v21/?version_code=6.1.6&app_name=news_article&vid=C5585644-2731-495E-8CF2-B42BBA4D7780&device_id=35980279488&channel=App%20Store&resolution=1125*2001&aid=13&ab_version=120431,134942,136400,126064,122834,130106,126068,128826,134127,136030,137117,136268,137571,126070,136111,116022,135623,125502,137069,125174,135489,133019,137083,126059,137452,135631,136930,122948,137474,137431,31210,133013,135290,131207,114338,133770&ab_feature=z1&openudid=f870822c71509e95ee8f58db8b1d70ce9cb14713&live_sdk_version=1.6.5&idfv=C5585644-2731-495E-8CF2-B42BBA4D7780&ac=WIFI&os_version=10.3.2&ssmix=a&device_platform=iphone&iid=11267657395&ab_client=a1,f2,f7,e1&device_type=iPhone%206S%20Plus&idfa=B1742B5B-DF14-44EF-A325-362873389ABA&aggr_type=1&article_page=0&device_id=35980279488&from_category=news_entertainment&group_id=6411002681368035586";
nav.GoToUrl(url);
var uri = new Uri(url);
cookies.AddCookie(new Cookie("csrftoken", "b9e36219cad78dfe6a1c687d6b368b52", uri.DnsSafeHost, "/", DateTime.Now.AddYears()));
//cookies.AddCookie(new Cookie("csrftoken", "b9e36219cad78dfe6a1c687d6b368b52", "toutiao.com", "/", DateTime.Now.AddYears(1)));
//cookies.AddCookie(new Cookie("CNZZDATA1259612802", "2103889297-1495413998-null%7C1495413998", "toutiao.com", "/", DateTime.Now.AddYears(1)));
//cookies.AddCookie(new Cookie("UM_distinctid", "15c2dec3e02f09-0fc740fef2ffb7-572f7b6e-1fa400-15c2dec3e03cf0", "toutiao.com", "/", DateTime.Now.AddYears(1)));
//cookies.AddCookie(new Cookie("tt_webid", "6431015020234769922", "toutiao.com", "/", DateTime.Now.AddYears(1)));
//cookies.AddCookie(new Cookie("uuid", "\"w:a5e3254676244e0ab15fc4291e372d14\"", "toutiao.com", "/", DateTime.Now.AddYears(1)));
//cookies.AddCookie(new Cookie("_ga", "GA1.2.1639521857.1495419078", "toutiao.com", "/", DateTime.Now.AddYears(1)));
//cookies.AddCookie(new Cookie("_gid", "GA1.2.396214455.1495419159", "toutiao.com", "/", DateTime.Now.AddYears(1)));
//cookies.AddCookie(new Cookie("sso_login_status", "1", "toutiao.com", "/", DateTime.Now.AddYears(1)));
//cookies.AddCookie(new Cookie("login_flag", "f8947cb01c5a760d0cbc4925e601ca60", "toutiao.com", "/", DateTime.Now.AddYears(1)));
//cookies.AddCookie(new Cookie("sessionid", "5c865f7a96598cff3b3d580fcd3dfd27", "toutiao.com", "/", DateTime.Now.AddYears(1)));
//cookies.AddCookie(new Cookie("sid_tt", "5c865f7a96598cff3b3d580fcd3dfd27", "toutiao.com", "/", DateTime.Now.AddYears(1)));
//cookies.AddCookie(new Cookie("sid_guard", "\"5c865f7a96598cff3b3d580fcd3dfd27|1495419148|2591999|Wed\054 21-Jun-2017 02:12:27 GMT\"", "toutiao.com", "/", DateTime.Now.AddYears(1)));
nav.Refresh();
Console.WriteLine("OK!" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
break;
}
catch (Exception ex)
{
nav.Refresh();//说明,对于PhantomJS的话,虽然前面AddCookies时总是抛出异常,但是实际Cookies是添加成功的。所以需要在此Refresh。
Console.WriteLine("retry " + retryCount + ":" + ex.Message); Thread.Sleep(); if (retryCount-- <= ) break;
}
}
var pageSource = driver.PageSource;
//var st = driver.TakeScreenshot();
//st.SaveAsFile("d:\\" + DateTime.Now.ToString("yyyyMMddHHmmssfff") + ".jpg", ScreenshotImageFormat.Jpeg);
driver.Close();
driver.Dispose();
return pageSource;
}
}

二、代码解说:

  在Main方法中调用了LoadSource方法,LoadSource方法中第1步先调用CreateDriver方法创建一个Driver,例子中创建了一个Phantomjs的Driver,然后通过driver.Navigate()取得Navigate对像,然后调用 GotoURL转到一个URL,之后才能给driver.Manager().Cookies中添加Cookie,添加完Cookies之后,调用nav的Refresh方法,即可重新发起携带Cookies的请求。不过这里有个小问题,就是添加Cookie这一步,当使用Chrome时,在GoToURL之后,即可直接成功添加Cookie,但是在Phantomjs中总是AddCookie时抛出异常。这时候查看官方文档,官方文档说,虽然这里抛出异常,但是Cookies依然是成功添加的。所以我们在Catch到异常之后,调用了一下Refresh去刷新。这时使用Fiddler检测,果然携带了Cookie,以上代码写的非常乱,因为只是想简单快速测试Demo,所以代码非常乱。

三、如图:

使用Phantomjs和ChromeDriver添加Cookies的方法的更多相关文章

  1. 创建ASP.NET Core MVC应用程序(4)-添加CRUD动作方法和视图

    创建ASP.NET Core MVC应用程序(4)-添加CRUD动作方法和视图 创建CRUD动作方法及视图 参照VS自带的基架(Scaffold)系统-MVC Controller with view ...

  2. 在VS中向命令行添加参数的方法

    在VS中向命令行添加参数的方法 在VS中向命令行添加参数,即向main()函数传递参数的方法: 右键单击要 添加参数的工程-->属性-->配置属性-->调试,在右侧“命令参数”栏输入 ...

  3. 如何在MyEclipse中通过hibernate使用jtds驱动连接数据库,并向数据库添加数据的方法

    最近学习了下如何在MyEclipse中通过hibernate使用jtds驱动连接数据库,并向数据库添加数据的方法,虽然MyEclipse中自带了连接数据库的方法,我也尝试了下其他方法,如有不当之处请指 ...

  4. Excel 2013中单元格添加下拉列表的方法

    使用Excel录入数据的时候我们通常使用下拉列表来限定输入的数据,这样录入数据就很少发生错误了.Excel 2013较以前的版本发生了很大的变化,那么在Excel 2013是如何添加下拉列表的呢? 下 ...

  5. Windows服务的手动添加和删除方法

    Windows服务的手动添加和删除方法 服务,是指执行指定系统功能的程序.例程或进程,以便支持其他程序,尤其是低层(接近硬件)程序.其实,服务就是一种特殊的应用程序,它从服务启动开始就一直处于运行状态 ...

  6. Extjs中给同一个GridPanel中的事件添加参数的方法

    Extjs中给同一个GridPanel中的事件添加参数的方法: this.isUse = new Ext.Action({            text:'启用',            scope ...

  7. js添加事件通用方法

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  8. Unity3D IOS IPhone添加Admob的方法

    原地址:http://dong2008hong.blog.163.com/blog/static/4696882720140403119293/ 首先阅读官方文档https://developers. ...

  9. Asp.net 后台添加Meta标签方法

    Asp.net 后台添加Meta标签方法包括keywords,CSS.JS 下面是从Asp.net 后台添加CSS.JS.Meta标签的写法,我们这里写成函数方便以后使用.如果函数放在页面类中, Pa ...

随机推荐

  1. sqlite数据库实现字符串查找的方法(instr,substring,charindex替代方案)

    sqlite数据库是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,资源占用低,执行效率高,可以跨平台使用,已被广泛使用.作为一款轻量级的数据库,功能自然会有所欠缺,比如数据库加密,用户权限设 ...

  2. 学习 HTML+CSS 的书籍推荐

    1.<CSS那些事儿> 本书专注于CSS技巧实例的讲解,由浅入深地分析了CSS样式在布局时所需要理解的原理.绕开随处可见的基础知识.网络中能随意搜索到的hack技巧,侧重原理分析,拓展读者 ...

  3. 【ELK】4.spring boot 2.X集成ES spring-data-ES 进行CRUD操作 完整版+kibana管理ES的index操作

    spring boot 2.X集成ES 进行CRUD操作  完整版 内容包括: ============================================================ ...

  4. WordPress主题开发实例:显示最新发表文章

    实现效果 制作网站的时候,想在页面左栏显示最新发表的文章,如: 一.先开启侧边栏工具,在functions.php加上 $args = array( 'name' => __( '分类侧边栏') ...

  5. python测试开发django-31.admin后台一对多操作ForeignKey

    前言 平常的网页上有很多一对多的场景,比如填写银行卡信息的时候,会从银行列表下拉框选择对应的银行信息.一般会建两张表,一张表放银行的信息,一张表放银行卡信息. 每个银行可以对应多个银行卡,每个银行卡只 ...

  6. 手游项目Crash的上报

    基于cocos2d-x开发的手游,免不了会遇到崩溃.闪退,在非debug状态下定位问题异常的艰难,像我们项目是在cocos2dx的基础上封装了一层,然后又与lua进行互调.因为接受C++/移动端开发比 ...

  7. 得到view坐标的各种方法

    这篇文章讲的方法全是再控件可以获取焦点的情况下执行的,如果在oncreat()里面执行,那么得到的都是0 1.getLocationInWindow 这个方法得到的是view相对于当前Activity ...

  8. 用level-list让同一个ImageView根据条件来显示不同的内容

    感谢:http://blog.sina.com.cn/s/blog_6111ce890100psq9.html 有时候,我们为了在一个ImageView中显示不同的图片,平时往往会使用: if (条件 ...

  9. Java生成8位随机邀请码,不重复

    public static String[] chars = new String[] { "a", "b", "c", "d&q ...

  10. Jenkins 快速搭建

    Jenkins 介绍 Jenkins 作为持续集成的重要工具,在DevOps整个工具链中有重要的地位.Jenkins 一般作为独立的应用运行在Java Servlet容器中如Jetty,也可以运行在其 ...