C# webrequest 抓取数据时,多个域Cookie的问题

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

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

下载图片的代码:

[csharp] view plain copy

  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"]这样赋值吗? 没弄明白,有知道的童鞋不吝赐教。

原文地址:https://www.cnblogs.com/soundcode/p/9031981.html

时间: 2024-11-07 14:16:15

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

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

正确方法可以用doc.getElementsByAttributeValue(属性名, 属性值),因为class也可以看成特殊的属性,所以可以这样写doc.getElementsByAttributeValue("class" , "填写class对应的值").[亲测好使]

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

[转] C# 从需要登录的网站上抓取数据 背景:昨天一个学金融的同学让我帮她从一个网站上抓取数据,然后导出到excel,粗略看了下有1000+条记录,人工统计的话确实不可能.虽说不会,但作为一个学计算机的,我还是厚着脸皮答应了. . 刚开始想的是直接发送GET请求,然后再解析返回的html不就可以获取需要的信息吗?的确,如果是不需要登录的网站,这样可行,但对于这个网站就行不通.所以首先我们需要做的就是抓包,即分析用户登录时浏览器向服务器发送的POST请求.许多浏览器都自带抓包工具,但我还是更喜欢

我也来学着写写WINDOWS服务-解析xml抓取数据并插入数据库

项目告一段落,快到一年时间开发了两个系统,一个客户已经在试用,一个进入客户测试阶段,中间突然被项目经理(更喜欢叫他W工)分派一个每隔两小时用windows服务去抓取客户提供的外网xml,解析该xml,然后将截取的节点字段值插入到已经建好相应结构的表中.并记录日志. xml结构概要如下: <?xml version="1.0" encoding="UTF-8"?> <list> <info> <id>93ef7c7ccc

python自然语言处理1——从网络抓取数据

python自然语言处理1--从网络抓取数据 写在前面 本节学习python2.7 BeautifulSoup库从网络抽取数据的技术,检验之简而言之就是爬虫技术.网络编程是一门复杂的技术,在需要基础的地方,文中给出的链接地址,都是很好的教程,可以参考,我在这里不在重复发明轮子.本节的主旨在于: 帮助快速掌握基本爬虫技术,形成一条主线,能为自己的实验构造基础数据.掌握爬虫技术后,可以从网络抓取符合特定需求的数据供分析,这里学习的爬虫技术适用于数据挖掘.自然语言处理等需要从外部挖掘数据的学科. 1.

使用Apache Flume抓取数据(1)

使用Apache Flume抓取数据,怎么来抓取呢?不过,在了解这个问题之前,我们必须明确ApacheFlume是什么? 一.什么是Apache Flume Apache Flume是用于数据采集的高性能系统 ,名字来源于原始的近乎实时的日志数据采集工具,现在广泛用于任何流事件数据的采集,支持从很多数据源聚合数据到HDFS. 最初由Cloudera开发 ,在2011年贡献给了Apache基金会 ,在2012年变成了Apache的顶级项目,Flume OG升级换代成了Flume NG. Flume

PHP Curl模拟登录并抓取数据

使用PHP的Curl扩展库可以模拟实现登录,并抓取一些需要用户账号登录以后才能查看的数据.具体实现的流程如下(个人总结): 1. 首先需要对相应的登录页面的html源代码进行分析,获得一些必要的信息: (1)登录页面的地址: (2)验证码的地址: (3)登录表单需要提交的各个字段的名称和提交方式: (4)登录表单提交的地址: (5)另外要需要知道要抓取的数据所在的地址. 2. 获取cookie并存储(针对使用cookie文件的网站): $login_url = 'http://www.xxxxx

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

前言:  兄弟们来了来了,最近有人在问如何模拟新浪微博登陆抓取数据,我听后默默地抽了一口老烟,暗暗的对自己说,老汉是时候该你出场了,所以今天有时间就整理整理,浅谈一二. 首先:  要想登陆新浪微博需要预登陆,即是将账号base64加密,密码rsa加密以及请求http://login.sina.com.cn/sso/prelogin.php链接获取一些登陆需要参数,返回的接送字符串如: {"retcode":0,"servertime":1487292003,&quo

php curl模拟登陆抓取数据

最近由于项目的需要,需要做数据抓取,也就是用的curl相关的函数库,在这之前还真心没有接触过这么高大上的东西,然后从刚开始到今天才研究curl算是第四天了,写这篇博客记录一下这几天的一个过程,在使用curl模拟登陆抓取数据过程中需要注意的一些事项,以及介绍一款支持跨平台(windows.linux.mac)的抓包软件 charles(这个软件是收费的,但是你不花钱也可以使用) ,想要尽快上手,必须要去熟悉两个东西:http协议.curl的相关参数选项的作用 一.介绍curl 这是curl的维基百

抓取数据,保存到表格

网上看房子,不过网速太慢,就做个demo来抓数据并存到表格里. 代码如下: using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Text; using System.Threading.Tasks; using HtmlAgilityPack; using System.Data; using System.Reflec