爬虫之requests模块

news/2024/7/19 8:59:07 标签: 爬虫, json, python

requests模块

什么是requests模块

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

安装

pip  install   requests      //注意有的可能是pip3
使用流程 :
- 指定url - 基于requests模块发起请求 - 获取响应对象中的数据值 - 持久化存储

requests库7个主要方法

方法说明
requsts.requst()构造一个请求,最基本的方法,是下面方法的支撑
requsts.get()获取网页,对应HTTP中的GET方法
requsts.post()向网页提交信息,对应HTTP中的POST方法
requsts.head()获取html网页的头信息,对应HTTP中的HEAD方法
requsts.put()向html提交put方法,对应HTTP中的PUT方法
requsts.patch()向html网页提交局部请求修改的的请求,对应HTTP中的PATCH方法
requsts.delete()向html提交删除请求,对应HTTP中的DELETE方法

 

requests.get()

源码浅析

def request(method, url, **kwargs):  # method = 请求方式(http方法)
    with sessions.Session() as session:
        return session.request(method=method, url=url, **kwargs)
        # 返回Session对象的request方法

# 点进去查看
def request(self, method, url,
        params=None, data=None, headers=None, cookies=None, files=None,
        auth=None, timeout=None, allow_redirects=True, proxies=None,
        hooks=None, stream=None, verify=None, cert=None, json=None):

    req = Request(
        method=method.upper(),
        url=url,
        headers=headers,
        files=files,
        data=data or {},
        json=json,
        params=params or {},
        auth=auth,
        cookies=cookies,
        hooks=hooks,
    )
    prep = self.prepare_request(req)

    proxies = proxies or {}

    settings = self.merge_environment_settings(
        prep.url, proxies, stream, verify, cert
    )


    send_kwargs = {
        'timeout': timeout,
        'allow_redirects': allow_redirects,
    }
    send_kwargs.update(settings)
    resp = self.send(prep, **send_kwargs)

    return resp
View Code

爬取网页的通用代码框架

import requests

def get_html(url, params):
    try:
        r = requests.get(url, params)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        return r.text except: return "raise exception" if __name__ == "__main__": url = "http://www.baidu.com" print(get_html(url))
get方法传参
request.get(url,params=None,**kwargs)
从上面的源码也可以知道,解释一下参数含义
url: 获取html的网页的url
params:url中的额外的参数,字典或字节流格式,可选
**kwargs: 12个控制访问的参数
get传参
requestsl两个重要对象
r = requests.get(url)
r:是一个Response对象,一个包含服务器资源的对象
.get(url):是一个Request对象,构造一个向服务器请求资源的Request。
r.status_code
HTTP请求返回状态码,200表示成功

r.text
HTTP响应的字符串形式,即,url对应的页面内容

r.encoding
从HTTP header中猜测的响应内容的编码方式

r.apparent_encoding
从内容中分析响应内容的编码方式(备选编码方式)

r.content
HTTP响应内容的二进制形式


理解Response编码
r.encoding:如果header中不存在charset,则认为编码是ISO-8859-1,r.text根据r.encoding显示网页内容
r.apparent_encoding:根据网页内容分析处的编码方式可以看做是r.encoding的备选
属性
response = requests.get('http://www.jianshu.com/')
# 获取响应状态码
print(type(response.status_code),response.status_code)
# 获取响应头信息
print(type(response.headers),response.headers)
# 获取响应头中的cookies
print(type(response.cookies),response.cookies)
# 获取访问的url
print(type(response.url),response.url)
# 获取访问的历史记录
print(type(response.history),response.history)
CodeDemo

异常

理解requests库的异常:网络链接有风险,异常处理很重要

requests.ConnectionError  网络连接异常,如DNS查询失败,拒绝连接等

requests.HTTPError  #HTTP错误异常

requests.URLRequired  #URL缺失异常

requests.TooManyRedirects  #超过最大重定向次数,产生重定向异常

requests.ConnectTimeout  #连接远程服务器超时异常

requests.Timeout  #请求URL超时,产生超时异常
异常
import requests
from requests.exceptions import ReadTimeout, ConnectionError, RequestException

try:
  response = requests.get("http://httpbin.org/get", timeout = 0.5)
          print(response.status_code)
except ReadTimeout:
  # 超时异常
  print('Timeout')
except ConnectionError:
  # 连接异常
  print('Connection error')
except RequestException:
  # 请求异常
  print('Error')
CodeDemo

Requests库中的post()方法

爬取网页的通用代码框架,一般用于验证提交信息登录

import requests

def get_html(url, params):
    try:
        r = requests.post(url, data)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        return r.text
    except:
        return "raise exception"

