Python网络爬虫
requests库
自动爬取HTML页面,自动网络请求提交
1 2 3 4 5 6 7 8 9
   | requests库的安装小测:
 
  import requests
  r = requests.get("https://baidu.com") print("r的类型为:\n", type(r)) print("状态码为:\n", r.status_code) print("html内容为:\n", r.text)
   | 
 
requests库的7个主要方法
| 方法 | 
说明 | 
| requests.request() | 
构造一个请求,支撑以下各方法的基础方法 | 
| requests.get() | 
获取HTML网页的主要方法,对应于HTTP的GET | 
| requests.head() | 
获取HTML网页头信息的方法,对应于HTTP的HEAD | 
| requests.post() | 
向HTML页面提交POST请求的方法,对应于HTTP的POST | 
| requests.put() | 
向HTML网页提交PUT请求的方法,对应于HTTP的PUT | 
| requests.patch() | 
向HTML网页提交局部修改请求,对应于HTTP的PATCH | 
| requests.delete() | 
向HTML页面提交删除请求,对应于HTTP的DELETE | 
1 2 3 4 5 6 7 8 9 10
   | requests.get()
  r = requests.get(url) 构造一个向服务器请求资源的Request对象 返回一个包含服务器资源的Response对象,Response对象包含爬虫返回的内容
  requests.get(url, params=None, **kwargs) url 拟获取页面的URL链接 params url中的额外参数,字典或字节流格式,可选 **kwargs 12个控制访问的参数
   | 
 
Response对象的属性
| 属性 | 
说明 | 
| r.status_code | 
HTTP请求的返回状态,200表示连接成功,404或其他表示失败 | 
| r.text | 
HTTP响应内容的字符串形式,即URL对应的页面内容 | 
| r.encoding | 
从HTTP header中猜测响应内容的编码方式(查看的的头部的charset,不准确,默认编码为ISO‐8859‐1) | 
| r.apparent_encoding | 
从内容中分析出响应内容的编码方式(备选编码方式,比较准确) | 
| r.content | 
HTTP响应内容的二进制形式(例如图像) | 
1 2 3 4 5 6 7 8 9 10 11 12 13
   |  import requests
  r = requests.get("https://baidu.com") print("r的类型为:\n", type(r))
  print("状态码为:\n", r.status_code) print("html内容为:\n", r.text) print("网页的编码方式为:\n", r.encoding) print("网页的备选编码方式为:\n", r.apparent_encoding)
  r.encoding = 'utf-8' print("html内容为:\n", r.text)
 
  | 
 
requests.get()网络连接可能有风险会抛出异常
| requests库的异常 | 
说明 | 
| requests.ConnectionError | 
网络连接错误异常,如DNS查询失败,拒绝连接等 | 
| requests.HTTPError | 
HTTP错误异常 | 
| requests.URLRequired | 
URL缺失异常 | 
| requests.TooManyRedirects | 
超过最大重定向次数,产生重定向异常 | 
| requests.ConnectTimeout | 
连接远程服务器超时异常 | 
| requests.Timeout | 
请求URL超时,产生超时异常 | 
| r.raise_for_status() | 
如果不是200,产生异常requests.HTTPErrot。在方法内部判断r.status_code是否等于200,不需要增加额外的if语句,该语句便于利用try-except进行异常处理。 | 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
   | 爬取网页的通用代码框架
 
 
  import requests
  def getHTMLText(url):     try:         r = requests.get(url, timeout = 30)         r.raise_for_status()           r.encoding = r.apparent_encoding         return r.text     except:         return "产生异常"
  if __name__ == "__main__":     url = "https://www.baidu.com"     print(getHTMLText(url))
   | 
 
HTTP 超文本传输协议
HTTP是一个基于“请求与响应”模式的、无状态【第一次请求与第二次请求没有关联】的应用层协议【HTTP协议工作在TCP协议之上】。采用URL作为定位网络资源的标识,URL格式如下:
1
   | http://host[:port][path]
   | 
 
PATCH与PUT的区别
假设URL位置有一组数据UserInfo,包括UserId、UserName等20个字段
需求:用户修改了UserName,其他不变
- 采用PATCH,仅向URL提交UserName的局部更新请求
 
- 采用PUT,必须将所有20个字段一并提交到URL,未提交的字段将会被删除
 
PATCH优点:节省网络宽带
1 2 3 4 5 6 7
   |  import requests
  r = requests.head("https://baidu.com") print("请求的头部内容为:\n", r.headers) print("请求的html内容为:\n", r.text)  
 
 
  | 
 
1 2 3 4 5 6 7 8 9 10 11 12 13 14
   | 
  import requests payload = {'key1': 'value1', 'key2': 'value2'}   r = requests.post('http://httpbin.org/post', data = payload) print(r.text)
 
 
 
 
 
 
 
 
 
  | 
 
1 2 3 4 5 6 7 8 9 10 11 12
   | 
  import requests r = requests.post('http://httpbin.org/post', data = 'ABC')   print(r.text)
 
 
 
 
 
 
 
 
  | 
 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
   | requests.requests(method, url, **kwargs) method 请求方式,对应有GET/HEAD/POST/PUT/PATCH/DELETE/OPTIONS(获取服务器跟客户端能够打交道的参数)一共7种 url 拟获取页面的url链接 **kwargs 访问控制的参数,共13个,可选项 	params 字典或字节序列,作为参数增加到url中     	>>> kv={'key1':'value1','key2':'value2'}  		>>> r=requests.request('GET','http://python123.io/ws',params=kv)  		>>> print(r.url) http://python123.io/ws?key1=value1&key2=value2     data 字典、字节序列或文件对象,作为Requests的内容     	>>> kv={'key1':'value1','key2':'value2'}  		>>> r=requests.request('POST','http://python123.io/ws',data=kv)  		>>> body='主体内容'  		>>> r=requests.request('POST','http://python123.io/ws',data=body)     json JSON格式的数据,作为Requests的内容     	>>> kv={'key1':'value1'}  		>>> r=requests.request('POST','http://python123.io/ws',json=kv)     headers 字典,HTTP定制头     	>>> hd={'user‐agent':'Chrome/10'}  		>>> r=requests.request('POST','http://python123.io/ws',headers=hd)     cookies 字典或CookieJar,Requests中的cookie     auth 元组,支持HTTP认证功能     files 字典类型,传输文件     	>>> fs={'file':open('data.xls','rb')}          >>> r=requests.request('POST','http://python123.io/ws',files=fs)	     timeout 设定超时时间,秒为单位     	>>> r=requests.request('GET','http://www.baidu.com',timeout=10)     proxies 字典类型,设定访问代理服务器,可以增加登录认证(可以隐藏源,防止逆追踪)     	>>> pxs={'http':'http://user:pass@10.10.10.1:1234' 'https':'https://10.10.10.1:4321'} 						>>> r=requests.request('GET','http://www.baidu.com',proxies=pxs)     allow_redirects True/False,默认为True,重定向开关     stream True/False,默认为True,获取内容立即下载开关     verify True/False,默认为True,认证SSL证书开关     cert 本地SSL证书路径
   |