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. 暂时放弃ts版个人博客转js版博客

    我本打算信心满满的做个vue+ts做个博客的,其实架构搭的差不多了,但是我在用vuex的时候发现一个自己无法忍受的瑕疵,那就是在用vuex的时候,得利于普通版vuex的map语法糖实在太好用,这把我惯 ...

  2. 数组降维-JavaScript中apply方法妙用

    海纳百川,有容乃大 1.普通循环转换方式 将多维数组(尤其是二维数组)转化为一维数组是业务开发中的常用逻辑,除了使用朴素的循环转换以外,我们还可以利用Javascript的语言特性实现更为简洁优雅的转 ...

  3. 关于在IE下JavaScript的 Stack overflow at line 错误可能的原因

    该错误只在IE中出现,出现该提示的原因主要有两种: 1. 重定义了系统的触发事件名称作为自定义函数名如:  onclick / onsubmit …  都是系统保留的事件名称,不允许作为重定义函数名称 ...

  4. CLR 垃圾回收知识梳理

  5. 在Intellij上开发项目发布到tomcat时,同一个局域网内的其他机子访问不到自己电脑上tomcat中的项目,只能本机访问

    在Intellij上开发项目发布到tomcat时,同一个局域网内的其他机子访问不到自己电脑上tomcat中的项目,只能本机访问 问题描述:在Intellij上开发项目发布到tomcat时,同一个局域网 ...

  6. 【记录】微信emoji表情存入数据库

    最近遇到一个问题,在微信授权获取用户信息的时候,由于微信昵称(nickName)是表情,无法存入数据库. 查其原因,原来是因为数据库的编码格式不正确,我的是utf-8 改成utf8mb4就可以了. 其 ...

  7. vue,一路走来(13)--vue微信分享

    vue微信分享 今天记录一下vue微信分享. 1.先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”.这个不多说,见文档,只有绑定了才能进行下一步的动作 2.需要引入js文件 ...

  8. 8VC Venture Cup 2017 - Elimination Round - A

    题目链接:http://codeforces.com/contest/755/problem/A 题意:给定一个正整数N,问你是否存在一个数M使得N*M+1不是素数(M的范围在[1,1000]). 思 ...

  9. Altium Designer 19 单层显示

    PCB视图下,按快捷键L 弹出对话框 选择 view options 选项卡 Single Layer Mode 点击为on 快捷键为Shift + s

  10. NET Core+win10+Jenkins+Gogs+open ssh持续集成

    背景 阿里云测试环境一台,带宽1M跟不上,Jenkins安装一个插件耗时很长,于是想在本地搭建Jenkins服务,将生成的安装文件同步到目标服务器上. 技术点有: win10:本地环境是win10,测 ...