Requests数据抓取

酥酥 发布于 2021-09-18 52 次阅读


Requests数据抓取

预备:Requests库的安装

  • pip 安装方法:
    • Windows系统:打开cmd以后键入pip install requests
    • Linux系统:打开Terminal 以后键入sudo pip install requests
  • whl文件安装方法下载whl文件的方式来安装https://www.lfd.uci.edu/~gohlke/pythonlibs/,按下CTRL-F搜索关键字"requests",下载普通版本的的库即可。将下载来的文件解压放入Python安装目录Lib\site-packages中即可。除了解压whl,还可以使用pip安装,进入cmd,进入到对应路径,pip install + 文件名.whl即可安装完成后,在CMD下运行Python,查看Requests版本信息,检测是否安装成功。

1.请求方式

HTTP常用请求是Get和Post请求,Request对此分两种不同的请求方式。Get方式有两种,分别是不带参数和带参数。以访问百度为例:

import requests
# 第一种方式
r = requests.get('https://www.baidu.com/s?wd=python')
# 第二种方式
url = 'https://www.baidu.com/s'
params = {'wd': 'python'}
# 左边params是GET请求中表示设置参数
r = requests.get(url, params=params)
# 输出生成的URL
print(r.url)

判断url是否有参数可以对url中的''?"进行判断,一般网址末端(域名)带有"?"就说明,该URL是带有请求参数的,繁殖则不带有参数。GET参数说明如下:

  • wd是参数名,参数名由网站(服务器)决定
  • =后面跟的是参数值,即在百度中要查找的对象
  • 如果一个url有多个参数之间用"&"连接、

2.Post的使用

Post请求是我们常说的提交表单,表单内的数据内容就是Post的请求参数。Requests实现Post请求需设置请求参数data,数据格式可以为字典,元组、列表、和JSON格式,不同数据格式有不同的优势,代码如下:

import requests
# 字典类型
data = {'key1': 'value1', 'key2': 'value2'}
# 元组或列表
(('key1', 'value1'), ('key1', 'value2'))
# Json
import json
data = {'key1': 'value1', 'key2': 'value2'}
# 将字典转换Json
data=json.dumps(data)
# 发送POST请求
r = requests.post("https://www.baidu.com/", data=data)
print(r.text)

值得一提的是Requests的GET和POST方法的请求参数分别是params和data,请区分开来。

当向网站(服务器)发送请求时,网站会返回相应的响应(response)对象,包含服务器的相应,Requests提供一下方法获取相应内容。

  • r.status_code:相应状态码
  • r.raw: 原始响应体,使用r.raw.read()获取
  • r.content:字节方式的响应体,需要进行解码
  • r.text:字符串方式响应体,会自动根据响应头部的字符编码进行编码
  • r.headers:以字典对象存储服务器的响应头,但是这个字典比较特殊,字典键不区分大小写,若键不存在,则返回None。
  • r.json():Requsets中内置的json解码器
  • r.url:获取请求连接
  • r.cookies:获取请求后的Cookies
  • r.encoding:获取编码格式

3.复杂的请求方式

  1. 添加请求头,请求头以字典形式生成,然后发送请求中设置的headers参数,指向已定义的请求头,代码如下:
import requests
headers = {
    'content-type': 'application/json',
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64; rv:41.0) Gecko/20100101 Firefox/41.0'}
requests.get("https://www.baidu.com/", headers=headers)
  1. 使用代理IP:代理IP的使用方法与请求头的使用方法一致,设置proxies参数即可,代码如下:
import requests
proxies = {
  "http": "http://10.10.1.10:3128",
  "https": "http://10.10.1.10:1080",
}
requests.get("https://www.baidu.com/", proxies=proxies)
  1. 证书验证:通常设置关闭验证即可即verify=False时就能关闭证书的验证,默认状态下是True。如果需要设置证书文件,那么可以设置verify值为证书路径。
