文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

自动评论何须学完爬虫,只需要掌握Requests库即可

2024-12-03 00:44

关注
  1. pip install requests 

首先,我们先来看看requests库可以进行哪些操作:

发送HTTP请求2.上传文件3.处理Cookie4.支持Session会话5.使用代理6.身份验证7.打包请求8.SSL证书验证

下面,我们来一一介绍这些操作具体是如何实现的。

发送HTTP请求

与urllib与urllib3一样,HTTP请求常用的是GET请求与POST请求。

GET请求

其中,GET请求使用的方式是requests.get()。它可以设置参数params,也可以设置超时timeout,同时也可以设置请求头headers。

示例如下:

  1. import requests 
  2.  
  3. url = "https://www.csdn.net/" 
  4. headers = { 
  5.     'user-agent''Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36' 
  6. result = requests.get(url=url, timeout=1, headers=headers) 
  7. #打印网页源代码 
  8. print(result.text) 
  9. #打印响应状态码 
  10. print(result.status_code) 
  11. #打印Cookie 
  12. print(result.cookies) 
  13. #打印result类型 
  14. print(type(result)) 

运行之后,输出如下:


POST请求

接着,我们来介绍POST请求。这里,我们同样使用测试网站http://httpbin.org/post,向它发送一些数据。示例如下:

  1. import requests 
  2.  
  3. url = "http://httpbin.org/post" 
  4.  
  5. data = { 
  6.  
  7. "name""liyuanjing"
  8.  
  9. "age""29" 
  10.  
  11.  
  12. headers = { 
  13.  
  14. 'user-agent''Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36' 
  15.  
  16.  
  17. result = requests.post(url=url, timeout=1, headers=headers, data=data) 
  18.  
  19. # 打印网页源代码 
  20.  
  21. print(result.text) 
  22.  
  23. # 将其转换为json 
  24.  
  25. print(result.json()) 

运行之后,效果如下:


抓取二进制图片

对于文本文件的获取,我们很简单地通过text进行处理分析。但是假如我们是获取的一张图片显然text是无法还原真实内容。

不仅如此,图片的text是乱码。所以,我们需要将获取到的图片二进制数据通过相应的API保存为文件。示例代码如下:

  1. import requests 
  2.  
  3. url = "https://www.528045.com/file/upload/202412/01/2gsgezuqojf.jpg" 
  4. headers = { 
  5.     'user-agent''Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36' 
  6. result = requests.get(url=url, timeout=1, headers=headers) 
  7. with open('requests.png''wb'as f: 
  8.     f.write(result.content) 

运行之后,就会在程序目录的统计目录下生成一张图片,当然图片链接读者可以自己去找。这里的链接暂时有效。

需要注意的是,response.text是Unicode编码,而response.content是原始二进制字节流,这一点要额外注意,如果网页出现乱码,可以使用response.encoding=”gbk”进行设置解析。

上传文件

与讲解urllib3一样,我们这里上传文件的服务器端口,由flask编写。我们先来看看服务器端的代码:

  1. import flask 
  2. import os 
  3.  
  4. UPLOAD_FILE = 'uploads' 
  5. app = flask.Flask(__name__) 
  6. @app.route('/', methods=['POST']) 
  7. def upload_file(): 
  8.     file = flask.request.files['file'
  9.     if file: 
  10.         file.save(os.path.join(UPLOAD_FILE, os.path.basename(file.filename))) 
  11.         return '文件上传成功' 
  12.     else
  13.         return '文件上传失败' 
  14.  
  15. if __name__ == '__main__'
  16.     app.run() 

运行此段代码,默认会一直运行等待下去。

而使用requests进行文件的上传,也非常的简单,因为文件上传是Post请求,我们只需要设置file参数。示例如下:

  1. import requests 
  2.  
  3. url = "http://127.0.0.1:5000" 
  4. headers = { 
  5.     'user-agent''Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36' 
  6. files = { 
  7.     "file"open('123.png''rb'
  8. result = requests.post(url=url, files=files) 
  9. print(result.text) 

运行之后,会在项目文件uploads文件夹下多一个123.png图片,当然123上传时的文件必须存在。同时也要事先创建uploads文件夹。

处理Cookie

一般来说,爬虫分为2个部分:首先是登录,然后才是爬取。而在登录时,我们一般使用selenium,进行cookie的返回。

接着使用requests进行爬取网页的源代码,因为selenium是一个专门的库,后面我们会介绍,这里我们先假设我们获取到了cookie。

直接将Cookie设置到请求头

为了更有意思,我们在chrome按F12之后,用浏览器评论一个CSDN帖子,会捕捉到如下图所示的请求数据:


这里,我们可以复制cookie数据到我们的headers之中。

同时下面有一个提交表单,其中,content是我们评论CSDN的内容,articleId是我们评论CSDN的帖子,读者可以自己看看CSDN帖子是否有一串数字。

通过请求头,评论CSDN

那么,我们可以仿照这个请求连接,通过requests完成CSDN的评论操作,示例代码如下所示:

  1. import requests 
  2.  
  3. url = "https://blog.csdn.net/phoenix/web/v1/comment/submit" 
  4. headers = { 
  5.     'user-agent''Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
  6.     'cookie''CSDN登录后返回的cookie'
  7. data = { 
  8.     "commentId"""
  9.     "content""最近正在学习刚好能用上"
  10.     "articleId""118750834"
  11. result = requests.post(url=url, data=data, headers=headers) 
  12. print(result.status_code) 

运行之后,控制台会输出200,同时评论帖子下面会多出一条评论数据,如下图所示:


RequestsCookieJar()

除了通过请求头设置Cookie进行访问之外,其实我们的post()方法还有一个专门的cookies参数,它用于接收RequestsCookieJar对象。

示例如下:

  1. import requests 
  2.  
  3. url = "https://blog.csdn.net/phoenix/web/v1/comment/submit" 
  4. headers = { 
  5.     'user-agent''Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
  6. cookieStr = 'CSDN登录后返回的cookie' 
  7. data = { 
  8.     "commentId"""
  9.     "content""最近正在学习刚好能用上"
  10.     "articleId""118517922"
  11.  
  12. jar = requests.cookies.RequestsCookieJar() 
  13. for cookie in cookieStr.split(";"): 
  14.     key, value = cookie.split('=', 1) 
  15.     jar.set(key, value) 
  16. result = requests.post(url=url, data=data, headers=headers, cookies=jar) 
  17. print(result.status_code) 

这段代码与前文运行效果一样,这里不再输出运行结果,仅仅只是cookie使用方式的不同形式。

Session会话

cookie数据保存在客户端,session数据保存在服务器端,一个Session代表一个特定的客户端。那么如何在特定的客户端与服务器端的Session对象之间建立联系呢?

通常就是不断在客户端与服务器端之间来回传递一个ID,通过这个ID,客户端就能在服务器端找到对应的Session对象。

在实际的爬虫项目中,有时候需要使用同一个客户端来多次抓取页面,就可以用到Session。示例代码如下:

  1. result = requests.post(url=url, data=data, headers=headers, cookies=jar) 
  2. session = requests.Session() 
  3. r2 = session.post(url=url, data=data, headers=headers, cookies=jar) 
  4. print(r2.status_code) 

这里,我们将上面的Cookie代码改一改即可。

使用代理

对于requests库来说,使用代理非常简单,因为get与post函数都有一个proxies参数,用于设置代理即可。示例如下:

  1. import requests 
  2.  
  3. url = "https://www.csdn.net/" 
  4. headers = { 
  5.     'user-agent''Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
  6. proxies = { 
  7.     'http''http://183.47.138.80:8888'
  8.     'http''http://125.78.226.217:8888' 
  9. result = requests.post(url=url, proxies=proxies) 

需要注意的是,这里的代理IP博主测试的时候是有效的,但读者可能读到的时候已经失效,读者可以自己去网络搜寻免费的代理测试。

除了基本的HTTP代理,Request还支持SOCKS协议的代理。这是一个可选的功能,若要使用,需要使用下面的命令安装第三方库。

  1. pip install requests[socks] 

安装完成之后,替换proxies即可。

  1. proxies = { 
  2.     'http''socks5://user:pass@host:port'
  3.     'https''socks5://user:pass@host:port' 

身份验证

requests库还提供了身份验证功能,其中,get与post方法有一个auth参数专门用于身份验证,传入的参数是HTTPBasicAuth,示例代码如下:

  1. import requests 
  2. from requests.auth import HTTPBasicAuth 
  3.  
  4. url = "https://www.csdn.net/" 
  5. headers = { 
  6.     'user-agent''Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
  7.  
  8. result = requests.post(url=url, auth=HTTPBasicAuth('name''password')) 
  9. print(result.status_code) 

这里,只是给读者展示如何通过代码进行身份验证,如果你自己编写服务器,可以通过如上代码进行操作,这里就不编写了。

打包请求

不管是上面的get请求还是post请求,我们都是通过requests.get或者requests.post进行操作的,但其实我们可以将请求参数单独列出来打包。

也就是,俗称的封装。示例代码如下所示:

  1. import requests 
  2.  
  3. url = "https://www.csdn.net/" 
  4. headers = { 
  5.     'user-agent''Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
  6.  
  7. req = requests.Request('get', url=url, headers=headers) 
  8. session = requests.Session() 
  9. prepared = session.prepare_request(req) 
  10. result = session.send(prepared) 
  11. print(result.text) 

这里,通过Request进行封装请求数据,然后调用Session的prepare_request方法处理Request对象,并返回一个requests.models.Response对象。

最后,通过Session.send方法发送Response对象。

SLL证书验证

在requests请求中,有一个verify的参数。访问HTTPS时,如果需要验证SSL证书,可以不设置该数据,它默认为True表示验证证书。

如果不需要验证证书,可以设置verify等于False,那么就不会进行验证。验证的代码很简单,就是什么也不用做即可,代码如下:

  1. import requests 
  2.  
  3. try: 
  4.     url = "https://www.csdn.net/" 
  5.     result = requests.get(url) 
  6.     print(result.status_code) 
  7. except requests.exceptions.SSLError as e: 
  8.     print(e.args[0]) 

如果你的网站没有SLL证书,或者证书未经过权威机构认证,则会抛出SSLError异常。

如果你的网站有SLL证书,且经过了权威的认证,那么就不会抛出异常。

而如果你不想验证证书的话,可以将代码修改为如下代码:

  1. import requests 
  2.  
  3. try: 
  4.     urllib3.disable_warnings() 
  5.     url = "https://www.csdn.net/" 
  6.     result = requests.get(url, verify=False
  7.     print(result.status_code) 
  8. except requests.exceptions.SSLError as e: 
  9.     print(e.args[0]) 

不过,它会报InsecureRequestWarning警告信息,如果需要禁止输出警告信息,可以使用urllib3.disable_warnings()进行屏蔽。

 

来源:今日头条内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