Requests数据爬取

Requests简介及安装

  与Urllilb对比,Requests是在Urllib的基础上进一步封装的,具备Urllib的全部功能;在开发使用上,语法简单易懂,完全符合Python优雅、简介的特性;在兼容性上,完全兼容Python2和Python3,具有较强的适用性。

  Requests可通过pip安装:

  • Windows 系统:pip install requests
  • Linux 系统:sudo pip install requests

  还可以下载whl文件安装:

  • 访问https://www.lfd.uci.edu/~gohlke/pythonlibs/ ,按Ctrl+F组合键搜索关键字“requests”,如图所示:
    在这里插入图片描述
  • 单击下载requests‑2.22.0‑py2.py3‑none‑any.whl,把下载文件直接解压,放到Python的安装目录Lib\site-packages中即可
  • 还可以适用pip安装whl文件,进入到whl文件所在文件夹,输入安装命令:pip install requests‑2.22.0‑py2.py3‑none‑any.whl

  检验是否安装成功:

import requests
requests.__version__
'2.22.0'

请求方式

  HTTP的常用请求是GET和POST。GET请求有两种形式,分别是不带参数和带参数以百度为例:

#不带参数
https://www.baidu.com/
#带参数wd
https:www.baidu.com/s?wd=python

  判断URL是否带有参数,可以对符号“?”判断。一般网址末端(域名)带有“?”,就说明该URL是带有请求参数的,反之则不带有参数。如果一个URL有多个参数,参数之间用“&”连接。Requests实现GET请求,对于带参数的URL有两种请求方式:

import requests
#第一种方式
r = requests.get('https://www.baidu.com/s?wd=python')
#第二种方式
r = requests.get('https://www.baidu.com/s')
url = 'https://www.baidu.com/s'
params = {'wd': 'python'}
#左边params在GET请求中表示设置参数
r = requests.get(url, params=params)
#输出生成的URL
print(r.url)
https://wappass.baidu.com/static/captcha/tuxing.html?&ak=c27bbc89afca0463650ac9bde68ebe06&backurl=https%3A%2F%2Fwww.baidu.com%2Fs%3Fwd%3Dpython&logid=9931620155331155859&signature=f00976f050439d35b68197d0726afa81&timestamp=1575602040

  上面网址是百度安全验证网址。

  在实际开发中建议使用第一种方式,因为代码简洁,如果参数是动态变化的,那么可使用字符串格式化对URL动态设置,例如’https://www.baidu.com/s?wd=%s’ %(‘python’)

  POST请求是我们常说的提交表单,表单的数据内容就是POST的请求参数。Requests实现POST请求需设置请求参数data,数据格式可以为字典、元祖、列表和JSON格式。

#字典类型
data = {'key1': 'value1', 'key2': 'value2'}
#元组或列表
(('key1', 'value1'), ('key2', '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,别混淆两者的使用要求。

  Requests提供以下方法获取响应内容:

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

复杂的请求方式

  复杂的请求方式通常有请求头、代理IP、证书验证和Cookies等功能。

#1. 添加请求头,请求头以字典形式生成,
#在发送请求中,设置headers参数指向已定义的请求头。
headers = {'content-type': 'application/json',
           'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36',
           'referer': 'https://www.baidu.com/',
           'connection': 'keep-alive'}
requests.get("https://www.baidu.com/", headers=headers)

<Response [200]>
#2. 使用代理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)
#3. 证书验证:通常设置关闭验证即可。在请求设置参数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')
D:\software\anaconda3\lib\site-packages\urllib3\connectionpool.py:847: InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings
  InsecureRequestWarning)


200
#4. 超时设置:发送请求后,由于网络、服务器等因素,请求到获得响应会有一个时间差。
#如果不想程序等待时间过长或者延长等待时间,可以设定timeout的等待秒数,超过这个时间之后停止等待响应。
#如果服务器在timeout秒内没有应答,将会引发一个异常。
requests.get("https://www.baidu.com/", timeout=0.001)
requests.post("https://www.baidu.com/", timeout=0.001)
#5. 使用Cookies: 在请求过程中使用Cookies也只需设置参数Cookies即可。
#Cookies的作用是标识用户身份,在Requests中以字典或RequestsCookieJar对象作为参数。
import requests
temp_cookies = 'JSESSIONID_GDS=y4p7osFr_IYV%Udyd6cldrWE8MeTpQn0Y58Tg8cCONVP020y2N!450649273;name=value'
cookies_dict = {}
url = 'https://kyfw.12306.cn/otn/leftTicket/init'
for i in temp_cookies.split(';'):
    value = i.split('=')
    cookies_dict[value[0]] = value[1]
r = requests.get(url, cookies=cookies_dict)
print(r.text)
#自动生成一个RequestsCookieJar对象,该对象用于存放Cookies信息。
import requests
url = 'https://movie.douban.com/'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36',
          'connection': 'keep-alive'}
