requests请求库

爬虫:爬取、解析、存储

一、请求

1、基本有用的参数

# 1.请求的url
https://www.cnblogs.com/linagcheng/ # 2.请求的方法
post,get,header... # 3.请求头需要携带参数
Cookie
User-Agent # 说明自己是浏览器
Refer # 从哪个网站跳过来 # 4.请求体(formdata)——post请求才有
密码可能加密,可以使用错误的用户名+正确的密码,获取加密过的密码

2、请求url编码

# 1.url编码 --- 参数为中文,实际url使用的是原参数编码过的数据
# 例如:https://www.baidu.com/s?wd=汽车
# 实际上是:https://www.baidu.com/s?wd=%E6%B1%BD%E8%BD%A6 from urllib.parse import urlencode keyword = input(">>>:")
res = urlencode({'wd':keyword})
print(res) # wd=%E6%B1%BD%E8%BD%A6 url = 'https://www.baidu.com/s?'+res
print(url)

3、headers参数——添加请求头中的数据

import requests

response = requests.get(url='https://www.baidu.com/s?wd=%E6%B1%BD%E8%BD%A6',
headers={
'User-Agent':Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36
},
)

4、params参数——不用urlencode

keyword = input('>>>:').strip()
response = requests.get(url='https://www.baidu.com/s?',
params={
'wd':keyword, # url中的参数,不用将中文进行编码
'pn':2, # 页码
},
headers={
'User-Agent':Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36
},
)

5、requests的其他参数

cookies    # cookie 既可以写在requests的cookie中,也可以写在header中的Cookie中
allow_redirects:True/False # requests遇到location也会自动跳转,allow_redirects可以修改是否跳转

6、get方法与post方法

requests.get(url='....', headers={...}, cookie={...}, params={...})

requests.post(url='......', headers={...}, cookie={...}, data={...})

7、请求的整体流程

1.GET方式请求
可能会返回一个token,用于第二次请求携带 2.POST请求

二、响应

1、基本数据

# 响应状态码
200 成功
300 重定向 # 响应头
Location
Cookie # 响应体
html # 正则筛选数据
json # 可以反序列化得到内容
二进制 # 以rb方式打开文件,写入文件

2、响应的参数

response.status_code    # 响应状态码

response.text    # 文本,获取页面HTML字符串
response.content # 二进制数据,可以写入文件 response.history # 获取页面跳转前的内容 response.cookies.get_dict() # 获取响应的cookie,并转换成字典 response.encode ='gbk' # 指定响应内容的编码

3、响应数据

(1)文本数据
response.text

(2)二进制数据
# 1.数据量过大时,相当于一次大数据放入内存,导致内存占用过大
with open('b.mp4','wb') as f:
f.write(response.content) # 2.终极版:使用二进制流解决内存占用过大问题
with open('b.mp4','wb') as f:
for line in response.iter_content(): # response.iter_content() 得到一个迭代器对象
f.write(line) # 逐行写数据
(3)json格式数据
# 解析json格式字符串
res = response.json() # 相当于json.loads(response.text),反序列化

三、简单爬虫

1、普通爬取

import requests
import re # 1.通过requests来获取爬取的页面
def get_page(url):
try:
response=requests.get(url)
if response.status_code == 200:
return response.text
except Exception:
pass # 2.在获取到页面以后,从页面中解析出需要的数据:例如 可以获取视频详情页面的url
def parse_index(index_page):
urls = re.findall('',index_page,re.S) # re.S 去掉换行
for url in urls:
if not url.startswith('http'):
url = 'http://www.baidu.com' + url
yield url # 3.解析完以后,根据解析所得数据获取更深层次的数据:例如根据详情页面的url,获取视频的url
def get_detail_page():
# 正则匹配,从详情页面中获取视屏的url
pass # 4.获取根据视频的url下载视频,保存在文件中
def get_movie(url):
try: # 可能视频请求不到会报异常
response = requests.get(url)
if response.status_code == 200: with open('xxx.mp4','wb') as f:
f.write(response.content)
print('%s现在成功'%url)
except Exception:
pass if __name__ == "__main__":
pass

2、并发爬取

