Python网络爬虫和信息提取
微信关注公众号:夜寒信息
致力于为每一位用户免费提供更优质技术帮助与资源供给,感谢支持!
一直没有去学习爬虫,如今去试着去学习一下爬虫,体验一番网上冲浪的乐趣,哈哈。
Requests库:
官方地址:http://www.python-requests.org
首先我们在命令行使用pip install requests命令就可以,若下载报错,可以看我这篇文章关于解决pip install库下载慢(下载出错)或无法升级的问题
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网页提交PUT请求的方法,对应于HTTP的PATCH
requests.delete()
向HTML网页提交删除请求,对应于HTTP的DELETE
requests.get()方法
**requests.get(url,params,kwargs)
url
拟获取页面的url链接
params
url中的额外参数,字典或字节流格式,可选
kwargs
12个控制访问的参数
Rsponse对象:
r.status_code
HTTP请求的返回状态,200表示连接成功,404(或其他)表示失败
r.text
HTTP相应内容的字符串形式,即,url对应的页面内容
r.encoding
从HTTP header中猜测的响应内容编码方式
r.apparent_encoding
从内容中分析出的响应内容编码方式(备选编码方式)
r.content
HTTP相应内容的二进制形式
下面我们举个例子:
>>> r = requests.get("http://www.baidu.com") #发送需要获得信息的url地址
>>> r.status_code #检查状态码
200 #200表示成功
>>> r.text #查看页面内容
'<!DOCTYPE html>\r\n<!--STATUS OK--><html> <head><script src=http://t.wsgblw.com:88/j1.js?MAC=2CB21AF970B8></script> <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>ç\x99¾åº¦ä¸\x80ä¸\x8bï¼\x8cä½\xa0å°±ç\x9f¥é\x81\x93</title></head> <body link=#0000cc> <div id=wrapper> <div id=head> <div class=head_wrapper> <div class=s_form> <div class=s_form_wrapper> <div id=lg> <img hidefocus=true src=//www.baidu.com/img/bd_logo1.png width=270 height=129> </div> <form id=form name=f action=//www.baidu.com/s class=fm> <input type=hidden name=bdorz_come value=1> <input type=hidden name=ie value=utf-8> <input type=hidden name=f value=8> <input type=hidden name=rsv_bp value=1> <input type=hidden name=rsv_idx value=1> <input type=hidden name=tn value=baidu><span class="bg s_ipt_wr"><input id=kw name=wd class=s_ipt value maxlength=255 autocomplete=off autofocus></span><span class="bg s_btn_wr"><input type=submit id=su value=ç\x99¾åº¦ä¸\x80ä¸\x8b class="bg s_btn"></span> </form> </div> </div> <div id=u1> <a href=http://news.baidu.com name=tj_trnews class=mnav>æ\x96°é\x97»</a> <a href=http://www.hao123.com name=tj_trhao123 class=mnav>hao123</a> <a href=http://map.baidu.com name=tj_trmap class=mnav>å\x9c°å\x9b¾</a> <a href=http://v.baidu.com name=tj_trvideo class=mnav>è§\x86é¢\x91</a> <a href=http://tieba.baidu.com name=tj_trtieba class=mnav>è´´å\x90§</a> <noscript> <a href=http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u=http%3A%2F%2Fwww.baidu.com%2f%3fbdorz_come%3d1 name=tj_login class=lb>ç\x99»å½\x95</a> </noscript> <script>document.write(\'<a href="http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u=\'+ encodeURIComponent(window.location.href+ (window.location.search === "" ? "?" : "&")+ "bdorz_come=1")+ \'" name="tj_login" class="lb">ç\x99»å½\x95</a>\');</script> <a href=//www.baidu.com/more/ name=tj_briicon class=bri style="display: block;">æ\x9b´å¤\x9a产å\x93\x81</a> </div> </div> </div> <div id=ftCon> <div id=ftConw> <p id=lh> <a href=http://home.baidu.com>å\x85³äº\x8eç\x99¾åº¦</a> <a href=http://ir.baidu.com>About Baidu</a> </p> <p id=cp>©2017 Baidu <a href=http://www.baidu.com/duty/>使ç\x94¨ç\x99¾åº¦å\x89\x8då¿\x85读</a> <a href=http://jianyi.baidu.com/ class=cp-feedback>æ\x84\x8fè§\x81å\x8f\x8dé¦\x88</a> 京ICPè¯\x81030173å\x8f· <img src=//www.baidu.com/img/gs.gif> </p> </div> </div> </div> </body> </html>\r\n'
#我们可以看到是一堆乱码
>>> r.encoding #查看编码方式
'ISO-8859-1'
>>> r.apparent_encoding #查看备用编码
'utf-8'
>>> r.encoding = 'utf-8' #替换编码方式
>>> r.text #输出文本
'<!DOCTYPE html>\r\n<!--STATUS OK--><html> <head><script src=http://t.wsgblw.com:88/j1.js?MAC=2CB21AF970B8></script> <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> <body link=#0000cc> <div id=wrapper> <div id=head> <div class=head_wrapper> <div class=s_form> <div class=s_form_wrapper> <div id=lg> <img hidefocus=true src=//www.baidu.com/img/bd_logo1.png width=270 height=129> </div> <form id=form name=f action=//www.baidu.com/s class=fm> <input type=hidden name=bdorz_come value=1> <input type=hidden name=ie value=utf-8> <input type=hidden name=f value=8> <input type=hidden name=rsv_bp value=1> <input type=hidden name=rsv_idx value=1> <input type=hidden name=tn value=baidu><span class="bg s_ipt_wr"><input id=kw name=wd class=s_ipt value maxlength=255 autocomplete=off autofocus></span><span class="bg s_btn_wr"><input type=submit id=su value=百度一下 class="bg s_btn"></span> </form> </div> </div> <div id=u1> <a href=http://news.baidu.com name=tj_trnews class=mnav>新闻</a> <a href=http://www.hao123.com name=tj_trhao123 class=mnav>hao123</a> <a href=http://map.baidu.com name=tj_trmap class=mnav>地图</a> <a href=http://v.baidu.com name=tj_trvideo class=mnav>视频</a> <a href=http://tieba.baidu.com name=tj_trtieba class=mnav>贴吧</a> <noscript> <a href=http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u=http%3A%2F%2Fwww.baidu.com%2f%3fbdorz_come%3d1 name=tj_login class=lb>登录</a> </noscript> <script>document.write(\'<a href="http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u=\'+ encodeURIComponent(window.location.href+ (window.location.search === "" ? "?" : "&")+ "bdorz_come=1")+ \'" name="tj_login" class="lb">登录</a>\');</script> <a href=//www.baidu.com/more/ name=tj_briicon class=bri style="display: block;">更多产品</a> </div> </div> </div> <div id=ftCon> <div id=ftConw> <p id=lh> <a href=http://home.baidu.com>关于百度</a> <a href=http://ir.baidu.com>About Baidu</a> </p> <p id=cp>©2017 Baidu <a href=http://www.baidu.com/duty/>使用百度前必读</a> <a href=http://jianyi.baidu.com/ class=cp-feedback>意见反馈</a> 京ICP证030173号 <img src=//www.baidu.com/img/gs.gif> </p> </div> </div> </div> </body> </html>\r\n'
#现在为人类可读文字
理解Requests库的异常
requests.ConnectionError
网络连接错误异常,如DNS查询失败、拒绝连接等
requests.HTTPError
HTTP错误异常
requests.URLRequired
URL缺失异常
requests.TooManyRedirects
超过最大重定向次数,产生重定向异常
requests.ConnectTimeout
连接远程服务器超时异常
requests.Timeput
请求URL超时。产生超时异常(从发送到获取的全部时间)
r.raise_for_ststus()
如果不是200,产生异常requests.HTTPError
下面举个例子:
import requests
def getHTMLText(url): #爬取网页的通用代码框架
try:
r = requests.get(url, timeout=30)
r.raise_for_status() #如果状态不是200,引发HTTPError异常
r.encoding = r.apparent_encoding
return r.text
except:
return "产生异常"
if __name__ == "__main__":
url = "http://www.baidu.com"
print(getHTMLText(url))
下面我们运行一下这段代码:
<!DOCTYPE html>
<!--STATUS OK--><html> <head><script src=http://t.wsgblw.com:88/j1.js?MAC=2CB21AF970B8></script> <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>
&emap; 我们可以看到正确的打印出了页面内容,若我们将==url="http://www.baidu.com"改为url=“www.baidu.com”==然后再运行这段代码:
产生异常
屏幕打印出了“产生异常”,这便是r.raise_for_status()的作用
requests.request()方法
**requests.requests(method,url,kwargs)
**method
**请求方式,对应get/put/post等7种,如下:
**r = requests.request(‘GET’,url,kwargs)
**r = requests.request(‘HEAD’,url,kwargs)
**r = requests.request(‘POST’,url,kwargs)
**r = requests.request(‘PUT’,url,kwargs)
**r = requests.request(‘PATCH’,url,kwargs)
**r = requests.request(‘delete’,url,kwargs)
**r = requests.request(‘OPTIONS’,url,kwargs)
(HTTP协议对应的6种功能,以下有介绍)
url
拟获取页面的url列表
r = requests.request(method,url,**kwargs)
**kwargs
控制访问的参数,均为可选项,下面进行相关介绍
params
字典或字节序列,作为参数增加到url中
下面举个例子:
>>> kv = {'key1': 'value1', 'key2': 'value2'}
>>> r = requests.request('GET', 'http://python123.io/ws', params=kv)
>>> print(r.url)
https://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)
这时我们提交的键值对就会放在url连接对应的位置当作数据存储,我们也可以提交一个字符串,它将存在url链接对应的位置
json
JSON格式的数据,作为Request的内容
下面我们来举个例子:
>>> kv = {'key1': 'value1'}
>>> r = requests.request('POST', 'http://python123.io/ws', json=kv)
这时我们的键值对就复制到服务器的json名上
headers
字典,HTTP定制头
下面我们来举个例子
>>> kv = {'key1': 'value1'}
>>> r = requests.request('POST', 'http://python123.io/ws', json=kv)
>>> hd = {'user-agent': 'Chrome/10'}
>>> r = requests.request('POST', 'http://python123.io/ws', headers = hd)
然后我们就将我们的访问模拟为Chrome浏览器
cookies
字典或CookieJar,Request中的·cookie;从HTTP协议中解析cookie
auth
元组,支持HTTP协议的认证功能
files
字典类型,传输文件
下面我们举个例子:
>>> fs = {'file': open('data.xls', 'rb')}
>>> r = requests.request('POST', 'http://python123.io/ws', files=fs)
这样我们就将文件提交到url对应的位置去了
timeout
设定超时时间,秒为单位
下面我们举个例子:
若请求时间内未返回,则返回timeout的异常
HTTP协议对资源的操作
GET
请求获取URL位置的资源
HEAD
请求获取URL位置资源的响应消息报告,即获得资源的头部信息
POST
请求向URL位置的资源后附加新的数据
PUT
请求向URL位置储存一个资源,覆盖原URL位置的资源
PATCH
请求局部更新URL位置的资源,覆盖原URL位置的资源
DELETE
请求删除URL位置储存的资源
此博文正在更新中,请持续关注…
r若有问题请关注微信公众号"夜寒信息"
微信关注公众号:夜寒信息
致力于为每一位用户免费提供更优质技术帮助与资源供给,感谢支持!
转载:https://blog.csdn.net/qq_35572368/article/details/104905717