zoukankan      html  css  js  c++  java
  • 爬虫系列 | 4、详解Requests的用法

    了解了爬虫和网络请求,下面就可以开始正式的了解Python中爬虫相关的模块了

    很多爬虫相关的书籍一般刚开始都会讲一下urllib模块,等你跟着书中的学完之后,会告诉你urllib模块用起来比较复杂,通常不使用

    确实,urllib是一个比较古老的模块,封装的爬虫方法也相对复杂。所以可以直接开始撸requests模块.

    Requests模块的作用就是模拟浏览器发送请求。是Python中原生的一款基于网络请求的模块,不仅功能强大,而且使用起来也比较简单!

    模块的安装

    直接通过pip进行安装即可

    pip install requests
    

    使用起来也非常的简单,分为三步

    • 指定URL,也就是说你要爬取的网站地址
    • 发送请求,请求又分为GET/POST/PUT/DELETE等等
    • 获取响应数据

    这样看是不是非常简单呢?废话不多说,来个简单的例子,比如我需要爬取百度的首页

    GET请求

    # 导入模块
    import requests
    
    url = 'https://www.baidu.com'
    # 发送get请求
    response = requests.get(url)
    # 获取网页源代码
    baidu_html = response.text
    # 将获取的数据进行持久化(保存)
    with open('baidu.html', 'w', encoding='utf-8') as f:
        f.write(baidu_html)
    

    执行之后就会在同级目录下有个baidu.html的文件。

    以上就是一个最最最基本的使用requests发送get请求的例子。同样如果发送其他请求比如POST/PUT/HEAD等等

    requests.post(url)
    requests.delete(url)
    requests.put(url)
    ...
    

    在发送请求的时候,大部分时候会携带一些参数的。比如我们进行搜索的时候,发送的GET请求就会携带搜索内容

    比如我在百度上搜索python时,url是 https://www.baidu.com/s?wd=python


    为了使爬虫程序更加灵活,肯定要将搜索的内容进行分离。可以通过构建一个字典参数,发送GET请求

    import requests
    
    # 输入搜索的关键词
    wd = input('请输入要搜索的内容:
    ')
    url = 'https://www.baidu.com/s?'
    # 构建get请求的搜索参数
    url_param = {'wd': wd}
    # 防止爬虫被拦截,增加请求的UA
    header = {
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36'
    }
    # 发送GET请求
    response = requests.get(url, params=url_param, headers=header)
    # 获取网页源代码
    wd_html = response.text
    # 写入文件,持久化操作
    with open('wd.html', 'w', encoding='utf-8') as f:
        f.write(wd_html)
    
    

    具体的GET用法如下

    # url 访问的地址
    # params 携带的参数
    # **kwargs 其他参数,比如请求头、cookie、代理(proxies)等等
    def get(url, params=None, **kwargs):
    

    POST请求

    使用httpbin网站进行测试

    httpbin是一个能测试HTTP请求和响应的网站,支持各种请求方法

    1、以form表单的形式提交参数,只需要将请求参数构造成一个字典,传给data参数即可。

    import requests
    
    url = 'http://httpbin.org/post'
    params = {'name': '公众号:Python极客专栏', 'language': 'python'}
    response = requests.post(url, data=params)
    print(response.json())
    

    执行结果:

    {
    	'args': {},
    	'data': '',
    	'files': {},
    	'form': {
    		'language': 'python',
    		'name': '公众号:Python极客专栏'
    	},
    	'headers': {
    		'Accept': '*/*',
    		'Accept-Encoding': 'gzip, deflate',
    		'Content-Length': '99',
    		'Content-Type': 'application/x-www-form-urlencoded',
    		'Host': 'httpbin.org',
    		'User-Agent': 'python-requests/2.22.0',
    		'X-Amzn-Trace-Id': 'Root=1-5fef5112-65ad78d4706c58475905fef2'
    	},
    	'json': None,
    	'origin': '',
    	'url': 'http://httpbin.org/post'
    }
    

    2、以字符串的形式提交参数,通过json.dumps将字典转换成字符串

    import requests
    import json
    
    header = {
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36'
    }
    url = 'http://httpbin.org/post'
    params = {'name': 'Tom', 'hobby': ['music', 'game']}
    # 通过json.dumps 将字典格式化为json字符串
    response = requests.post(url, json=json.dumps(params), headers=header)
    print(response.json())
    

    执行结果:

    {
    	'args': {},
    	'data': '"{\"name\": \"Tom\", \"hobby\": [\"music\", \"game\"]}"',
    	'files': {},
    	'form': {},
    	'headers': {
    		'Accept': '*/*',
    		'Accept-Encoding': 'gzip, deflate',
    		'Content-Length': '55',
    		'Content-Type': 'application/json',
    		'Host': 'httpbin.org',
    		'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36', # 请求中加入的headers在这里也可以看到
    		'X-Amzn-Trace-Id': 'Root=1-5fef583e-5224201d08e2ff396416e822'
    	},
    	'json': '{"name": "Tom", "hobby": ["music", "game"]}',
    	'origin': '',
    	'url': 'http://httpbin.org/post'
    }
    

    3、使用post请求提交文件(以multipart形式)

    import requests
    import json
    
    header = {
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36'
    }
    url = 'http://httpbin.org/post'
    # 读取 baidu.html 文件, 'rb':以二进制形式读取
    files = {'file': open('baidu.html', 'rb')}
    # post形式传入file文件
    response = requests.post(url, files=files)
    print(response.json())
    

    执行结果:

    {
    	'args': {},
    	'data': '',
    	'files': {
    		'file': '<!DOCTYPE html>.....此处省略HTML内容...'
    	},
    	'form': {},
    	'headers': {
    		'Accept': '*/*',
    		'Accept-Encoding': 'gzip, deflate',
    		'Content-Length': '2732',
    		'Content-Type': 'multipart/form-data; boundary=1ba2b1406c4a4fe89c1846dc6398dae5',
    		'Host': 'httpbin.org',
    		'User-Agent': 'python-requests/2.22.0',
    		'X-Amzn-Trace-Id': 'Root=1-5fef58f8-68f9fb2246eb190f06092ffb'
    	},
    	'json': None,
    	'origin': '',
    	'url': 'http://httpbin.org/post'
    }
    

    响应的处理

    通过GET/POST等请求会获取到服务器的响应,也就是上面例子中的response。改如何获取更多的信息呢?

    import requests
    
    headers = {
        'referer': 'https://www.baidu.com',
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36'
    }
    url = 'http://httpbin.org/post'
    # 读取 baidu.html 文件, 'rb':以二进制形式读取
    files = {'file': open('baidu.html', 'rb')}
    # post形式传入file文件
    response = requests.post(url, files=files, headers=headers, cookies={'test': 'abcdefg'})
    # response的处理
    # 指定编码
    response.encoding = 'utf-8'
    print(response.url) # 请求的url
    print(response.encoding) # 请求的编码、
    print(response.status_code) # 状态码
    print(response.content) # 响应内容的二进制形式 (保存文件、图片、音频等)
    print(response.text) # 响应内容的文本形式
    print(response.json()) # 响应内容的json形式
    print(response.headers) # 响应头信息
    print(response.request.headers) # 请求头信息
    print(response.request.headers['referer']) # 请求头对应属性的内容
    print(response.cookies) # cookie信息,返回的cookie对象
    print(response.cookies.items())
    

    输出结果如下图

    在这里插入图片描述

  • 相关阅读:
    HTML DOM 06 节点关系
    HTML DOM 05 事件(三)
    HTML DOM 05 事件(二)
    HTML DOM 05 事件(一)
    html DOM 04 样式
    html DOM 03 节点的属性
    html DOM 02 获取节点
    html DOM 01 节点概念
    JavaScript 29 计时器
    JavaScript 28 弹出框
  • 原文地址:https://www.cnblogs.com/wyl-0120/p/14288051.html
Copyright © 2011-2022 走看看