if __name__ == "__main__":
    url = "http://url.com.login"
    data = {
        “username”:"user",
        "password":"password"
        }
    print(get_html(url=url,data=data))    

Requests库主要方法解析

method
1. requests.request(method, url, **kwargs) 
  构造并发送一个Request对象,返回一个Response对象。

  参数:
    - method – 新建 Request 对象要使用的HTTP方法
    - url – 新建 Request 对象的URL
    - params – (可选) Request 对象的查询字符中要发送的字典或字节内容
    - data – (可选) Request 对象的 body 中要包括的字典、字节或类文件数据
    - json – (可选) Request 对象的 body 中要包括的 Json 数据
    - headers – (可选) Request 对象的字典格式的 HTTP 头
    - cookies – (可选) Request 对象的字典或 CookieJar 对象
    - files – (可选) 字典,'name': file-like-objects (或{'name': ('filename', fileobj)}) 用于上传含多个部分的(类)文件对象
    - auth – (可选) Auth tuple to enable Basic/Digest/Custom HTTP Auth.
    - timeout (浮点或元组) – (可选) 等待服务器数据的超时限制,是一个浮点数,或是一个(connect timeout, read timeout) 元组
    - allow_redirects (bool) – (可选) Boolean. True 表示允许跟踪 POST/PUT/DELETE 方法的重定向
    - proxies – (可选) 字典,用于将协议映射为代理的URL
    - verify – (可选) 为 True 时将会验证 SSL 证书,也可以提供一个 CA_BUNDLE 路径
    - stream – (可选) 如果为 False,将会立即下载响应内容
    - cert – (可选) 为字符串时应是 SSL 客户端证书文件的路径(.pem格式),如果是元组,就应该是一个(‘cert’, ‘key’) 二元值对


2. requests.head(url, **kwargs) 
  发送一个 HEAD 请求,返回一个 Response 对象

参数:
    - url – 新建 Request 对象的URL
    - **kwargs – 见 *request* 方法接收的可选参数

 
3. requests.get(url, **kwargs) 
  发送一个 GET 请求,返回一个 Response 对象

参数:
    - url – 新建 Request 对象的URL
    - **kwargs – 见 *request* 方法接收的可选参数


4. requests.post(url, data=None, **kwargs) 
  发送一个 POST 请求,返回一个 Response 对象

参数:
    - url – 新建 Request 对象的URL
    - data – (可选) Request 对象的 body 中要包括的字典、字节或类文件数据
    - **kwargs – 见 *request* 方法接收的可选参数


5. requests.put(url, data=None, **kwargs) 
  发送一个 PUT 请求,返回一个 Response 对象

参数:
    - url – 新建 Request 对象的URL
    - data – (可选) Request 对象的 body 中要包括的字典、字节或类文件数据
    - **kwargs – 见 *request* 方法接收的可选参数

 
6. requests.patch(url, data=None, **kwargs) 
  发送一个 PUT 请求,返回一个 Response 对象

参数:
    - url – 新建 Request 对象的URL
    - data – (可选) Request 对象的 body 中要包括的字典、字节或类文件数据
    - **kwargs – 见 *request* 方法接收的可选参数


7. requests.delete(url, **kwargs) 
  发送一个 PUT 请求,返回一个 Response 对象

参数:
    - url – 新建 Request 对象的URL
    - **kwargs – 见 *request* 方法接收的可选参数
method和**kwargs

简单应用

1.爬取搜狗页面数据

import requests

# 1 指定url
url = "https://www.sogou.com"
# 2 发送请求
response = requests.get(url) # 返回一个响应
# 3 获取页面数据
print(response.url) # 显示当前爬的url https://www.sogou.com/
# print(response.text, type(response.text)) # 显示当前爬的str类型的页面数据
# print(response.content, type(response.content)) # 显示当前爬的bytes类型的页面数据
print(response.headers['Content-Type']) # 请求类型 text/html; charset=UTF-8

# 4.页面数据的持久化数据
with open("sogou.html", "w", encoding="utf-8") as f:
f.write(response.text)

2.登录豆瓣电影,爬取登录成功后的页面数据

import requests


