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())
    

    输出结果如下图

    在这里插入图片描述

  • 相关阅读:
    P12 向量组03--极大线性无关组
    超导体
    Matlab中disp、fprintf和sprintf有什么区别?
    点击word页面自动弹出信息检索很烦人
    Postman 官方中文版 v7.25.3
    无法为更新定位行。一些值可能已在最后一次读取后已更改解决办法
    Everything文件查找工具
    Delphi的DataSource事件
    Delphi中inherited问题
    delphi窗体继承
  • 原文地址:https://www.cnblogs.com/wyl-0120/p/14288051.html
Copyright © 2011-2022 走看看