学习爬虫最先尝试的是requests模块,requests拥有简便的API,它是最基本的HTTP请求模块,可以用来模拟发送请求。就像在浏览器里输入网址然后回车一样。
一、安装requests库
step1:Windows+ R打开cmd
step2:使用pip快速安装request,输入下面的命令
pip install requests
二、发送请求
语法:requests.get(url, params=None, **kwargs)
- url:拟获取页面的url链接
- url:url中的额外参数,字典或字节流格式,可选
- url:12个控制访问的参数
request库中的定义:get()方法调用了request函数,传入’get’参数
def get(url, params=None, **kwargs):
r"""Sends a GET request.
:param url: URL for the new :class:`Request` object.
:param params: (optional) Dictionary, list of tuples or bytes to send
in the query string for the :class:`Request`.
:param \*\*kwargs: Optional arguments that ``request`` takes.
:return: :class:`Response <Response>` object
:rtype: requests.Response
"""
kwargs.setdefault('allow_redirects', True)
return request('get', url, params=params, **kwargs)
二、response对象
response对象属性
属性 | 说明 |
---|---|
r.status_code | HTTP请求返回的状态,200表示连接成功,404表示失败 |
r.text | HTTP响应内容的字符串,即url页面的内容 |
r.content | HTTP响应内容的二进制形式 |
r.encording | 从HTTP header中猜测的内容编码方式 |
r.apparent_encoding | 根据内容分析处的响应内容的拜尼马方式(备选编码方式) |
例子:使用get函数,返回一个response对象
import requests
url = "https://www.baidu.com"
r = requests.get(url)
print(r.status_code)
print(type(r))
print(r.headers)
输出结果:
200
<class 'requests.models.Response'>
{'Cache-Control': 'private, no-cache, no-store, proxy-revalidate, no-transform', 'Connection': 'Keep-Alive', 'Content-Encoding': 'gzip', 'Content-Type': 'text/html', 'Date': 'Thu, 15 Aug 2019 02:04:52 GMT', 'Last-Modified': 'Mon, 23 Jan 2017 13:23:55 GMT', 'Pragma': 'no-cache', 'Server': 'bfe/1.0.8.18', 'Set-Cookie': 'BDORZ=27315; max-age=86400; domain=.baidu.com; path=/', 'Transfer-Encoding': 'chunked'}
***Repl Closed***
response的编码
属性 | 说明 |
---|---|
r.encording | 从HTTP header中猜测的内容编码方式 |
r.apparent_encoding | 根据内容分析处的响应内容的拜尼马方式(备选编码方式) |
r.encoding:如果HTML代码header中不存再对charset的说明,则默认编码为ISO-8859-1
r.apparent_encoding:根据页面内容分析处的编码方式(一般来说以它为准)
举个栗子
step1:初始代码
import requests
url = "http://www.baidu.com"
r = requests.get(url)
print(r.encoding)
print("content:", r.text)
step2:此时输出内容出现了乱码:
ISO-8859-1
content: <!DOCTYPE html>
<!--STATUS OK--><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>ç™¾åº¦ä¸€ä¸‹ï¼Œä½ å°±çŸ¥é“</title></head>
***Repl Closed***
step3:接着,我们使用r.apparent_encoding来解码:
import requests
url = "http://www.baidu.com"
r = requests.get(url)
print(r.apparent_encoding)
r.encoding = r.apparent_encoding
print("content:", r.text)
step4:此时,就不出现乱码啦
utf-8
content: <!DOCTYPE html>
<!--STATUS OK--><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>百度一下,你就知道</title></head>
提示:UTF-8是一种多字节编码,可以表示任何Unicode字符。ISO 8859-1是一个单字节编码,可以代表前256个Unicode字符。两者都以完全相同的方式编码ASCII
三、request库的异常
常见异常分类
异常 | 说明 |
---|---|
requests.ConnectionError | 网络连接错误异常,如DNS擦寻IP失败,服务器拒绝连接等 |
requests.HTTPError | HTTP错误异常 |
requests.URLRequired | URL缺失异常 |
requests.TooManyRedirests | 超过最大重定向次数,产生重定向异常 |
requests.ConnectTimeout | 连接远程服务器超时异常 |
requests.Timeout | 请求URL超时,产生超时异常 |
四、爬取网页的通用代码框架
使用try异常处理机制:
import requests
def getHTMLText(url):
try:
r = requests.get(url, timeout=20)
r.raise_for_status() # 若状态码不是200,引发HTTPError异常
r.encoding = r.apparent_encoding
return r.text
except:
return "Error"
url = "http://www.baidu.com"
text = getHTMLText(url)
print(text)
这里使用了 r.raise_for-status()函数
,如果状态码 r.status_code
不是200,则会引发异常处理。
五、requests库方法的参数
requests.request(methode, url, kwargs)
1st :params
import requests
kv = {"key1": "value1", "key2": "value2"}
r = requests.request("GET", "http://www.baidu.com", params = kv)
print(r.url)
输出:
http://www.baidu.com/?key1=value1&key2=value2
2nd :data字典/字节序列
import requests
kv = {"key1": "value1", "key2": "value2"}
r = requests.request("POST", "http://www.baidu.com", data = kv)
3rd :JSON格式数据
import requests
kv = {"key1": "value1", "key2": "value2"}
r = requests.request("POST", "http://www.baidu.com", json = kv)
4st :headers字典,HTTP定制头
可以应用于伪装成为浏览器
import requests
hd = {"user-agent": "Chrome/10"}
r = requests.request("POST", "http://www.baidu.com", headers = hd)
5st :timeout,设定超时时间,秒为单位
r = requests.request("GET", "http://www.baidu.com", timeout = 10)
6st :proxies,字典类型,设定访问代理服务器
可以隐藏原IP地址信息,防止被逆追踪
import requests
pxs = {"http": "http://user:pass@10.10.10.1:1234",
"https": "http://user:pass@10.10.10.1:4321"}
r = requests.request("GET", "http://www.baidu.com", proxies = pxs)
print(r.text)
六、requests库的其他方法
主要的7个方法
requests.request() # 构造一个请求,止程剩下的方法
r = requests.post('http://httpbin.org/post', data = {'key':'value'})
r = requests.put('http://httpbin.org/put', data = {'key':'value'})
r = requests.delete('http://httpbin.org/delete')
r = requests.head('http://httpbin.org/get')
r = requests.patch('http://httpbin.org/get')
r = requests.options('http://httpbin.org/get')
requests.request(method, url, kwargs)
- method:请求方式,对应get/put/post等7中方式,如:requests.request(‘POST’, url, **kwargs)
- url:拟获取页面的url连接
- **kwargs:控制访问的13个参数
head()方法:我们可以根据头部信息来划分网页层次,分不同部分爬取信息
import requests
url = "http://www.baidu.com"
r = requests.get(url)
r.encoding = r.apparent_encoding
print(r.headers)
{'Cache-Control': 'private, no-cache, no-store, proxy-revalidate, no-transform', 'Connection': 'Keep-Alive', 'Content-Encoding': 'gzip', 'Content-Type': 'text/html', 'Date': 'Thu, 15 Aug 2019 02:59:08 GMT', 'Last-Modified': 'Mon, 23 Jan 2017 13:27:36 GMT', 'Pragma': 'no-cache', 'Server': 'bfe/1.0.8.18', 'Set-Cookie': 'BDORZ=27315; max-age=86400; domain=.baidu.com; path=/', 'Transfer-Encoding': 'chunked'}
***Repl Closed***
put()方法
import requests
url = "http://www.baidu.com"
payload = {"key1": "value1", "key2": "value2"}
r = requests.put(url, data = payload)
r.encoding = r.apparent_encoding
print(r.text)
七、响应状态码
通过下面的代码,可以检测响应状态码:
import requests
url = "http://www.baidu.com"
r = requests.get(url)
print(r.status_code)
print(r.status_code == requests.codes.ok)
此时输出:
200
True
有时候,我们会发送一个错误的请求(一个4XX客户端错误或5XX服务器错误响应),可以通过Response.raise_for_status()
来抛出异常:
bad_r = requests.get('http://httpbin.org/status/404')
print(bad_r.status_code)
bad_r.raise_for_status()
此时输出如下:
404
Traceback (most recent call last):
xxxxxxx
requests.exceptions.HTTPError: 404 Client Error: NOT FOUND for url: http://httpbin.org/status/404
八、保存响应内容
我们可以使用文件操作,将响应内容保存到文件中:
如果要将这个网站上的内容保存到本地 http://www.gutenberg.org/cache/epub/1112/pg1112.txt
import requests
res = requests.get('http://www.gutenberg.org/cache/epub/1112/pg1112.txt')
file_name = 'RomeoAndJuliet.txt'
with open(file_name, 'wb') as file_obj:
for chunk in res.iter_content(100000):
file_obj.write(chunk)
注意:必须要用'wb'
模式打开文件
第二篇python爬虫学习笔记完结啦 cheers ??