url = 'https://accounts.douban.com/login'
# 封装请求参数
data = {
    "source": "movie",
    "redir": "https://movie.douban.com/",
    "form_email": "15027900535",
    "form_password": "bobo@15027900535",
    "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('./douban.html', 'w', encoding='utf-8') as fp:
    fp.write(page_text)

3.爬取肯德基餐厅地址

import requests

if __name__ == "__main__":
    # 指定ajax-post请求的url(通过抓包进行获取)
    url = 'http://www.kfc.com.cn/kfccda/storelist/index.aspx'

    # 定制请求头信息,相关的头信息必须封装在字典结构中
    headers = {
        # 定制请求头中的User-Agent参数,当然也可以定制请求头中其他的参数
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36',
    }

    # 定制post请求携带的参数(从抓包工具中获取)
    data = {
        'cname': '',
        'pid': '',
        'keyword': '北京',
        'pageIndex': '1',
        'pageSize': '10'
    }
    # 发起post请求,获取响应对象
    response = requests.post(url=url, headers=headers, data=data)

    # 获取响应内容:响应内容为json串
    print(response.text)

 

4.网站爬取数据

import requests

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36'
}
url = 'http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsList'
pageNum = 3
all_id_list = []
for page in range(3, 5):
    data = {
        'on': 'true',
        'page': str(page),
        'pageSize': '15',
        'productName': '',
        'conditionType': '1',
        'applyname': '',
        'applysn': ''
    }
    json_text = requests.post(url=url, data=data, headers=headers).json()
    # all_id_list = []
    for dict in json_text['list']:
        id = dict['ID']  # 用于二级页面数据获取
        all_id_list.append(id)
    # 该url是一个ajax的post请求
    post_url = 'http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsById'
    for id_ in all_id_list:
        data = {
            'id': id_
        }
        response = requests.post(url=post_url, data=data, headers=headers)
        # 该请求响应回来的数据有两个,一个是基于text,一个是基于json的,所以可以根据content-type,来获取指定的响应数据
        if response.headers['Content-Type'] == 'application/json;charset=UTF-8':
            # print(response.json())
            # 进行json解析
            json_text = response.json()
            print(json_text['businessPerson'])

 

转载于:https://www.cnblogs.com/clbao/p/10250400.html


http://www.niftyadmin.cn/n/1086265.html

相关文章

PHP显示网站运行时间,php实例分享之实现显示网站运行时间

废话不多说,直接上代码。复制代码 代码如下:// 设置时区date_default_timezone_set(Asia/Shanghai);/*** 秒转时间,格式 年 月 日 时 分 秒** author wangyupeng129126.com* param int $time* return array|boolean*/function Sec2Time($time){if(is_num…

centos 安装idea 非可视化_我要打10个:可能是Redis可视化工具最全的横向评测

文章封面:云南香格里拉松赞林寺http://suo.im/66KSqr1 命令行不知道大家在日常操作redis时用什么可视化工具呢?以前总觉得没有什么太好的可视化工具,于是问了一个业内朋友。对方回:你还用可视化工具?直接命令行呀&…

centos 如何测udp端口是否开放_如何在 CentOS8/RHEL8 中配置 Rsyslog 服务器 | Linux 中国...

Rsyslog 是一个自由开源的日志记录程序,在 CentOS 8 和 RHEL 8 系统上默认可用。它提供了一种从客户端节点到单个中央服务器的“集中日志”的简单有效的方法。-- James KiarieRsyslog 是一个自由开源的日志记录程序,在 CentOS 8 和 RHEL 8 系统上默认可用…

cp -r命令 linux什么意思,linux命令 $- 是什么意思

$-记录着当前设置的shell选项,himBH是默认值,5个字母分别有各自含义。解释如下:h:hashall,打开这个选项后,Shell 会将命令所在的路径记录下来,避免每次都要查询。举例:当h选项开启时…

BZOJ4541 HNOI2016矿区(平面图转对偶图)

考虑先将平面图转化为对偶图。具体地,将无向边拆成两条有向边。每次考虑找到包围一个区域的所有边。对当前考虑的边,找到该边的反向边在该边终点的出边集中,按极角序排序的后继,这条后继边也是包围该区域的边。这样对偶图就建好了…

rust修改礼包时间_「Rust语言」噢,不!我的数据科学正在Rust化

Python是数据科学家最流行的编程语言之一——这是有充分理由的。Python包索引(PyPI)承载了大量令人印象深刻的数据科学库包,比如NumPy、SciPy、自然语言工具包、Pandas和Matplotlib。大量可用的高质量分析库及其庞大的开发人员社区使Python成为许多数据科学家的容易…

MongDB 配置成本地服务

一.配置mangodb. 首先现在下来直接安装就好了, 可视化工具可以后面再安装. 在自己安装的目录下面(这个随意做好能够放一块)建立一个data文件, 再在下面建立一个db文件 在cmd中进入到MongoDB\bin的文件下 输入mongod --dbpath 【E:\Mongodb_data\bd】(自定义的db的…

api质量等级_用车养护 | API、SAE都是什么?你真的会加汽车机油么?

懂你所想的 惠州裕惠诚长安汽车 机油,被称为汽车的“血液”,在汽车的工作中扮演极其重要的角色,对发动机的工作起到很好的辅助和保护作用,如润滑减磨、冷却降温、防锈防蚀、减震缓冲等。选用机油时,我们经常会看到机油…