• 【python】爬虫系列之requests库介绍


    目录

    一、 安装requests模块

     二、 requests模块常用的方法和属性

    三、 发送带有headers参数的请求

    四、 发送带参数的请求

    五、 在header参数中携带cookie

     六、使用超时参数timeout

     七、 proxies代理参数的使用

    八、 发送post请求


    活动地址:CSDN21天学习挑战赛

    **

    学习日记 Day 14

    **

     前面讲解了关于爬虫的入门内容,本文学习与爬虫相关的requests模块的内容。

    requests主要用于发送请求获取响应,该模块有很多的替代模块,比如urlib模块。但相对来说requests模块代码简洁 易懂,相对于urlib模块,使用requests编写的代码会更少,实现某个功能更简单。

    一、 安装requests模块

    点击 【win+r】,输入cmd,输入如下对应的pip命令,等待安装成功。

    pip install requests

     二、 requests模块常用的方法和属性

    •  requests模块的常用方法和属性如下:
    方法名/属性名说明
    response = requests.get(url)发送请求获取的响应对象(比较常用)
    response = requests.post(url)发送请求获取的响应对象
    response.json()自动将json字符串类型的响应内容转换为python对象(dict 或 list)
    response.url响应的url,有时候响应的url与请求的url并不一致
    response.status_code响应状态码,如200,404等
    response.request.headers响应对应的请求头
    response.headers响应头
    response.request.cookies响应对应请求的cookie;返回cookieJar类型
    response.cookies响应的cookie(经过了set-cookie动作;返回cookieJar类型)
    response.text返回响应的内容,str类型
    response.content返回响应内容,bytes类型

    使用示例:

    1. # 想百度首页发送请求,获取该页面的源码
    2. import requests
    3. # 百度的网址
    4. url = "https://www.baidu.com/"
    5. # 发送请求
    6. response = requests.get(url)
    7. print("响应对象的类型:",type(response))
    8. print("响应对象的状态码:",response.status_code) # 200表示请求正常,服务器正常的返回数据
    9. print("响应内容的类型:",type(response.text))
    10. print("Cookies:",response.cookies)
    11. print("响应对应的请求头:",response.request.headers)
    12. print("响应头:",response.headers)
    13. print("响应对用请求的cookie:",response.request.prepare_cookies)
    14. print("响应内容:",response.text)
    15. print("响应的内容,bytes类型的:",response.content)

    显示结果:

    1. 响应对象的类型: <class 'requests.models.Response'>
    2. 响应对象的状态码: 200
    3. 响应内容的类型: <class 'str'>
    4. Cookies: <RequestsCookieJar[<Cookie BDORZ=27315 for .baidu.com/>]>
    5. 响应对应的请求头: {'User-Agent': 'python-requests/2.28.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'}
    6. 响应头: {'Cache-Control': 'private, no-cache, no-store, proxy-revalidate, no-transform', 'Connection': 'keep-alive', 'Content-Encoding': 'gzip', 'Content-Type': 'text/html', 'Date': 'Wed, 17 Aug 2022 02:05:07 GMT', 'Last-Modified': 'Mon, 23 Jan 2017 13:24:18 GMT', 'Pragma': 'no-cache', 'Server': 'bfe/1.0.8.18', 'Set-Cookie': 'BDORZ=27315; max-age=86400; domain=.baidu.com; path=/', 'Transfer-Encoding': 'chunked'}
    7. 响应对用请求的cookie: PreparedRequest.prepare_cookies of <PreparedRequest [GET]>>
    8. 响应内容: DOCTYPE html>
    9. ç¾åº¦ä¸ä¸ï¼ä½ å°±çé
    10. wrapper>
    11. lass=mnav>è´´å æå¤äº§å

  • è§å馠京ICPè¯030173å· 

  • 响应的内容,bytes类型的: b'\r\n \xe7\x99\xbe\xe5\xba\xa6\xe4\xb8\x80\xe4\xb8\x8b\xef\xbc\x8c\xe4\xbd\xa0\xe5\xb0\xb1\xe7\x9f\xa5\xe9\x81\x93
  • name=wd class=s_ipt value maxlength=255 autocomplete=off autofocus=autofocus>
    \xe6\x96\xb0\xe9\x97\xbb hao123 \xe5\x9c\xb0\xe5\x9b\xbe \xe8\xa7\x86\xe9\xa2\x91 \xe8\xb4\xb4\xe5\x90\xa7 \xe6\x9b\xb4\xe5\xa4\x9a\xe4\xba\xa7\xe5\x93\x81
    \r\n'
  • 从结果中发现response.text和response.content是有区别的:

    通过对response.content进行decode可以解决中文乱码的问题:

    1. response.conten.decode()
    2. response.conten.decode("GBK")

    常见的编码字符集有:

    使用示例:

    1. import requests
    2. # 目标网址
    3. url = "http://www.baidu.com/"
    4. # 发送请求获取响应
    5. response = requests.get(url)
    6. # 手动设置编码格式
    7. response.encoding = 'utf8'
    8. # 打印源码的str类型数据
    9. print(response.text)
    10. # response.content是存储的bytes类型的响应数据,进行decode操作
    11. print(response.content.decode('utf-8'))

    显示结果:

    1. html>
    2. <html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge><meta content=always name=referrer><link rel=stylesheet type=text/css href=http://s1.bdstatic.com/r/www/cache/bdorz/baidu.min.css><title>
    3. 度一下,你就知道title>head> <body link=#0000cc> <div id=wrapper> <div id=head> <div class=head_wrapper> <div class=s_form> <div class=s_form_wrapper> <div id=lg> <img hidefocus=true
    4. src=//www.baidu.com/img/bd_logo1.png width=270 height=129> div> <form id=form name=f action=//www.baidu.com/s class=fm> <input type=hidden name=bdorz_come value=1> <input type=hidden name=ie value=utf-8> <input type=hidden name=f value=8> <input type=hidden name=rsv_bp value=1> <input type=hidden name=rsv_idx value=1> <input type=hidden name=tn value=baidu><span class="bg s_ipt_wr"><input id=kw name=wd class=s_ipt value maxlength=255 autocomplete=off autofocus>span><span class="bg s_btn_wr"><input type=submit id=su value=百度一下 class="bg s_btn">span> form> div> div> <div id=u1> <a href=http://news.baidu.com name=tj_trnews class=mnav>新闻a> <a href=http://www.hao123.com name=tj_trhao123 class=mnav>hao123a> <a href=http://map.baidu.com name=tj_trmap class=mnav>地图a> <a href=http://v.baidu.com name=tj_trvideo class=mnav>视频a> <a href=http://tieba.baidu.com name=tj_trtieba class=mnav>贴吧a> <noscript> <a href=http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u=http%3A%2F%2Fwww.baidu.com%2f%3fbdorz_come%3d1 name=tj_login class=lb>登录a> noscript> <script>document.write('encodeURIComponent(window.location.href+ (window.location.search === "" ? "?" : "&")+ "bdorz_come=1")+ '" name="tj_login" class="lb">登录');script> <a href=//www.baidu.com/more/ name=tj_briicon class=bri style="display: block;">更多产品a> div> div> div> <div id=ftCon> <div id=ftConw> <p id=lh> <a href=http://home.baidu.com>关于百度a> <a href=http://ir.baidu.com>About Baidua> p> <p id=cp>©2017 Baidu <a href=http://www.baidu.com/duty/>使用百度前必读a>  <a href=http://jianyi.baidu.com/ class=cp-feedback>意见反馈a> 京ICP证030173号  <img src=//www.baidu.com/img/gs.gif> p> div> div> div> body> html>
    5. html>
    6. <html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge><meta content=always name=referrer><link rel=stylesheet type=text/css href=http://s1.bdstatic.com/r/www/cache/bdorz/baidu.min.css><title>
    7. 度一下,你就知道title>head> <body link=#0000cc> <div id=wrapper> <div id=head> <div class=head_wrapper> <div class=s_form> <div class=s_form_wrapper> <div id=lg> <img hidefocus=true
    8. src=//www.baidu.com/img/bd_logo1.png width=270 height=129> div> <form id=form name=f action=//www.baidu.com/s class=fm> <input type=hidden name=bdorz_come value=1> <input type=hidden name=ie value=utf-8> <input type=hidden name=f value=8> <input type=hidden name=rsv_bp value=1> <input type=hidden name=rsv_idx value=1> <input type=hidden name=tn value=baidu><span class="bg s_ipt_wr"><input id=kw name=wd class=s_ipt value maxlength=255 autocomplete=off autofocus>span><span class="bg s_btn_wr"><input type=submit id=su value=百度一下 class="bg s_btn">span> form> div> div> <div id=u1> <a href=http://news.baidu.com name=tj_trnews class=mnav>新闻a> <a href=http://www.hao123.com name=tj_trhao123 class=mnav>hao123a> <a href=http://map.baidu.com name=tj_trmap class=mnav>地图a> <a href=http://v.baidu.com name=tj_trvideo class=mnav>视频a> <a href=http://tieba.baidu.com name=tj_trtieba class=mnav>贴吧a> <noscript> <a href=http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u=http%3A%2F%2Fwww.baidu.com%2f%3fbdorz_come%3d1 name=tj_login class=lb>登录a> noscript> <script>document.write('encodeURIComponent(window.location.href+ (window.location.search === "" ? "?" : "&")+ "bdorz_come=1")+ '" name="tj_login" class="lb">登录');script> <a href=//www.baidu.com/more/ name=tj_briicon class=bri style="display: block;">更多产品a> div> div> div> <div id=ftCon> <div id=ftConw> <p id=lh> <a href=http://home.baidu.com>关于百度a> <a href=http://ir.baidu.com>About Baidua> p> <p id=cp>©2017 Baidu <a href=http://www.baidu.com/duty/>使用百度前必读a>  <a href=http://jianyi.baidu.com/ class=cp-feedback>意见反馈a> 京ICP证030173号  <img src=//www.baidu.com/img/gs.gif> p> div> div> div> body> html>

    三、 发送带有headers参数的请求

    1. 获取浏览器的请求头

    如下:

          

    2. 代码实现

    request.get(url,headers=headers)

    参数 headers 接收字典形式的请求头,请求头字段名作为key,字段对应的值作为value。

    1. import requests
    2. url = "https://www.baidu.com/"
    3. headers={"User-Agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.5112.81 Safari/537.36 Edg/104.0.1293.54"}
    4. response = requests.get(url,headers=headers)
    5. print(response.text)

     返回结果是整个网页的源码。

    四、 发送带参数的请求

    发送带参数的请求有两种方式:

    1. import requests
    2. # 目标网址
    3. url = "https://www.baidu.com/s?wd=python"
    4. headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36'}
    5. # 发送请求获取响应
    6. response = requests.get(url,headers=headers)
    7. print(response.text)
    1. import requests
    2. # 目标网址
    3. url = "https://www.baidu.com/s?"
    4. headers = {
    5. 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36'}
    6. # 请求参数是一个字典
    7. kw = {'wd': 'python'}
    8. # 发送请求的时候设置参数字典,获取响应
    9. response = requests.get(url, headers=headers, params=kw)
    10. print(response.text)

    五、 在header参数中携带cookie

    请求头中的cookie字段可以保持用户访问的状态,可以在headers参数中添加Cookie,模拟普通用户的请求。Cookie具有时效性,过一段时间需要更换。

    打开浏览器,右键→检查→点击刷新网页,找到Network →找到对用的网址→在Headers中往下翻找到Cookie并复制。具体步骤如下:

     

    在headers参数中添加cookie参数即可:

    1. headers = {
    2. 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36',
    3. 'Cookie' : '__yjs_duid=1_20dfee37243629e856d9bb0c602c24131644282456109; BIDUPSID=5CBA29E683390F8E0B0AE87972912C7F; PSTM=1581475728; BDUSS=dGQnllZlVhbjNOUXluNUE2Z0Q0WDdaVXdMcWIxWFRWT05yTGxHU3NWRjJyS0ZpSVFBQUFBJCQAAAAAAAAAAAEAAAB3MdSjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHYfemJ2H3pifj; BDUSS_BFESS=dGQnllZlVhbjNOUXluNUE2Z0Q0WDdaVXdMcWIxWFRWT05yTGxHU3NWRjJyS0ZpSVFBQUFBJCQAAAAAAAAAAAEAAAB3MdSjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHYfemJ2H3pifj; RT="z=1&dm=baidu.com&si=74n5u35umbe&ss=l6vrhxgg&sl=0&tt=0&bcn=https://fclog.baidu.com/log/weirwood?type=perf&ld=3rs&ul=7ajk&hd=7an4"; BD_HOME=1; BD_UPN=12314753; BA_HECTOR=81ak85a50h24202g8g2jved91hfoilq17; ZFY=CrZs7QlM4RJMuky9T8IPGPrhboyH2luKF1d4TXiUhl4:C; delPer=0; BD_CK_SAM=1; PSINO=7; BAIDUID=598A21E715B42B8916425739BF856315:SL=0:NR=10:FG=1; BAIDUID_BFESS=598A21E715B42B8916425739BF856315:SL=0:NR=10:FG=1; BDRCVFR[feWj1Vr5u3D]=I67x6TjHwwYf0; H_PS_PSSID=36547_36626_36982_36955_34812_36918_37000_37134_26350_37094_37022; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; B64_BOT=1; sug=3; sugstore=0; ORIGIN=2; bdime=0; H_PS_645EC=d5c4Yfsu/fl4iF8LGS6a9X/gya5Kd+e0MKHDVFcaGO4dHIsVL2D0jJT0D4g; baikeVisitId=cbe5d0ff-3459-41dc-96f8-3670da4b8257; COOKIE_SESSION=7_0_6_5_0_5_1_0_6_3_1044_2_0_0_0_0_0_0_1660704777|6#0_0_1660704777|1; Hm_lvt_aec699bb6442ba076c8981c6dc490771=1660705932; Hm_lpvt_aec699bb6442ba076c8981c6dc490771=1660705932'
    4. }

     六、使用超时参数timeout

    超时参数让请求在规定的时间内返回结果,否则就报错。超时参数可以在一定程度上提高项目的效率。

    使用时只需设置requests.get()函数的timeout参数即可,单位是秒。如下示例:

    1. # -*- coding:utf-8 -*-
    2. import requests
    3. url = "https://www.baidu.com/"
    4. header = {
    5. 'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.5112.81 Safari/537.36 Edg/104.0.1293.54'
    6. }
    7. try:
    8. response = requests.get(url,headers=header,timeout=0.05)
    9. print("超时10s")
    10. except:
    11. for i in range(4):
    12. response = requests.get(url=url,headers=header,timeout=20)
    13. if response.status_code == 200:
    14. break
    15. print("超时20s")
    16. html_str = response.text

     七、 proxies代理参数的使用

    为了让服务器以为不是同一个客户端在请求,为了防止频繁项一个域名发送请求被封ip,所以需要使用代理ip。

     proxies的形式是字典类型

    如下:

    1. proxies = {
    2. "http": "http://12.34.5679:9527",
    3. "https": "https://12.34.5679:9527",
    4. }

     使用时在requests.get()函数里设置参数proxies=proxies即可。

    如果proxies字典中包含有多个键值对,发送请求时将按照url地址的协议来选择使用相应的代理ip。

    八、 发送post请求

    requests模块发送post请求和发送get请求的参数完全一致。

    语法格式:

    response = requests.post(url,data)

    在代码中构造data字典

    1. import requests
    2. url = 'https://fanyi.baidu.com/'
    3. data={
    4. 'query': '树'
    5. }
    6. reponse = requests.post(url,data)
    7. print(reponse.text)

    返回完整的网页源码。

    全文参考:100天精通Python(爬虫篇)——第44天:requests库大总结_无 羡ღ的博客-CSDN博客_gv网址icon-default.png?t=M666https://blog.csdn.net/yuan2019035055/article/details/125469852

  • 相关阅读:
    轻量级开源ROS 的机器人设备(一)
    科研之路(2023.9.21)
    102.二叉树的层序遍历
    09-MySQL主从复制
    HarmonyOS简介
    CentOS 7 安装教程(基于虚拟机安装)
    基于 Hugging Face Datasets 和 Transformers 的图像相似性搜索
    网络编程及三大协议(TCP + UDP + Http)
    微信小程序如何刷新当前页面
    AIGC入门 - LLM 信息概览
  • 原文地址:https://blog.csdn.net/sinat_41752325/article/details/126385248