一、什么是requests 模块

  requests模块是python中原生的基于网络请求的模块,功能强大,用法简洁高效。在爬虫领域中占据着半壁江山的地位。requests模块作用:模拟浏览器发请求。

二、为什么要使用requests 模块

 因为在使用urllib模块的时候,会有诸多不便之处,总结如下:

  • 手动处理url编码
  • 手动处理post请求参数
  • 处理cookie和代理操作繁琐
  • ......

而使用requests模块的优势:

  • 自动处理url编码
  • 自动处理post请求参数
  • 简化cookie和代理操作
  • ......

三、如何使用requests模块

 安装: pip install requests

 使用流程

  • 指定url
  • 基于requests模块发起请求
  • 获取响应对象中的数据值
  • 持久化存储

requests 模块的各种请求方式

   

最常用的请求方式就是 post 和 get 请求。params 在 get 请求中使用,data、json在post请求中使用。自动和url进行拼接,发请求。

response = requests.get(url, params={'key':'value'})
response = requests.post(url, data={'key':'value'})

请求参数

通常请求参数有以下几个

  • url :需要抓取的URL地址
  • headers : 请求头
  • timeout : 超时时间,超过时间会抛出异常

下面,再分享2个其他可能会遇到的参数,关于非常重要的IP参数,在后面进行讲解。

(1)authWeb客户端验证参数

res = requests.get(url, headers=headers, auth=('username','password'))

针对于需要web客户端用户名密码认证的网站

例如:

import requests
from lxml import etree
import random
import os class CodeSpider(object):
def __init__(self):
self.url = 'http://code.tarena.com.cn/AIDCode/aid1904/14-redis/'
self.auth
= ('tarenacode', 'code_2013')
self.ua_list = [
'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1',
'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0',
'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .\
NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; InfoPath.3)', ] def parse_html(self):
# 获取响应内容
html = requests.get(url=self.url, headers={'User-Agent': random.choice(self.ua_list)}, auth=self.auth)
html = html.content.decode('utf-8', 'ignore') parse_html = etree.HTML(html)
r_list = parse_html.xpath('//a/@href') # # r_list : ['../','day01','day02','redis_day01.zip']
for r in r_list:
if r.endswith('.zip') or r.endswith('.rar'):
self.save_files(r) def save_files(self, r):
directory = '/home/tarena/AID/redis/'
if not os.path.exists(directory):
os.makedirs(directory) # 拼接地址,把zip文件保存到指定目录
url = self.url + r
# filename: /home/tarena/AID/redis/xxx.zip
filename = directory + r
html = requests.get(url=url, headers={'User-Agent': random.choice(self.ua_list)}, auth=self.auth).content with open(filename, 'wb') as f:
f.write(html)
print('%s下载成功' % r) if __name__ == '__main__':
spider = CodeSpider()
spider.parse_html()

(2)SSL证书认证参数-verify

SSL证书认证参适用于没有经过证书认证机构认证的https类型网站,如果网站抛出 SSLError 异常,则考虑使用此参数。

response = requests.get(url=url,params=params,headers=headers,verify=False) 

verify:

  • True   ( 默认 ) 检查证书认证;
  • False(常用)忽略证书认证;

响应对象response的属性

  • text :返回的是Unicode型的数据;取html源码;
  • content :返回的是bytes型也就是二进制的数据。取图片,文件;
  • json() : 返回的是json格式数据;
  • status_code :HTTP响应码;
  • encoding :响应字符编码 response.encoding = 'utf-8';

非结构化数据的保存方式。如压缩文件zip、图片文件等都可以使用非结构化数据的保存方式

with open('xxx.jpg','wb') as f:
f.write(response.content)

四、User-Agent  *****

  通过自定义请求对象,用于伪装爬虫程序请求的身份。

  User-Agent参数,简称为UA,该参数的作用是用于表明本次请求载体的身份标识。如果我们通过浏览器发起的请求,则该请求的载体为当前浏览器,则UA参数的值表明的是当前浏览器的身份标识表示的一串数据。如果我们使用爬虫程序发起的一个请求,则该请求的载体为爬虫程序,那么该请求的UA为爬虫程序的身份标识表示的一串数据。有些网站会通过辨别请求的UA来判别该请求的载体是否为爬虫程序如果为爬虫程序,则不会给该请求返回响应,那么我们的爬虫程序则也无法通过请求爬取到该网站中的数据值,这也是反爬虫的一种初级技术手段。为了防止该问题的出现,则我们可以给爬虫程序的UA进行伪装,伪装成某款浏览器的身份标识。