r = requests.get(url, headers=headers)
#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)

#将Cookies字典中的内容添加到RequestsCookieJar对象中
print(requests.utils.add_dict_to_cookiejar(mycookies, cookies_dict))
<RequestsCookieJar[<Cookie bid=OYX5RyXiD-8 for .douban.com/>, <Cookie ll="118220" for .douban.com/>]>
{'bid': 'OYX5RyXiD-8', 'll': '"118220"'}
<RequestsCookieJar[<Cookie bid=OYX5RyXiD-8 for />, <Cookie ll="118220" for />]>
<RequestsCookieJar[<Cookie bid=OYX5RyXiD-8 for />, <Cookie ll="118220" for />, <Cookie bid=OYX5RyXiD-8 for .douban.com/>, <Cookie ll="118220" for .douban.com/>]>
#如果要将Cookies写入文件,可使用http模块实现Cookies的读写。除此之外,还可以将Cookies以字典形式写入文件,
#此方法相比http模块读写Cookies更为简单,但安全性相对较低。
import requests
url = 'http://movie.douban.com/'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36',
           'referer': 'http://movie.douban.com/',
          'connection': 'keep-alive'}
r = requests.get(url, headers=headers)
#RequestsCookieJar转换字典
cookies_dict = requests.utils.dict_from_cookiejar(r.cookies)
#写入文件
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), headers=headers)
print(r.status_code)
{'bid': 'YoDm36r75LM', 'll': '"118220"'}
200

下载与上传

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

import requests
url = 'http://ws.stream.qqmusic.qq.com/C100001Yyla31Dr60y.m4a?fromtag=2'
# url = 'http://ws.stream.qqmusic.qq.com/C400003lghpv0jfFXG.m4a?fromtag=0&guid=126548448&vkey=D661E5DF19B8FEB2FBFC554276746AC608AE98B0F30595B3B3BAD5C1C89ECCDD7BE599E306F786621856D22D6BD6B96F5DD344CF3814DB71'
# url = 'http://ws.stream.qqmusic.qq.com/C400000HjG8v1DTWRO.m4a?guid=358840384&vkey=852D30CD2DEA9E0AFF9CF700977FAFB413A06486CFE8F72502918665277C5407D8D5AD42039F02329401300003A2853B10816B83C3145159&uin=0&fromtag=66(泡沫)'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36',
          'connection': 'keep-alive'}
r = requests.get(url, headers=headers)
f = open('music.m4a', 'wb')
#r.content获取响应内容(字节流)
f.write(r.content)
f.close()
#并不能下载有效文件,目前还不清楚原因是什么,可能接口url不对等
import requests
url = '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)
200
#不同网站设置对files参数的设置是不一样的,下面列出较为常见的上传方法:
#单独一个文件请求
{"field1" : open("filePath1", "rb").read()}
#同时选中多个文件
{"field1" : [("filename1", open("filePath1", "rb")),
             ("filename2", open("filePath2", "rb"), "image/png"),
             open("filePath3", "rb"),
             open("filePath4", "rb").read()] }

小节

   Requests提供了r.status_code、r.raw、r.content、r.text、r.headers、r.json()、r.raise_for_status()、r.url、r.cookies、r.encoding十种方法获取响应内容。

import requests
url = 'https://baidu.com/'
#GET请求
r = requests.get(url, headers=headers, proxies=proxies, verify=False, cookies=cookies)
#POST请求
r = requests.post(url, data=data, files=files, headers=headers, proxies=proxies, verify=False, cookies=cookies)
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值