最近研究了下如何抓取为知笔记的内容,在抓取笔记里的图片内容时,老是提示403错误,用Chorme的开发者工具看了下:

这里的Cookie来自两个域,估计为知那边是验证了token(登录后才能获取到token)

下载图片的代码:

  1. var path = "https://note.wiz.cn/" + str.TrimStart('/');
  2. var extension = Path.GetExtension(path);
  3. var filepath = AppPath.Combine("Images/" + DateTime.Now.Ticks + extension);
  4. const string userAgent ="Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.76 Safari/537.36";
  5. const string accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
  6. const string acceptLanguage = "zh-CN,zh;q=0.8";
  7. const string acceptEncoding = "gzip,deflate,sdch";
  8. var cookieContainer = new CookieContainer();
  9. var cookie = new Cookie
  10. {
  11. Name = "token".Trim(),
  12. Value = Token,
  13. Domain = ".wiz.cn".Trim() //设置cookie域
  14. };
  15. cookieContainer.Add(cookie);
  16. string[] cookiesArr = txtCookie.Text.Split(';');
  17. foreach (string s in cookiesArr)
  18. {
  19. string[] keyValuePair = s.Split('=');
  20. if (keyValuePair.Length > 1)
  21. {
  22. cookie = new Cookie
  23. {
  24. Name = keyValuePair[0].Trim(),
  25. Value = keyValuePair[1].Trim(),
  26. Domain = "note.wiz.cn" //设置cookie域
  27. };
  28. cookieContainer.Add(cookie);
  29. }
  30. }
  31. var newUri = new Uri(path);
  32. var webRequest = (HttpWebRequest)WebRequest.Create(newUri);
  33. webRequest.Timeout = 20000;
  34. //webRequest.CookieContainer = cookieContainer;
  35. webRequest.UserAgent = userAgent;
  36. webRequest.Accept = accept;
  37. webRequest.Headers["Accept-Language"] = acceptLanguage;
  38. webRequest.Headers["Accept-Charset"] = acceptEncoding;
  39. webRequest.Headers["Accept-Encoding"] = acceptEncoding;
  40. webRequest.KeepAlive = true;
  41. webRequest.Headers["Cache-Control"] = "no-cache";
  42. webRequest.Headers["Upgrade-Insecure-Requests"] = "1";
  43. webRequest.Headers["Pragma"] = "no-cache";
  44. webRequest.Headers["Cookie"] = "token=" + Token + ";" + txtCookie.Text.Trim();//todo: Cookie 要这样赋值,不能用CookieContainer??
  45. webRequest.Referer = newUri.AbsoluteUri;
  46. HttpWebResponse rsp = (HttpWebResponse)webRequest.GetResponse();
  47. Stream stream = null;
  48. stream = rsp.GetResponseStream();
  49. Image.FromStream(stream).Save(filepath);
  50. // 释放资源
  51. if (stream != null) stream.Close();
  52. if (rsp != null) rsp.Close();

奇怪的是:用 webRequest.CookieContainer = cookieContainer; 来跟cookie赋值,token参数总是赋不上,

后面改为:webRequest.Headers["Cookie"] = "token=" + Token + ";" + txtCookie.Text.Trim(); 就可以了,

CookieContainer 不是支持多个域的cookie吗,难到跨域Cookie只能webRequest.Headers["Cookie"]这样赋值吗? 没弄明白,有知道的童鞋不吝赐教。

