http协议学习 —— post请求方法提交application/x-www-form-urlencoded类型的数据格式

news/2024/7/19 11:23:09 标签: python, 爬虫, c/c++

  先推荐一篇很不错的文章:https://imququ.com/post/four-ways-to-post-data-in-http.html

  说一下,如果是自己编写底层,那么要注意了,不能只有提交数据的类型,还必须要有数据内容的长度,大体这样写即可:

method << "POST / HTTP1/1\r\n";
headers << "Content-Length: 32\r\n";
headers << "Content-Type: application/x-www-form-urlencoded; charset=UTF-8\r\n";
...
body << "test=1&type=json&time=1513242234";

  请求头部分结束的后面就是请求主体(body),发送的body内容是key-value对应的url source,如果带有中文或其他非英文语种,类似这样:

type=1&message=%E5%8A%A9%E6%89%8B&plat=1&jsonp=jsonp

  需按url编码格式编码。注意不用在字符串尾部加"\r\n"。

  实际上这种类型的提交参数实现了通过接口对服务器后台的数据库进行CRUD操作。

  我之前仅仅只是会用python的requests库,没怎么了解底层,现在自己用C++写爬虫才知道,人家已经帮我们做好了这些事,十分便利,同时也看到了她的强大之处。

  下面用C++测试B站的add接口(发表评论)为例:

#include <iostream>
#include <sstream>
#include "libhttp.hpp"

using http::Request;
using std::string;
using std::stringstream;

int main()
{
	Request r;

	string url = "https://api.bilibili.com/x/v2/reply/add";

	stringstream headers;

	headers << "Contention: keep-alive\r\n";
	headers << "Content-Length: 102\r\n";
	headers << "Content-Type: application/x-www-form-urlencoded; charset=UTF-8\r\n";
	headers << "Cookie: xxx\r\n";
	headers << "Host: api.bilibili.com\r\n";
	headers << "Referer: https://www.bilibili.com/bangumi/play/ep85276\r\n";
	headers << "User-agent: xxx\r\n";

	string data = "oid=4492528&type=1&message=%E5%8A%A9%E6%89%8B&plat=1&jsonp=jsonp&csrf=14211ebe19f7a1500e3a4d910c9d4b44";
        // decode: "oid=4492528&type=1&message=助手&plat=1&jsonp=jsonp&csrf=14211ebe19f7a1500e3a4d910c9d4b44";

	r.post(url, "", headers.str(), data, "");

	return 0;
}

  

  运行结果:

  到B站上看看:

  测试成功,这里测试环境是Linux CentOS7。

  如果使用python requests模块,可以简单这样写:

python"># coding=utf8
from requests import request

data = {
    'oid': '4492528',
    'type': '1',
    'message': '正片被tx抢走了',
    'plat': '1',
    'jsonp': 'jsonp',
    'csrf': '141500e3a4d910c9d4b44'
}

headers = {
    'Cookie': 'xxx'
}

r = request('post', 'https://api.bilibili.com/x/v2/reply/add', data=data, headers=headers, timeout=1)

print r.status_code
print r.text

  她的底层会根据你自定义的headers以及data进行解析,然后补充上一些缺少的重要key-value。

  顺便提下之前在该篇中提到的csrf

  1.旧csrf + 旧cookie:

 

  2.新csrf + 旧cookie:

 

  3.旧csrf + 新cookie:


  # 2018-12-15 12:02:22 咳咳,今天回头看了一下这篇文章。。。はつかし。。。emmm,发现自己真是个文盲。。。基本上各大网站的csrf和cookie都是有生命周期的。。。一些网站做得更严谨,可能关闭掉网页就死了,但一般都是通过session来持续一段生命周期,并且csrf是一种名为Cross-site request forgery(跨站请求伪造)的技术,嘛,做过网站应该就明白了。所以,我重新登录,之前的csrf以及cookie当然会失效。。。


 

  ...然后B站的csrf怎么获得呢?不可能每次都发表评论 + F12看吧,这也太事后诸葛亮了,所以找找还有没有其他方法,当然我也是无意间找到一个办法,当视频播放时,有个接口会每隔几秒钟发送一次请求,其中也带有该视频下通用的csrf,这个接口名为:heartbeat,如图:

  点一下她,在Headers中From Data就可以看见了。 

  ps:今天才知道如何查看网站的robots.txt,在浏览器地址栏中输入是格式:http://网站主页/robots.txt,比如B站的:https://www.bilibili.com/robots.txt,上面写清楚了网站中哪些是不允许爬取的。

  参考:

    1.https://www.zhihu.com/question/34980963

    2.http://www.robotstxt.org/robotstxt.html

