💖作者简介:大家好,我是车神哥,府学路18号的车神🥇
⚡About—>车神:从寝室到实验室最快3分钟,最慢3分半(那半分钟其实是等红绿灯)
📝个人主页:车手只需要车和手,压力来自论文_府学路18号车神_CSDN博客
🥇 官方认证:人工智能领域优质创作者
🎉点赞➕评论➕收藏 == 养成习惯(一键三连)😋⚡希望大家多多支持🤗~一起加油 😁
专栏
《Python爬虫》
Requests功能
- 前言
- 使用GET和POST请求
- GET请求
- POST请求
- 通过URL来传递参数
- 设置超时
- 查看返回内容
- 设置请求头
- 复杂的Post请求
Requests
的主要功能及用途是用作发送网络请求,根据对方服务器的要求不同,可使用GET
、POST
和PUT
等方式进行请求。并且可以对请求头进行伪装
、使用代理访问
等。安装完成后,先从一些简单的例子开始了解Requests
的使用方法。
GET请求在HTTP中常见发生网络请求的方式有两种,GET和POST。GET是从指定的资源请求数据,POST是向指定的资源提交要被处理的数据。
- 使用Requests发送GET请求将百度搜索的页面源数据爬取出来。(下面尝试一下)
>>> import requests # 引入库
>>> r = requests.get('https://www.baidu.com') # 向百度网页发送请求并返回一个对象
>>> r # 输出
<Response [200]>
从上可知获得了一个名为
r
的response对象
。访问成功后,所以的网页信息都会储存在这个r
中。如果看不见这个对象,那么需要把这个对象提出来以字符串的格式进行显示。
>>> r.text
打印的结果:
'\r\n ç\x99¾åº¦ä¸\x80ä¸\x8bï¼\x8cä½\xa0å°±ç\x9f¥é\x81\x93 æ\x96°é\x97» hao123 å\x9c°å\x9b¾ è§\x86é¢\x91 è´´å\x90§ æ\x9b´å¤\x9a产å\x93\x81 å\x85³äº\x8eç\x99¾åº¦ About Baidu
©2017 Baidu 使ç\x94¨ç\x99¾åº¦å\x89\x8då¿\x85读 æ\x84\x8fè§\x81å\x8f\x8dé¦\x88 京ICPè¯\x81030173å\x8f·
\r\n'
POST请求以上打印的内容即为
HTML
源码,因为百度搜索的页面元素不多,所以较短。
- 利用
post
的方法向httpbin.org
网站发送一个请求,并且拉取返回数据。
>>> import requests
>>> r = requests.post('http://httpbin.org/post', data={'key':'value'})
>>> r = r.text
>>> r
'{\n "args": {}, \n "data": "", \n "files": {}, \n "form": {\n "key": "value"\n }, \n "headers": {\n "Accept": "*/*", \n "Accept-Encoding": "gzip, deflate", \n "Content-Length": "9", \n "Content-Type": "application/x-www-form-urlencoded", \n "Host": "httpbin.org", \n "User-Agent": "python-requests/2.27.1", \n "X-Amzn-Trace-Id": "Root=1-62559e95-0787c2835350a9d4752336b5"\n }, \n "json": null, \n "origin": "125.33.161.73", \n "url": "http://httpbin.org/post"\n}\n'
从上面返回的数据来看,是一大堆json
数据。
通过URL来传递参数由于常用的也就是这里介绍Get和POST这两种请求方式,当然还有其他的,如PUT DELECT,还有OPTIONS。
需要知道的是URL不仅是一个网址,平时在访问网站的时候,会经常后面带很长一串的字符串🚢,这些个字符串就是所谓的请求参数。
如果分析URL的话,我们可以发现这里面会有很多类似key/value的键和值。Requests允许通过字典或者字符串来传参。
例如:
>>> payload = {"key1":"value1", "key2":"value2", "key3":"value3"}
>>> r = requests.get('http://httpbin.org/get', params=payload)
>>> r
<Response [200]>
>>> r.url
'http://httpbin.org/get?key1=value1&key2=value2&key3=value3'
这样就把参数传入来URL中。
当然,在面对较多的参数,比如有列表,同样也可以传入到其中。
>>> payload = {"key1":"value1", "key2":"value2", "key3":["value3","value4","value5"]}
>>> r = requests.get('http://httpbin.org/get', params=payload)
>>> r.url
'http://httpbin.org/get?key1=value1&key2=value2&key3=value3&key3=value4&key3=value5'
设置超时
在请求的时候设置超时等待时间,可避免等待太久。
在请求的时候给参数timeout附上一个数字,单位为秒。
如果请求超过此时,则会断开报错。
>>> requests.get('http://github.com', timeout=0.001)
Traceback (most recent call last):
File "/Users/yurbro./Desktop/pythonVirtualenv/venv/lib/python3.7/site-packages/urllib3/connection.py", line 175, in _new_conn
(self._dns_host, self.port), self.timeout, **extra_kw
File "/Users/yurbro./Desktop/pythonVirtualenv/venv/lib/python3.7/site-packages/urllib3/util/connection.py", line 95, in create_connection
raise err
File "/Users/yurbro./Desktop/pythonVirtualenv/venv/lib/python3.7/site-packages/urllib3/util/connection.py", line 85, in create_connection
sock.connect(sa)
socket.timeout: timed out
查看返回内容
将返回的reponse
对象打印出来,在查看其中的内容。
>>> import requests
>>> r = requests.get('http://api.github.com/events')
r>>> r.text
'[{"id":"21272029711","type":"PullRequestEvent","actor":{"id":49699333,"login":"dependabot[bot]","display_login":"dependabot","gravatar_id":"","url":"https://api.github.com/users/dependabot[bot]","avatar_url":"https://avatars.githubusercontent.com/u/49699333?"},"repo":{"id":205361298,"name":"evemonk/evemonk-sidekiq","url":"https://api.github.com/repos/evemonk/evemonk-sidekiq"},"payload":{"action":"opened","number":560,"pull_request":{"url":"https://api.github.com/repos/evemonk/evemonk-sidekiq/pulls/560","id":909043666,"node_id":"PR_kwDODD2Qks42LufS",
返回的内容很大一串,就不附上了。
当我们发起一个请求的时候,Requests
会根据HTTP
的headers
进行编码。
>>> r.encoding
'utf-8'
当然,如果不满意源编码方式的话,可以自己修改哦~不过不太推荐
>>> r.encoding = 'ISO-8859-1'
>>> r.encoding
'ISO-8859-1'
从上面返回的值可以看出,已经修改好了编码方式。
设置请求头HTTP消息头,以明文的字符串格式传送,是以冒号分隔的键/值对。如:Accept-Charset:utf-8.
HTTP消息头——指的是客户端或服务器响应的时候传递的头部信息,内容包含了浏览器信息、请求数据类型等。发送请求的时候消息头称为请求头,服务器返回内容时的消息头称为响应头。
若发现请求不到数据,而又没加请求头,在确认请求正确之前,多半是爬虫的身份被发现了。
由此,作为一个爬虫,必须让自己看起来不像是爬虫(需要伪装)。设置请求头,可以让爬虫的爬取过程看起来是一个用户在使用浏览器浏览网页一样。
>>> url = 'https://www.example.com'
>>> header = {'user-agent':'Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; Fr) Presto/2.9.168 Version/11.52'}
>>> r = requests.get(url, header)
>>> r
<Response [200]>
>>> r.text
'\n\n\n Example Domain \n\n \n \n \n \n\n\n\n\n Example Domain\n This domain is for use in illustrative examples in documents. You may use this\n domain in literature without prior coordination or asking for permission.
\n More information...
\n\n\n\n'
复杂的Post请求
今天先学到这,乏了。还有项目、课题、零碎片化的时间学习新知识,哎~每天无情被卷(2022.4.17 23:13)
❤坚持读Paper,坚持做笔记,坚持学习,坚持刷力扣LeetCode❤!!!
坚持刷题!!!
⚡To Be No.1⚡⚡哈哈哈哈
⚡创作不易⚡,过路能❤关注、收藏、点个赞❤三连就最好不过了
ღ( ´・ᴗ・` )
❤
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)