理解了爬虫和网络申请,上面就能够开始正式的理解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('请输出要搜寻的内容:\n') 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())
输入后果如下图