import requests
url = 'https://kyfw.12306.cn/otn/leftTicket/init'
# 关闭证书验证
r = requests.get(url, verify=False)
print(r.status_code)
# 开启证书验证
# r = requests.get(url, verify=True)
# 设置证书所在路径
# r = requests.get(url, verify= '/path/to/certfile')
  1. 超时设置:发送请求后,由于网络,服务器等因素,请求到获得相应会有一个时间差。如果不想程序等待时间过长或者延长等待时间,可以设定timeout的等待描述,超过这个时间停止等待响应,若未能在timeout内相应会返回一个异常。
    requests.get("https://www.baidu.com/", timeout=0.001)
    
  2. 使用cookies:Cookies的作用是表示用户身份,在Requests中以字典或RequestsCookieJar对象作为参数。获取方式主要是从浏览器读取和程序运行所产生,下面的例子进一步讲解如何使用Cookies,代码如下:
import requests
temp_cookies='JSESSIONID_GDS=y4p7osFr_IYV5Udyd6c1drWE8MeTpQn0Y58Tg8cCONVP020y2N!450649273;name=value'
cookies_dict = {}
for i in temp_cookies.split(';'):
    value = i.split('=')
    cookies_dict [value[0]] = value[1]
r = requests.get(url, cookies=cookies)
print(r.text)

通过F12,刷新后找到某一请求的network-Request Headers中找到Cookies所对应的值。以上代码对Cookie进行了两次分割,第一次是以';'得到列表A,第二次是列表A的每一个元素以'='分割,得到字典的键值对

当程序发送请求时(不设参数Cookies),自动生成一个RequestCookieJar对象,该对象用于存放Cookies信息。Requests提供RequestsCookieJar对象和字典对象相互转换,代码如下:

import requests
url = 'https://movie.douban.com/'
r = requests.get(url)
# r.cookies是RequestsCookieJar对象
print(r.cookies)
mycookies = r.cookies

# RequestsCookieJar转换字典
cookies_dict = requests.utils.dict_from_cookiejar(mycookies)
print(cookies_dict)

# 字典转换RequestsCookieJar
cookies_jar = requests.utils.cookiejar_from_dict(cookies_dict, cookiejar=None, overwrite=True)
print(cookies_jar)

# 在RequestsCookieJar对象添加Cookies字典
print(requests.utils.add_dict_to_cookiejar(mycookies, cookies_dict))

如果要将Cookies写入文件,可使用http模块实现Cookies的读写。除此之外,还可以将Cookies以字典形式写入文件,此方法相比http模块读写Cookies更为简单,但安全性相对较低。使用方法如下:

import requests
url = 'https://movie.douban.com/'
r = requests.get(url)
# RequestsCookieJar转换字典
cookies_dict = requests.utils.dict_from_cookiejar(mycookies)
# 写入文件
f = open('cookies.txt', 'w', encoding='utf-8')
f.write(str(cookies_dict))
f.close()
# 读取文件
f = open('cookies.txt', 'r')
dict_value = f.read()
f.close()
# eval(dict_value)将字符串转换字典
print(eval(dict_value))
r = requests.get(url, cookies=eval(dict_value))
print(r.status_code)

4.下载与上传

下载文件主要从服务器获取文件内容,然后将内容保存到本地。下载文件的方法如下:

import requestsurl = 'http://cc.stream.qqmusic.qq.com/C100001Yyla31Dr60y.m4a?fromtag=52'r = requests.get(url)f = open('mymusic.m4a', 'wb')# r.content获取响应内容(字节流)f.write(r.content)f.close()

配合抓包工具,我们可以在微博上发送帖子,并抓取相应的请求得到以下代码所需要的数据。

import requestsurl = 'https://weibo.cn/mblog/sendmblog?rl=0&st=bd6702'cookies = {'xxx': 'xxx'}files = {'content': (None, 'Python爬虫'),         'pic': ('pic', open('test.png', 'rb'), 'image/png'),         'visible': (None, '0')}r = requests.post(url, files=files, cookies=cookies)print(r.status_code)

5.Requests小结

Requests的核心主要是GET和Post请求的使用

r=requests.get(url,headers,proxies,verify,cookies)

r=requests.post(url,data,files,headers,proxies,verify,cookies)