UA检测:网站服务器会检测请求的载体身份标识,如果检测到是基于爬虫程序的,则阻止该次请求。

UA伪装(反爬机制):

反爬机制:某些门户网站会对访问该网站的请求中的User-Agent进行捕获和判断,如果该请求的UA为爬虫程序,则拒绝向该请求提供数据。

反反爬策略:将爬虫程序的UA伪装成某一款浏览器的身份标识。

import requests
url = 'http://www.baidu.com/'
headers={
'User-Agent' : 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'
}
request =request.get(url=url,headers=headers)

找到User-Agent,复制下来。

五、requests 模块使用实例

1 基于requests模块的get请求

示例:爬取搜狗指定词条搜索后的页面数据 (网页采集器, 动态获取)

 import requests
word = input('enter a word:')
url = 'https://www.sogou.com/web' headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'
} param = {
'query':word
} response = requests.get(url=url,params=param)
page_text = response.text fileName = word+'.html'
with open(fileName,'w',encoding='utf-8') as fp:
fp.write(page_text) print(fileName,'爬取成功!')

基于requests模块的post请求

示例:登录豆瓣电影,爬取登录成功后的页面数据

 import requests
import os url = 'https://accounts.douban.com/login' data = {
"source": "movie",
"redir": "https://movie.douban.com/",
"form_email": "131XXXXXXXX",
"form_password": "***",
"login": "登录",
} headers={
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36',
} response = requests.post(url=url,data=data)
page_text = response.text
with open('./douban111.html','w',encoding='utf-8') as fp:
fp.write(page_text)

基于requests模块ajax的get请求 

示例:爬取豆瓣电影分类排行榜中的电影详情数据

 import requests
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36'
}
url = 'https://movie.douban.com/j/chart/top_list?type=5&interval_id=100%3A90&action=&start=0&limit=20' movie_list = requests.get(url=url,headers=headers).json() all_names = []
for dic in movie_list:
name = dic['title']
all_names.append(name) print(all_names)

基于requests模块ajax的post请求

示例:破解百度翻译

 import requests

 url = 'https://fanyi.baidu.com/sug'
wd = input('enter something of English:')
data = {
'kw':wd
} headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36'
} response = requests.post(url=url,data=data,headers=headers) obj_json = response.json()
print(obj_json)

综合练习:爬取国家药品监督管理总局中基于中华人民共和国化妆品生产许可证相关数据

 import requests
from fake_useragent import UserAgent ua = UserAgent(use_cache_server=False,verify_ssl=False).random
headers = {
'User-Agent':ua
} url = 'http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsList' all_id_list = [] for page in range(1,11):
data = {
'on': 'true',
'page': str(page),
'pageSize': '',
'productName':'',
'conditionType': '',
'applyname':'',
'applysn':''
} json_text = requests.post(url=url,data=data,headers=headers).json()
for dict in json_text['list']:
id = dict['ID']
all_id_list.append(id) post_url = 'http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsById'
for id in all_id_list:
post_data = {
'id': id
}
response = requests.post(url=post_url, data=post_data, headers=headers) if response.headers['Content-Type'] == 'application/json;charset=UTF-8':
json_text = response.json()
print(json_text['businessPerson'])

查看是不是动态加载页面,就在开发者工具中的response中搜索。不能搜到就证明是动态加载出来的。

其他概念:

  • 结构化数据:即行数据,存储在数据库里,可以用二维表结构来逻辑表达实现的数据。
  • 非结构化数据:包括所有格式的办公文档、文本、图片、XML、HTML、各类报表、图像和音频/视频信息等等。