import requests
import re
import hashlib
import time
from concurrent.futures import ThreadPoolExecutor pool=ThreadPoolExecutor(50)
movie_path=r'C:\mp4' def get_page(url):
try:
response=requests.get(url)
if response.status_code == 200:
return response.text
except Exception:
pass def parse_index(index_page):
index_page=index_page.result()
urls=re.findall('class="items".*?href="(.*?)"',index_page,re.S)
for detail_url in urls:
if not detail_url.startswith('http'):
detail_url='http://www.xiaohuar.com'+detail_url
pool.submit(get_page,detail_url).add_done_callback(parse_detail)# 提交任务,成功回调 def parse_detail(detail_page):
detail_page=detail_page.result() # 回调函数返回的是一个对象,从 对象.result() 中获取数据
l=re.findall('id="media".*?src="(.*?)"',detail_page,re.S)
if l:
movie_url=l[0]
if movie_url.endswith('mp4'):
pool.submit(get_movie,movie_url) # 提交任务,成功回调 def get_movie(url):
try:
response=requests.get(url) # 回调函数返回的是一个对象,从 对象.result() 中获取数据
if response.status_code == 200:
m=hashlib.md5()
m.update(str(time.time()).encode('utf-8'))
m.update(url.encode('utf-8'))
filepath='%s\%s.mp4' %(movie_path,m.hexdigest())
with open(filepath,'wb') as f:
f.write(response.content)
print('%s 下载成功' %url)
except Exception:
pass def main():
base_url='http://www.xiaohuar.com/list-3-{page_num}.html'
for i in range(5):
url=base_url.format(page_num=i)
pool.submit(get_page,url).add_done_callback(parse_index) # 提交任务,成功回调 if __name__ == '__main__':
main()

四、requests高级用法

1、SSL认证

# https的网站是需要带证书的

# 访问方式:
# 1.不验证证书,并且去掉警告。大部分网站是可带可不带证书
import requests
from requests.packages import urllib3
urllib3.disable_warnings() # 关闭警告
respone=requests.get('https://www.12306.cn',verify=False) # verify=False不验证证书 # 2.带上证书。部分网站强制携带证书访问,例如:内部网站,金融网站
import requests
respone=requests.get('https://www.12306.cn',
cert=('/path/server.crt',
'/path/key')) # 证书的目录,key的目录,可以冲网站上下载
print(respone.status_code)

2、使用IP代理

# 一个网站的访问频率过高,可能导致当前IP被封
# 使用代理访问网站——先把请求转发给代理主机,然后由代理主机访问目标网站 # 使用方式
# 1.http代理 —— 转发http协议
import requests
response = requests.get('https://www.baidu.com',
proxies={
'http':'http://代理主机ip:port',
'https':'https://代理主机ip:port',
}) # 2.sock代理 —— 不仅可以转发http协议,亦可以转发ftp协议等其他协议
import requests
response = requests.get('https://www.baidu.com',
proxies={
'sock':'http://代理主机ip:port',
})

3、超时设置

# 不设置超时时间,会一直发请求,直到有返回;设置超时时间,当发请求时间超出限制,直接抛出异常

import requests
respone=requests.get('https://www.baidu.com', timeout=0.0001)

4、认证设置(一般用不到,公司内网用的多)

# 例如访问某个加密过的网站,先要验证用户名密码才能访问。例如:加密的博客,如果博客密码不对,无法获取博客内容

# HTTPBasicAuth是基本的加密,一般使用自定义的加密算法
# 要认证需要知道加密算法,或者手动认证获取cookie
import requests
from requests.auth import HTTPBasicAuth
res=requests.get('xxx',auth=HTTPBasicAuth('user','password'))
print(res.status_code) # HTTPBasicAuth可以简写为如下格式 —————— auth参数
import requests
res=requests.get('xxx',auth=('user','password'))
print(res.status_code)

5、异常处理

# 异常处理

import requests
from requests.exceptions import * # 可以查看requests.exceptions获取异常类型 try:
r=requests.get('http://www.baidu.com',timeout=0.00001)
except ReadTimeout:
print('===:')
except RequestException:
print('Error')

6、上传文件

# post方法中有一个 files参数

import requests
files={'file':open('a.jpg','rb')} # 字典
respone=requests.post('http://httpbin.org/post',files=files)
print(respone.status_code)

五、session方法(建议使用)

import requests

session = requests.session()
sesssion.get() # 当发请求时,就会返回一个cookie,session方法得到的对象可以保存这个cookie,不用手动获取cookie用来第二次请求
session.post()

六、selenium模块

