Requests库 (https://www.python-requests.org/) 是一个擅长处理那些复杂的 HTTP 请求、cookie、header(响应头和请求头)等内容的 Python 第三方库。

提交一个最基本的表单

大多数网页表单都是由一些HTML字段、一个提交按钮、一个在表单处理完之后跳转的“执行结果”(表单属性action的值)页面构成。

一个最简单的表单(http://www.pythonscraping.com/pages/files/form.html)

这个表单的源码在下面。可以通过chrome的开发者工具(F12)查看。

<form method="post" action="processing.php">
First name: <input type="text" name="firstname"><br>
Last name: <input type="text" name="lastname"><br>
<input type="submit" value="Submit" id="submit">
</form>

有几个要点:

  • 两个要输入字段的名称是firstname和lastname。字段的名称决定了表单被确认后要被传送到服务器上的变量名称,要模拟表单提交数据的行为,就要保证变量名称与字段名称是一一对应的。
  • 表单的真实行为其实发生在processing.php(绝对路径是http://www.pythonscraping.com/pages/files/processing.php)。表单的任何POST请求其实都发生在这个页面上,并非表单本身所在的页面。HTML表单的目的,知识帮助网站的访问者发送格式合理的请求,向服务器请求没有出现的页面。

那么提交这个最简单的表单,只要四行代码就可以了。

import requests

params = {'firstname': 'Ivy', 'lastname': 'Wong'}
r= requests.post("http://www.pythonscraping.com/pages/files/processing.php", data=params)
print(r.text)

表单提交后,程序应该会返回执行页面的源代码,包括这行内容。

提交文件和图像

在http://www.pythonscraping.com/files/form2.html有一个文件上传表单,表单的源代码是下面这样的。

<form action="../pages/files/processing2.php" method="post" enctype="multipart/form-data">
Submit a jpg, png, or gif: <input type="file" name="uploadFile"><br>
<input type="submit" value="Upload File">
</form>

发现input标签里有一个type属性是file,和文字其实差不多。

import requests

filess = {'uploadFile': open('..files/Python-logo.png','rb')}
r= requests.post("http://www.pythonscraping.com/pages/files/processing2.php", files=files)
print(r.text)

处理登录与cookie

大多数新式的网站都用cookies跟踪用户是否已登录的状态信息。一旦网站验证了你的登录权证,它就会将它们保存在你的浏览器的cookie中,里面通常包含一个服务器生产的令牌、登录有效时限和状态跟踪信息。网站会把这个cookie当作信息验证的证据,在你浏览网站的每个页面时出示给服务器。

Ryan Mitchell在http://www.pythonscraping.com/pages/cookies/login.html创建了一个简单的登录表单。

用户名可以是任意值,但是密码必须是"password"。

这个表单在欢迎页面(http://www.pythonscraping.com/pages/cookies/welcome.php)处理,里面包含一个简介界面:http://www.pythonscraping.com/pages/cookies/profile.php。

在简介页面,网站会监测浏览器的cookie,看它有没有页面已登录的设置信息。

import requests

params = {'username':'Ryan','password':'password'}
r=requests.post("http://www.pythonscraping.com/pages/cookies/welcome.php",params)
print("Cookie is set to:")
print(r.cookies.get_dict())
print("-----------------------")
print("Going to profile page...")
r=requests.get("http://www.pythonscraping.com/pages/cookies/profile.php",cookies=r.cookies)
print(r.text)

有些网站比较复杂,cookie经常暗自调整。那么可以用session函数。

import requests

session = requests.Session()

params = {'username':'Ryan','password':'password'}
r=session.post("http://www.pythonscraping.com/pages/cookies/welcome.php",params)
print("Cookie is set to:")
print(r.cookies.get_dict())
print("-----------------------")
print("Going to profile page...")
r=session.get("http://www.pythonscraping.com/pages/cookies/profile.php")
print(r.text)

会话(session)对象会持续跟踪会话信息,比如cookie、header,甚至包括运行HTTP协议的信息,比如HTTPAdapter。

修改请求头

HTTP的请求头是在你每次向网络服务器发送请求时,传递的一组属性和配置信息。HTTP定义了十几种古怪的请求头类型,不过大多数都不常用。只有下面的七个字段被大多数浏览器用来初始化所有网络请求。(表内是我的浏览器数据)

属性 内容
Host hpd.baidu.com
Connection keep-alive
Accept image/webp,image/apng,image/,/*;q=0.8
User-Agent Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36
Referrer https://www.baidu.com/
Accept-Encoding gzip, deflate, br
Accept-Language zh-CN,zh;q=0.9

而经典的Python爬虫在使用urllib标准库时,都会发送如下的请求头:

属性 内容
Accept-Encoding indentity
User-Agent Python-urllib/3.4

http://www.whatismybrowser.com/网站可以让服务器测试浏览器的属性。用下面的代码来采集这个网站的信息,验证我们浏览器的cookie设置:

import requests
from bs4 import BeautifulSoup session = requests.Session()
headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36","Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8"}
url="https://www.whatismybrowser.com/developers/what-http-headers-is-my-browser-sending"
req=session.get(url, headers=headers) bsObj = BeautifulSoup(req.text, "lxml")
print(bsObj.find("table",{"class":"table-striped"}).get_text)

和Ryan给的代码稍有点不一样,加上了BeautifulSoup要用lxml解析,可能是由于我的header和Ryan不一样。

通常真正重要的参数就是User-Agent。如果在处理一个警觉性非常高的网站,就要注意那些经常用却很少检查的请求头。

请求头还可以让网站改变内容的布局样式。例如,用移动设备浏览网站时,通常会看到一个没有广告、Flash以及其他干扰的简化的网站版本。

Ryan给了一个移动设备的User-Agent如下。

User-Agent:Mozilla/5.0 (iPhone; CPU iPhone OS 7_1_2 like Mac OS X) AppleWebKit/537.51.2 (KHTML, lke Gecko) Version/7.0 Mobile/11D257 Safari/95
37.53

【参考】

[1]《Python网络数据采集》Ryan Mitchell

【Python学习】request库的更多相关文章

  1. python 学习jieba库遇到的问题及解决方法

    昨天在课堂上学习了jieba库,跟着老师写了同样的代码时却遇到了问题: jieba分词报错AttributeError: module 'jieba' has no attribute 'cut' 文 ...

  2. Python学习第三方库Requests: 让 HTTP 服务人类

    转自官方文档:http://cn.python-requests.org/zh_CN/latest/ 快速上手 http://cn.python-requests.org/zh_CN/latest/u ...

  3. 在Python中用Request库模拟登录(一):字幕库(无加密,无验证码)

    字幕库的登录表单如下所示,其中省去了无关紧要的内容: <form class="login-form" action="/User/login.html" ...

  4. Python 基于request库的get,post,delete,封装

    # coding=utf-8 import json import requests class TestApi(object): """ /* @param: @ses ...

  5. Python学习-第三方库操作

    2018-05-04   12:03:19 Python安装模块,更新模块 #显示模块 pip list #显示过期模块 pip list --outdated #安装模块 pip install x ...

  6. 基于python的request库,模拟登录csdn博客

    以前爬虫用urllib2来实现,也用过scrapy的爬虫框架,这次试试requests,刚开始用,用起来确实比urllib2好,封装的更好一些,使用起来简单方便很多. 安装requests库     ...

  7. [python 学习] requests 库的使用

    1.get请求 # -*- coding: utf-8 -*- import requests URL_IP = "http://b.com/index.php" pyload = ...

  8. 使用Python学习win32库进行内存读写

    前言: 上一周,在52的精华帖中,看到有位大佬用Python制作了鬼泣5的修改器,看完才知道,原来Python也可以对内存进行操作,出于对技术的好奇,看完以后,决定自己也尝试一下. 要用到的工具: C ...

  9. 在Python中用Request库模拟登录(四):哔哩哔哩(有加密,有验证码)

    !已失效! 抓包分析 获取验证码 获取加密公钥 其中hash是变化的,公钥key不变 登录 其中用户名没有被加密,密码被加密. 因为在获取公钥的时候同时返回了一个hash值,推测此hash值与密码加密 ...

  10. 在Python中用Request库模拟登录(三):Discuz论坛(未加密,有验证码,有隐藏验证)

    以Discuz的官方站为例.直接点击网页右上角的登录按钮,会弹出一个带验证码的登录窗口.输入验证码之后,会检查验证码是否正确.然后登录.首先,通过抓包分析,这些过程浏览器和服务器交换了哪些数据. 抓包 ...

随机推荐

  1. 阿里中间件RocketMQ

    阿里RocketMQ是怎样孵化成Apache顶级项目的? RocketMQ 迈入50万TPS消息俱乐部 Apache RocketMQ背后的设计思路与最佳实践 专访RocketMQ联合创始人:项目思路 ...

  2. BZOJ 1444 有趣的游戏(AC自动机+矩阵快速幂)

    真的是很有趣的游戏... 对每个单词构建好AC自动机后,由于单词都是相同长度的且不同,所以不会出现互相为子串的形式. 那么我们对AC自动机上的节点构建转移矩阵.对于每个单词末尾的节点.该节点的出边仅仅 ...

  3. BZOJ5091 摘苹果(概率期望)

    大胆猜想每一步都相当于是第一步.稍微验证一下发现是对的.就做完了. #include<iostream> #include<cstdio> #include<cmath& ...

  4. C++解析(17):操作符重载

    0.目录 1.操作符重载 2.完善的复数类 3.小结 1.操作符重载 下面的复数解决方案是否可行? 示例1--原有的解决方案: #include <stdio.h> class Compl ...

  5. llinux 安装oracle

    5.传输oracle的客户端(600几M linux.x64_11gR2_client).oracle的依赖包(20几M packages),linux只支持zip(rar较困难不做解释) 6.打开l ...

  6. [洛谷P4626]一道水题 II

    题目大意:求$lcm(1,2,3,\cdots,n)\pmod{100000007}$,$n\leqslant10^8$ 题解:先线性筛出质数,然后求每个质数最多出现的次数,可以用$\log_in$来 ...

  7. [CTSC2012]熟悉的文章 后缀自动机

    题面:洛谷 题解: 观察到L是可二分的,因此我们二分L,然后就只需要想办法判断这个L是否可行即可. 因为要尽量使L可行,因此我们需要求出对于给定L,这个串最多能匹配上多少字符. 如果我们可以对每个位置 ...

  8. Unity3D for VR 学习(7): 360°全景照片

    在VR应用中,有一个相对简单的虚拟现实体验,那就是360°全景照片浏览器, 他可以使得手机拍照的”全景”照片,  得以”恢复”当时拍照的场景全貌,  这个创意的确比单纯的2d图片更有震撼力一些,故本文 ...

  9. listen() 函数

    声明:本文来自网络博文的合并,文后有链接. 一.listen函数仅由TCP服务器调用 它做两件事: 1.当socket函数创建一个套接字时,它被假设为一个主动套接字,也就是说,它是一个将调用conne ...

  10. Linux(六)shell操作实用技巧

    一.shell操作日期时间 linux 系统为我们提供了一个命令 date,专门用来显示或者设置系统日期时间的.      语法格式为:      date [OPTION]... [+FORMAT] ...