03 requests模块基础的更多相关文章

  1. 03爬虫-requests模块基础(1)

    requests模块基础 什么是requests模块 requests模块是python中原生基于网络模拟浏览器发送请求模块.功能强大,用法简洁高效. 为什么要是用requests模块 用以前的url ...

  2. 03.requests模块(1)

    目录 03.requests模块(1) 展开requests模块的学习 代码实例 需求:爬取搜狗指定词条搜索后的页面数据 需求:登录豆瓣电影,爬取登录成功后的页面数据 需求:爬取豆瓣电影分类排行榜 h ...

  3. 爬虫之requests模块基础

    一.request模块介绍 1. 什么是request模块 - python中原生的基于网络请求的模块,模拟浏览器发起请求. 2. 为什么使用request模块 - urllib需要手动处理url编码 ...

  4. requests模块基础

    requests模块 .caret, .dropup > .btn > .caret { border-top-color: #000 !important; } .label { bor ...

  5. python学习之-requests模块基础

    安装版本:2.18 模块导入:import requests l  发送请求 发送GET请求: 获取GITHUB的公共时间线 r = requests.get(url='https://api.git ...

  6. 05爬虫-requests模块基础(2)

    今日重点: 1.代理服务器的设置 2.模拟登陆过验证码(静态验证码) 3.cookie与session 4.线程池 1.代理服务器的设置 有时候使用同一个IP去爬取同一个网站,久了之后会被该网站服务器 ...

  7. 爬虫基础以及 re,BeatifulSoup,requests模块使用

    爬虫基础以及BeatifulSoup模块使用 爬虫的定义:向网站发起请求,获取资源后分析并提取有用数据的程序 爬虫的流程 发送请求 ---> request 获取响应内容 ---> res ...

  8. Python高手之路【八】python基础之requests模块

    1.Requests模块说明 Requests 是使用 Apache2 Licensed 许可证的 HTTP 库.用 Python 编写,真正的为人类着想. Python 标准库中的 urllib2  ...

  9. 爬虫基础之requests模块

    1. 爬虫简介 1.1 概述 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本. 1.2 爬虫的价值 在互 ...

随机推荐

  1. requests模块:请求网页

    请求网页时需要设置对应的headers(请求头) import requests link = 'https://movie.douban.com' headers = {'User-Agent': ...

  2. 目标检测:keras-yolo3之制作VOC数据集训练指南

    制作VOC数据集指南 Github:https://github.com/hyhouyong/keras-yolo3 LabelImg标注工具(windows环境下):https://github.c ...

  3. Android 开发感想

    18年从.net转行做安卓开发,现在已经过去一年多了.说一下感想和心得体会! 一.开始 说一下我的经厉,从毕业开始出来工作一直是从事.net方向的开发工作.一开始也是没什么经验,加上也没有其他手艺就找 ...

  4. Excel催化剂开源第37波-音视频文件元数据提取(分辨率,时长,采样率等)

    上一篇提到图片元信息Exif的提取,当然还有一类音视频文件,也同样存储着许多宝贵的元数据,那就开源到底呗,虽然自己找寻过程也是蛮艰辛坎坷的,大家看后有收获,只求多多传播下,让前人的工作可以更有价值. ...

  5. 小记---idea springboot 报错没有get或者set方法

    给idea 安装一个插件即可

  6. 查询表格——建立动态表格,使用ajax输入查询条件将后台数据查询出来以表格的形式展示出来

    建立动态表格,使用ajax将前台查询条件传给后台,并将查询结果以表格的形式展示出来. 页面的展示效果如下图所示: 第一步:查询条件的部分: 代码如下: <div class="text ...

  7. git commit规范化实践

    最近从svn转到git进行代码版本控制,今天了解了git commit规范化的一些知识后,写此文章记录下配置过程. 环境 编辑器使用的是vscode,项目框架是vue3.0 规范化工具 规范化git ...

  8. Windows+Apache+Python+Django 踩坑记录

    摘要 使用Python进行Web项目开发:相对于主流三大Web端解决方案(Java/.NET/PHP) Python在某些方面具有一定的优势,相对 Java/.NET 有更轻量级的部署方案,相对PHP ...

  9. Flink 灵魂两百问,这谁顶得住?

    Flink 学习 https://github.com/zhisheng17/flink-learning 麻烦路过的各位亲给这个项目点个 star,太不易了,写了这么多,算是对我坚持下来的一种鼓励吧 ...

  10. Unity3D热更新之LuaFramework篇[08]--热更新原理及热更服务器搭建

    前言 前面铺垫了这么久,终于要开始写热更新了. Unity游戏热更新包含两个方面,一个是资源的更新,一个是脚本的更新. 资源更新是Unity本来就支持的,在各大平台也都能用.而脚本的热更新在iOS平台 ...