• 21天学习挑战赛——Python爬虫 requests库



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

    1.requests模块概述

            本文主要介绍requests的http模块,该模块主要用于发送请求获取响应,该模块有很多的替代模块,比如urlib模块,但是工作中用的最多的还是requests模块,requests模块的代码简洁、易懂,相对于臃肿的urlib模块,使用requests编写的爬虫代码数量会更少,而且实现某一功能会简单。

    2.requests常用属性或方法

    requests常用属性或方法
    方法/属性说明
    response = requests.get(url)发送请求获取的响应对象(最常用)
    response = requests.post(url)发送请求获取的响应对象
    response.url响应的url,有时候响应的url和请求的url不一致
    response.satus_code响应状态码,如:200、404
    response.request.headers响应对应的请求头
    response.headers响应头
    response.request.cookies响应对应请求的的cookie,返回cookieJar类型
    response.cookies响应的cookie(警告了set-cookie动作,返回cookieJar类型)
    response.json()自动将json字符串类型的响应内容转换为Python对象(dic或list)
    response.text()返回响应的内容,str类型
    response.content返回响应的内容,bytes类型

    2.1 应用举例

    1. import requests
    2. #目标网址
    3. url = 'https://www.baidu.com/'
    4. #发送请求获取响应
    5. reponse = requests.get(url) #输出:
    6. #查看响应对象的类型
    7. print(type(reponse)) #输出:200
    8. #查看响应状态码
    9. print(reponse.status_code) #输出:
    10. #查看相应的内容的类型
    11. print(type(reponse.text)) #输出:]>
    12. #查看cookies
    13. print(reponse.cookies) #输出:
    14. #查看响应的内容
    15. print(reponse.text)
    16. #输出: ç¾åº¦ä¸ä¸ï¼ä½ å°±ç¥é

      å³äºç¾åº¦ About Baidu

      ©2017 Baidu ä½¿ç¨ç¾åº¦åå¿è¯»  æè§å馠京ICPè¯030173å· 

    ​2.2 response.text和response.content的区别

    response.text

    • 类型:str
    • 解码类型:requests模块自动根据http头部对响应的编码作出有根据的推测,推测的文本编码

    response.content

    • 类型:bytes
    • 解码类型:没有指定,执行挑选

    通过对response.content进行decode,来解决中文源码:

    • response.content.decode() :默认utf-8
    • response.content.decode('GBK')

    常见的编码字符如下:

    • uft-8
    • gbk
    • gb2312
    • asci(读音:阿斯克码)
    • iso-8859-1

    应用举例: 

    1. import requests
    2. #目标网址
    3. url = 'https://www.baidu.com/'
    4. #发送请求获取响应
    5. reponse = requests.get(url) #输出:
    6. #手动设置编码格式
    7. reponse.encoding = 'utf-8'
    8. #打印源代码的str类型
    9. print(reponse.text)
    10. #输出:
    11. #
    12. # 百度一下,你就知道

      关于百度 About Baidu

      ©2017 Baidu 使用百度前必读  意见反馈 京ICP证030173号 

    13. #response.content是存储的bytes类型的响应数据,进行decode操作
    14. print(reponse.content.decode('utf-8'))
    15. #输出:
    16. #
    17. # 百度一下,你就知道

      关于百度 About Baidu

      ©2017 Baidu 使用百度前必读  意见反馈 京ICP证030173号 

    2.3 发送带Headers参数请求

    函数格式:requests.get(url, headers=headers)

    参数说明:

    • url为请求网址
    • headers参数接收字典形式的请求头,请求头字段名为key,字段对应的值为value

    获取请求头:

     用法举例:

    1. import requests
    2. #目标网址
    3. url = 'https://blog.csdn.net/m0_52162042?spm=1000.2115.3001.5343'
    4. #构建请求头,最重要的是user-Agent
    5. #如果需要其他请求,就在headers字典中加上
    6. headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36'}
    7. #发送请求获取响应
    8. response = requests.get(url,headers=headers)
    9. print(response.text)
    10. #输出:整个网页源码

    2.3.1 headers参数中携带cookies

            网站经常利用请求头中的cookies字段来做用户访问状态的保持,那么我们可以在headers参数中添加cookies,模拟普通用户的请求。cookies具有时效性,过一段时间需要更换,而且里面包含了个人信息,切勿外传。

     在headers字典中添加Cookie参数:

    1. headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36',
    2. 'Cookie': 'SUID=B16809706B20A00A000000005FAA56A2; SUV=007F3EDD700968B15FAA56A244092528; _y_1001=%E8%B4%AD%E7%89%A9%E5%BC%82%E5%BD%A2sogo_1110_2; _AD_1001=361604998826800; ssuid=9596610466; _m_1265=5235865654890; _AD_1265=5235865654893; ad_recall=%7B%2241861%22%3A1636013904683%7D; IPLOC=CN3715; Hm_lvt_13bcdac6f533873f736729fd894098ad=1660281832; Hm_lvt_eaa57ca47dacb4ad4f5a257001a3457c=1660281836; __mtmc=201094952; LSTMV=352%2C320; LCLKINT=2029; cd=1660375612&15b92f317554f79f73dcf21c955e624a; ld=NZllllllll2AdWyBYsNv5paTU0IAdCwDtjbw6lllllGllllxRylll5@@@@@@@@@@; Hm_lvt_d7c7037093938390bc160fc28becc542=1660441495; Hm_lpvt_d7c7037093938390bc160fc28becc542=1660441495; SNUID=217A94C1B2B457F72C68FB29B2ED69EB; GOTO=Af21997; __mtma=201094952.995483057.1604998820.1660561575.1660564900.82; __mtmz=201094952.1660564900.82.79.mtmcsr=801100.anaih.com|mtmccn=(referral)|mtmcmd=referral|mtmcct=/; sduv=1660281830585_4535_00007; CKOR=2664_00007_00001; CKOD=2124_00002_00000; __mtmb=201094952.2.100.1660564900'
    3. }

    2.4 超时参数timeout

            在平时上网时,我们经常会遇到网络波动,这时候,一个请求等了很久可能仍然没有响应。在爬虫中,一个请求很久没有结果,就会让整个项目效率变得非常低,所以这个时候我们就需要对请求进行强制性要求,让它在特定的时间内返回结果,否则就会报错。

    函数语法:response = requests.get(url, timeout=3)

    参数说明:

    timeout=3 表示:发送请求后,3秒内返回响应,否则久抛出异常

     用法举例:

    1. import requests
    2. #目标网址
    3. url = 'https://blog.csdn.net/m0_52162042?spm=1000.2115.3001.5343'
    4. #构建请求头,最重要的是user-Agent
    5. #如果需要其他请求,就在headers字典中加上
    6. headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36'
    7. }
    8. try:
    9. #发送请求获取响应,超时设置为10s
    10. response = requests.get(url,headers=headers,timeout=10)
    11. except:
    12. for i in range(4): #循环请求网站
    13. response = requests.get(url,headers=headers,timeout=20)
    14. if response.status_code==200:
    15. break
    16. html_str = response.text

    2.5 proxies代理参数

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

    函数语法:response = requests.get(url, proxies=proxies)

    参数说明:

    proxies的形式为字典

    举例说明:

    1. proxies = {
    2. 'http':'http://12.34.5678:9527',
    3. 'https':'https://12.34.5678:9527',
    4. }

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

    2.6 发送post请求

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

    语法格式:response = requests.post(url, data)

    应用举例:

            以百度翻译为例,找到对应的请求,点击Payload,展开Form Data表单。

    1. import requests
    2. #目标网址
    3. url = 'https://fanyi.baidu.com/#en/zh/love'
    4. data = {
    5. 'query': 'love'
    6. }
    7. response = requests.post(url,data=data)
    8. print(response.text) #输出:整个网页源码

  • 相关阅读:
    Java后端开发常用规范
    CSP测试中完善程序题目的解题经验与运用
    作为一名测试工程师,每天日常工作是什么样的?
    pdf转图片,pdf转图片在线转
    Springboot 整合 Spring Data Solr的基本流程
    通过 DevOps、CI/CD 和容器增强您的软件开发之旅...
    作业 练习题
    eNSP模拟器!通过Cloud云使本机与模拟器互通,成功通过ssh登陆设备!
    Android Jetpack Compose之UI的重组和自动刷新
    React 像 vue 一样配置页面路由,并支持重定向路由,路由守卫等(使用 useRoutes 完成)...
  • 原文地址:https://blog.csdn.net/m0_52162042/article/details/126343582