C# webrequest 抓取数据时,多个域Cookie的问题的更多相关文章

  1. jsoup使用样式class抓取数据时空格的处理

    最近在研究用android和jsoup抓取小说数据,jsoup的使用可以参照http://www.open-open.com/jsoup/;在抓纵横中文网永生这本书的目录内容时碰到了问题, 永生的书简 ...

  2. C# 从需要登录的网站上抓取数据

    [转] C# 从需要登录的网站上抓取数据 背景:昨天一个学金融的同学让我帮她从一个网站上抓取数据,然后导出到excel,粗略看了下有1000+条记录,人工统计的话确实不可能.虽说不会,但作为一个学计算 ...

  3. Java模拟新浪微博登陆抓取数据

    前言:  兄弟们来了来了,最近有人在问如何模拟新浪微博登陆抓取数据,我听后默默地抽了一口老烟,暗暗的对自己说,老汉是时候该你出场了,所以今天有时间就整理整理,浅谈一二. 首先:  要想登陆新浪微博需要 ...

  4. 测试开发Python培训:抓取新浪微博抓取数据-技术篇

    测试开发Python培训:抓取新浪微博抓取数据-技术篇   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.在poptest的se ...

  5. C#抓取数据、正则表达式+线程池初步运用

    去年底用 多线程+HtmlAgilityPack.dll 写了一个抓取“慧聪网” 公司信息的小程序,代码惨不忍赌.好在能抓到数据,速度也能让人忍受就很久没管了. 最近这段时间把这个小程序发给同事看着玩 ...

  6. PHP Curl模拟登录并抓取数据

    使用PHP的Curl扩展库可以模拟实现登录,并抓取一些需要用户账号登录以后才能查看的数据.具体实现的流程如下(个人总结): 1. 首先需要对相应的登录页面的html源代码进行分析,获得一些必要的信息: ...

  7. 爬虫学习笔记(1)-- 利用Python从网页抓取数据

    最近想从一个网站上下载资源,懒得一个个的点击下载了,想写一个爬虫把程序全部下载下来,在这里做一个简单的记录 Python的基础语法在这里就不多做叙述了,黑马程序员上有一个基础的视频教学,可以跟着学习一 ...

  8. Web Scraper 翻页——控制链接批量抓取数据

    ![](https://image-1255652541.cos.ap-shanghai.myqcloud.com/images/20190708214014.png) 这是简易数据分析系列的第 5 ...

  9. Web Scraper 翻页——控制链接批量抓取数据(Web Scraper 高级用法)| 简易数据分析 05

    这是简易数据分析系列的第 5 篇文章. 上篇文章我们爬取了豆瓣电影 TOP250 前 25 个电影的数据,今天我们就要在原来的 Web Scraper 配置上做一些小改动,让爬虫把 250 条电影数据 ...

随机推荐

  1. Zookeeper笔记之基于zk的分布式配置中心

    一.场景 & 需求 集群上有很多个节点运行同一个任务,这个任务会有一些可能经常改变的配置参数,要求是当配置参数改变之后能够很快地同步到每个节点上,如果将这些配置参数放在本地文件中则每次都要修改 ...

  2. Servlet笔记11--补充

    Servlet线程安全问题: 代码示例: package com.bjpowernode.javaweb.servlet; import java.io.IOException; import jav ...

  3. Linux TTY驱动--Serial Core层【转】

    转自:http://blog.csdn.net/sharecode/article/details/9197567 版权声明:本文为博主原创文章,未经博主允许不得转载. 接上一节: Linux TTY ...

  4. SharePoint 2013 另一个程序正在使用此文件,进程无法访问。 (异常来自 HRESULT:0x80070020)

    环境:SharePoint 2013 + Windows Server 2012 R2 在管理中心新建一个Web Application,端口为:88.顺利创建网站集后,打开访问却提示:无法显示此页 ...

  5. poj1142

    分解质因数 #include <iostream> #include <cmath> using namespace std; int sum(int n) { ; ) { a ...

  6. Java中static关键字概述

    例如一个学生类中,我们需要统计下学生类中学生对象的数量,此时数量要定义为静态变量: 示例代码: package com.java1995; public class Student { int id= ...

  7. Java基础90 MySQL触发器

    1.创建触发器 CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW trigger_stmt ...

  8. Grinder搭建小记与Nduja(这次不待续了)

    Grinder是比较有名的浏览器FUZZ框架,采用ruby语言编写,主要是作为测试框架来使用,在<白帽子讲浏览器安全>一书中作者使用了Nduja生成测试样本来配合Grinder使用.根据网 ...

  9. Java编程的逻辑 (65) - 线程的基本概念

    ​本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http: ...

  10. Python学习笔记之函数式编程

    python中的高阶函数 高阶函数就是 变量名指向函数,下面代码中的变量abs其实是一个函数,返回数字的绝对值,如abs(-10) 返回 10 def add(x,y,f): return f(x) ...