转载于:https://www.cnblogs.com/darkchii/p/9070175.html


http://www.niftyadmin.cn/n/546451.html

相关文章

poj1523

http://poj.org/problem?id1523 割点简单题&#xff0c;问去掉一个割点后有多少个连通分支。 1 #include <stdio.h> 2 #include <string.h> 3 #define SIZE 1001 4 #define MIN(a,b) ((a)<(b)?(a):(b)) 5 #define MAX(a,b) ((a)>(b)?(a):(b)) 6 typedef …

mysql unblock with 'mysqladmin flush-hosts'

2019独角兽企业重金招聘Python工程师标准>>> 错误&#xff1a;Host is blocked because of many connection errors; unblock with mysqladmin flush-hosts 原因&#xff1a; 同一个ip在短时间内产生太多&#xff08;超过mysql数据库max_connection_errors的最大值&…

C — 小知识

老是记错int与void*之间的转换&#xff0c;所以记录一个&#xff0c;顺便用一下一些宏、预处理。。。 int与void*的转换、打印变量名&#xff1a; #include <stdio.h> // 打印变量名 #define VNAME(name) (#name)typedef void*(*func)(void*);void call(func myfunc, voi…

基础数据结构-线性表-顺序表

线性表是n个数据元素的有限序列&#xff0c;数据之间存在顺序关系&#xff0c;一般同一个线性表属于同一类数据对象&#xff08;例如A~Z的字母表&#xff09;。线性表存在唯一一个首位元素和末位元素&#xff0c;除了第一个元素和最后一个元素&#xff0c;每个元素存在着一个前…

Thrift初探:简单实现C#通讯服务程序

好久没有写文章了&#xff0c;由于换工作了&#xff0c;所以一直没有时间来写博。今天抽个空练练手下~最近接触了下Thrift&#xff0c;网上也有很多文章对于Thrift做了说明&#xff1a; Thrift是一种可伸缩的跨语言服务框架&#xff0c;它结合了功能强大的软件堆栈的代码…

Trie tree(字典树)

Trie tree有时被称为&#xff08;digital tree&#xff09;或&#xff08;radix tree or prefix tree&#xff09;。 可能是编译器问题&#xff0c;我的实现方法用gcc编译器&#xff0c;debug没问题&#xff0c;但一run就有问题。。。 Debug output: Starting debugger: C:\TDM…

Vmware vSphere 5.0系列教程之四 vSphere网络原理及vSwitch简介

在一个物理网络拓扑中&#xff0c;通常都是路由器-交换机-PC机的连接&#xff0c;不同的服务器和PC机&#xff0c;通过交换机的连接而相互连通。在VMware vSphere架构下服务器会虚拟出交换机来供ESX Host虚拟机来使用&#xff0c;虚拟交换机有两种&#xff0c;vSwitch虚拟交换机…

如果说中国的程序员技术偏低,原因可能在这里(转)

原文(http://www.cnblogs.com/shiyuxinglan/archive/2010/05/17/1737057.html) 我就对加班特别不爽!!! 当我正常下班的时候&#xff0c;别人却说你这么早就下班了。OMG&#xff01;我还是坚持尽量不加班啦&#xff0c;忙的时候就算中午不休息&#xff0c;我也要按时下班的&…