爬虫(一)—— 请求库(一)requests请求库的更多相关文章

  1. 爬虫 Http请求,urllib2获取数据,第三方库requests获取数据,BeautifulSoup处理数据,使用Chrome浏览器开发者工具显示检查网页源代码,json模块的dumps,loads,dump,load方法介绍

    爬虫 Http请求,urllib2获取数据,第三方库requests获取数据,BeautifulSoup处理数据,使用Chrome浏览器开发者工具显示检查网页源代码,json模块的dumps,load ...

  2. 爬虫之requests请求库

    介绍 #介绍:使用requests可以模拟浏览器的请求,比起之前用到的urllib,requests模块的api更加便捷(本质就是封装了urllib3) #注意:requests库发送请求将网页内容下 ...

  3. 爬虫——请求库之requests

    阅读目录 一 介绍 二 基于GET请求 三 基于POST请求 四 响应Response 五 高级用法 一 介绍 #介绍:使用requests可以模拟浏览器的请求,比起之前用到的urllib,reque ...

  4. 4.爬虫 requests库讲解 GET请求 POST请求 响应

    requests库相比于urllib库更好用!!! 0.各种请求方式 import requests requests.post('http://httpbin.org/post') requests ...

  5. 爬虫 - 请求库之requests

    介绍 使用requests可以模拟浏览器的请求,比起python内置的urllib模块,requests模块的api更加便捷(本质就是封装了urllib3) 注意:requests库发送请求将网页内容 ...

  6. 爬虫请求库之requests库

    一.介绍 介绍:使用requests可以模拟浏览器的请求,比之前的urllib库使用更加方便 注意:requests库发送请求将网页内容下载下来之后,并不会执行js代码,这需要我们自己分析目标站点然后 ...

  7. python利用requests库模拟post请求时json的使用

    我们都见识过requests库在静态网页的爬取上展现的威力,我们日常见得最多的为get和post请求,他们最大的区别在于安全性上: 1.GET是通过URL方式请求,可以直接看到,明文传输. 2.POS ...

  8. 小白学 Python 爬虫(32):异步请求库 AIOHTTP 基础入门

    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...

  9. 请求库之requests模块

    本片导航: 介绍 基于GET请求 基于POST请求 响应Response 高级用法   一.介绍 #介绍:使用requests可以模拟浏览器的请求,比起之前用到的urllib,requests模块的a ...

随机推荐

  1. 0x3f3f3f3f 0xbfbfbfbf 等的原理及应用

    原理 0x的意思其实是十六进制,后面加的数其实就是一个十六进制数. 在十六进制中,我们知道a代表10,b代表11,c代表12,d代表13,e代表14,f代表15. 所以3f3f3f3f这个数用十进制数 ...

  2. CodeChef Little Elephant and Balance

    Given an array A1,A2...AN, you have to print the size of the largest contiguous subarray such that L ...

  3. POJ 3764 The xor-longest Path (01字典树)

    <题目链接> 题目大意: 给定一颗$n$个节点$(n\leq10^5)$,有边权的树,其边权$(0\leq w < 2^{31})$.让你求出这棵树上任意两个节点之间的异或最大值. ...

  4. .net core 调用webservice同步方法

    更新VS2019 16.1版本 支持WebService同步调用 在连接服务中->选择客户端选项->Generate Synchronout Operations选择划勾   生成同步操作 ...

  5. 基于TensorFlow Object Detection API进行迁移学习训练自己的人脸检测模型(二)

    前言 已完成数据预处理工作,具体参照: 基于TensorFlow Object Detection API进行迁移学习训练自己的人脸检测模型(一) 设置配置文件 新建目录face_faster_rcn ...

  6. tensorflow的reshape操作tf.reshape()

    在处理图像数据的时候总会遇到输入图像的维数不符合的情况,此时tensorflow中reshape()就很好的解决了这个问题. 更为详细的可以参考官方文档说明: numpy.reshape reshap ...

  7. Dev控件

    在DevExpress程序中使用PopupContainerEdit和PopupContainer实现数据展示 使用PopupContainerEdit和PopupContainerControl制作 ...

  8. 关于.net中使用reportview所需注意

    参考文章链接:http://www.cnblogs.com/watercold/p/5258608.html 这段时间在做一个winform的小项目时,发现使用.net中的ReportViewer插件 ...

  9. Sass-乘法

    Sass 中的乘法运算和前面介绍的加法与减法运算还略有不同.虽然他也能够支持多种单位(比如 em ,px , %),但当一个单位同时声明两个值时会有问题.比如下面的示例: 编译的时候报“20px*px ...

  10. HTML基础:用表单写一个简易登录页面

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...