【Rollo的Python之路】Python 爬虫系统学习 (二) Requests 模块学习

Requests模块学习:

1.0  Requests 初识

Requests 模块是一个第三方的库,首先我们要安装Requests.用pip安装,先看一下pip是哪个python 的版本。

 

pip --version

 

然后用pip安装就OK

pip install requests

 

开始要导入 Requests 模块

import requests

然后我们试一下:

import requests
results = requests.get('https://www.baidu.com')

然后我们看一下得到的源码

results.text
'<!DOCTYPE html>\r\n<!--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=https://ss1.bdstatic.com/5eN1bjq8AAUYm2zgoY3K/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=autofocus></span><span class="bg s_btn_wr"><input type=submit id=su value=ç\x99¾åº¦ä¸\x80ä¸\x8b class="bg s_btn" autofocus></span> </form> </div> </div> <div id=u1> <a href=http://news.baidu.com name=tj_trnews class=mnav>æ\x96°é\x97»</a> <a href=https://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&amp;tpl=mn&amp;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>\');\r\n                </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>&copy;2017&nbsp;Baidu&nbsp;<a href=http://www.baidu.com/duty/>使ç\x94¨ç\x99¾åº¦å\x89\x8då¿\x85读</a>&nbsp; <a href=http://jianyi.baidu.com/ class=cp-feedback>æ\x84\x8fè§\x81å\x8f\x8dé¦\x88</a>&nbsp;京ICPè¯\x81030173å\x8f·&nbsp; <img src=//www.baidu.com/img/gs.gif> </p> </div> </div> </div> </body> </html>\r\n'

源码里面有一些是乱码,这是因为我们没有使用解码方式,而是requests模式自己认为的解码方式解的。我们看来是

results.encoding

 

要想到得正确的代码:用utf-8解码就OK

1 results.encoding = 'utf-8'
2 results.text
3 
4 
5 '<!DOCTYPE html>\r\n<!--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=https://ss1.bdstatic.com/5eN1bjq8AAUYm2zgoY3K/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=autofocus></span><span class="bg s_btn_wr"><input type=submit id=su value=百度一下 class="bg s_btn" autofocus></span> </form> </div> </div> <div id=u1> <a href=http://news.baidu.com name=tj_trnews class=mnav>新闻</a> <a href=https://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&amp;tpl=mn&amp;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>\');\r\n                </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>&copy;2017&nbsp;Baidu&nbsp;<a href=http://www.baidu.com/duty/>使用百度前必读</a>&nbsp; <a href=http://jianyi.baidu.com/ class=cp-feedback>意见反馈</a>&nbsp;京ICP证030173号&nbsp; <img src=//www.baidu.com/img/gs.gif> </p> </div> </div> </div> </body> </html>\r\n'

 

这里要注意:

1.0 results.text 这个地方的text是一个属性,属性调用不用要(),大多数情况是如果是名词的话,那这个名词基本上是属性,不用()

2.0 reuqests.get() 这个地方的get是一个方法,方法调用要用(),大多数情况 是如果 是动词的话,那个动词基本上都是方法,都要用()

3.0 我们自己写程序的时候也要遵守这个原则,这样的话,方便以后维护。

 

results.text可以得到源码,results.content也可以同样得到源码,我们来试一下:

>>> results.content
b'<!DOCTYPE html>\r\n<!--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=https://ss1.bdstatic.com/5eN1bjq8AAUYm2zgoY3K/r/www/cache/bdorz/baidu.min.css><title>\xe7\x99\xbe\xe5\xba\xa6\xe4\xb8\x80\xe4\xb8\x8b\xef\xbc\x8c\xe4\xbd\xa0\xe5\xb0\xb1\xe7\x9f\xa5\xe9\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=autofocus></span><span class="bg s_btn_wr"><input type=submit id=su value=\xe7\x99\xbe\xe5\xba\xa6\xe4\xb8\x80\xe4\xb8\x8b class="bg s_btn" autofocus></span> </form> </div> </div> <div id=u1> <a href=http://news.baidu.com name=tj_trnews class=mnav>\xe6\x96\xb0\xe9\x97\xbb</a> <a href=https://www.hao123.com name=tj_trhao123 class=mnav>hao123</a> <a href=http://map.baidu.com name=tj_trmap class=mnav>\xe5\x9c\xb0\xe5\x9b\xbe</a> <a href=http://v.baidu.com name=tj_trvideo class=mnav>\xe8\xa7\x86\xe9\xa2\x91</a> <a href=http://tieba.baidu.com name=tj_trtieba class=mnav>\xe8\xb4\xb4\xe5\x90\xa7</a> <noscript> <a href=http://www.baidu.com/bdorz/login.gif?login&amp;tpl=mn&amp;u=http%3A%2F%2Fwww.baidu.com%2f%3fbdorz_come%3d1 name=tj_login class=lb>\xe7\x99\xbb\xe5\xbd\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">\xe7\x99\xbb\xe5\xbd\x95</a>\');\r\n                </script> <a href=//www.baidu.com/more/ name=tj_briicon class=bri style="display: block;">\xe6\x9b\xb4\xe5\xa4\x9a\xe4\xba\xa7\xe5\x93\x81</a> </div> </div> </div> <div id=ftCon> <div id=ftConw> <p id=lh> <a href=http://home.baidu.com>\xe5\x85\xb3\xe4\xba\x8e\xe7\x99\xbe\xe5\xba\xa6</a> <a href=http://ir.baidu.com>About Baidu</a> </p> <p id=cp>&copy;2017&nbsp;Baidu&nbsp;<a href=http://www.baidu.com/duty/>\xe4\xbd\xbf\xe7\x94\xa8\xe7\x99\xbe\xe5\xba\xa6\xe5\x89\x8d\xe5\xbf\x85\xe8\xaf\xbb</a>&nbsp; <a href=http://jianyi.baidu.com/ class=cp-feedback>\xe6\x84\x8f\xe8\xa7\x81\xe5\x8f\x8d\xe9\xa6\x88</a>&nbsp;\xe4\xba\xacICP\xe8\xaf\x81030173\xe5\x8f\xb7&nbsp; <img src=//www.baidu.com/img/gs.gif> </p> </div> </div> </div> </body> </html>\r\n'

他得到的是一个byte类型的数据。

然后用 decode转码就得到str类型的数据:decode就是动词,是方法,要(),默认utf-8,

>>> results.content.decode()
'<!DOCTYPE html>\r\n<!--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=https://ss1.bdstatic.com/5eN1bjq8AAUYm2zgoY3K/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=autofocus></span><span class="bg s_btn_wr"><input type=submit id=su value=百度一下 class="bg s_btn" autofocus></span> </form> </div> </div> <div id=u1> <a href=http://news.baidu.com name=tj_trnews class=mnav>新闻</a> <a href=https://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&amp;tpl=mn&amp;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>\');\r\n                </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>&copy;2017&nbsp;Baidu&nbsp;<a href=http://www.baidu.com/duty/>使用百度前必读</a>&nbsp; <a href=http://jianyi.baidu.com/ class=cp-feedback>意见反馈</a>&nbsp;京ICP证030173号&nbsp; <img src=//www.baidu.com/img/gs.gif> </p> </div> </div> </div> </body> </html>\r\n'

 

这里要注意:

requests中解决编码与解码的方法:

1.0 首先选择-- response.content.decode()  默认使用utf-8,80%是utf-8

2.0 如果不行--response.content.decode('gbk'),

3.0 还是不行--response.text 因为get方法会自动检测代码的编码方式,虽然成功率很低,但是最后这是最后一击了

4.0 response.text 可以修改编码方式: response.encoding = 'gbk'

 

OK,requests除了get请求还有其他请求:

HTTP POST,(这个用于有cookie与session的网站)

HTTP PUT,

HTTP DELETE,

HTTP HEAD,

>>> r = requests.post('http://www.baidu.com', data = {'key':'value'})
>>> r = requests.put('http://www.baidu.com/put', data = {'key':'value'})
>>> r = requests.delete('http://www.baidu.com/delete')
>>> r = requests.head('http://www.baidu.com/get')
>>> r = requests.options('http://www.baidu.com/get')

2.0 Requests URL构造方法:

Requests 的URL可以用键/值对把参数传入到URL的?号后面,同时Requests允许使用params关键词参数

举例来说,如果你想传递 key1=value1 和 key2=value2 到 http://www.baidu.com/get,那可以这样写:

 

params = {'key1':'value1','key2':'value2'}
>>> r = requests.get('http://www.baidu.com/',params=params)
>>> print(r.url)

--------------------------
http://www.baidu.com/?key1=value1&key2=value2

 

注意字典里值为 None 的键都不会被添加到 URL 的查询字符串里

你还可以将一个列表作为值传入:

>>> params = {'key1':'value1','key2':['value2','value3']}
>>> r = requests.get('http://www.baidu.com/',params=params)
>>> print(r.url)

--------------------------------------------------------------------------
http://www.baidu.com/?key1=value1&key2=value2&key2=value3

 

3.0 Requests原始响应内容:

在罕见的情况下,你可能想获取来自服务器的原始套接字响应,那么你可以访问 r.raw。 如果你确实想这么干,那请你确保在初始请求中设置了 stream=True。具体你可以这么做

r = requests.get('http://www.baidu.com', stream=True)
>>> r.raw
<urllib3.response.HTTPResponse object at 0x0000000003D69CF8>
>>> r.raw.read()


-----------------------
b'\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03\x85V[o\xdcD\x14~G\xe2?L\x8d\x92\xb4\x8av\x9d\xddU\xd5\x92\xb5\x1d\x854H\x11\x0f\xadh"\xc1\xd3jl\x8f\xd7\xd3\xd83\xc63^gyj\xa4\x16\x81\xa0\x04T.\x82"\x81\x104< 5\x88HT)i\xff\xcc:\x97\'\xfe\x02g\xec\xd9\xecn\xb2QW+\xd9s\xe6\xccw\xbes\x1d[Wn\xdd^Y\xff\xf0\xce*\ne\x1c9o\xbea]\xa9\xd5\xee\xae/\xafo\xdcE\xb7\xdf\xab\xd5\x1c\xab\x94#+$\xd8w\xac\x98H\x0c\x9a2\xa9\x91\x8f2\xda\xb3=\xce$a\xb2&\xfb\tAzaK\xb2%Mu\xac\xed\x858\x15D\xda\x99\x0cj7/\x9e\xfe\xa0\xb6\xb1\\[\xe1q\x82%u\xa3\x11\xc0\xda\xaa\xbd\xeaw\x89>0\x84\xc5Q\x8e\xfb\x021\x1c\x13;%\x01IS\x92:VD\xd9&JId\x0b\xd9\x8f\x88\x08\t\x91H\xb1\xa9XxB\xa0\x10\x94m\xc5y\xd14E\xa3\xee\xfaB\x82=\xaf\xee\xf1\xd8L\xcd<\xcfM\x0f{!1]\x9f\xa7\x1f\x9b.\xa6~V\x8f)\xab\xc3Y\xc7\x92TF\xc49\xfe\xe1eq\xf0t\xf0\xfc\xfe\xe0\xf9\xe7\xff\xfd\xfb\xc5\xe0\xf0\x97b\xef\xaf\xe3\x9f\x7f?\xdd~l\x99\x95\x8ae\x96\x11B\x96\xcb\xfd>R\xac\xec\xb7\x16\xe0\xe7y\x0e\xb2|\xdaC\xd4\xb7\xf3\x14\'\t\x90>\x13\xe8#j\xdb\x8b\xb0\x10\xb6\x12t&\xd5\xaa\r\xd1\tx\x1a\xeb\x93\xe3\xa2s\xda`%\xea\x82\x1a\x8d\xbb(\xa4>\t\xb8\x97\t[\xa6\x19A"\xf5lS\xf9[\xaf|T\xfe\x83\x1a\xf8\xdd\x89x\x977\xea\t\xeb\xa2\x9c\xfa2\xb4\x9b7\x16PHh7\x94v\xa3\xf96\xc0\x99@\x11\x1e\x8a\x83r\xa4|\x96\x89\x08\x10\xf6$\xe5\xec\x02\xb2\xd0\x1e\x05\x8a4eI\xa6\xd3\x02\xa4|\xc2\xaa,\x96\x11\xef\x00\x0f\x82z8\xca\x88\xdd\xb8\\\x97\x0eu\xaaZ\xba\x143\xd0P7/\x87JE\xaf\xe3&\xaf7\xa9\xf4\xa8\xbf\xf5zE\xc9\xb4N\x19X\xc7\x12\tf\xda}\xc3\xed"\xd1\xa1\x89\x84<\x19\x8e\x0e\x04Dp3\xafB\x90\xfbZ\xb1T\xaa`P\x8c\xb7"\xc2\xba*\x11\xd7\xaf#\x9cI\x0e1J""\x89\xcd\x03\x888\x08\xca\xbc:\x96\xa9LM1\xe8J6n\xb0l\x08\x91\xb91\x95*}"\xd3|\xc7\xebz\x820\x9c\x07\xb6\x15:d_\xd7\x9e\xae\x02\xfd\xd0E\x9d\xa9\xa4\xc1P\x18\xeb2Fr1*\xb2\xcaQy\xaf#S\xb5\xa1\xed\xc4\x0c\xf7\x9c\xa3\xef\xf6N\xbf\x7fa\x99\xf8\x02\x84*\xd3\x10\xf3F\xb3\xa5\xfat\x0c\xa2\x12\x8e\x83T\x92i 1N\xa6\xd2\x00\xf98@\xf1\xd3^\xf1\xe4\xe54\x80\xde\xd4\xe3=\xe8+>\x0ep\xb2\xfb\xc9\xe9\xaf_O\x03\x90\x94\xb8x*H\xb93\x01\xb2\xbf_|\xb5[\x810.\xbc\x14\x8afjXF\xdd[M,h^\x98V]\x1a,\x95o\xb38N\xda2\x89\xec\x98\x95\xafY9\xfbfZ\xcb3\xcdw\xe1?\xd1\xff3\xcd`\xa6\x15\x8c\xdap\xa6\xe57\xceb]\xa2i\x86\x91\x0b3\xf0Eq\xf8m\xc5\xcf\x1c#\xa8\x99\xfa0hb\xb8\n\xeayJ%\xb9:7,\tCO\xde\t\xbbz\xd6\x9eg\xaeYg\xf6\xdc<"\xcc\xe3>\xd9x\x7fm\x05J\x9f3@\xbe\x9aS\xe6\xf3\xbc\x1eq\x0f\xe67guUr\xf3\xe8\x82X\x10\x9cz!\xb2m\x1b\x19\x06ZB\xc6\x92\x81\x16\x911k\\\x9bG\xc6\xc8W\xbb\xa1\x04sF\xe5\xaf\x01\xf5Y\xd21\xb4\xc7F\xe4\x1ac>\xcf]kC;\x9cK\xca\xf9i\x1a\xf3\x94\x98g\xf1sSJ\xe1\xee\xd2x\xb0B\xe5\x15e\x1b>\x15I\x84\xfb\x8b\xc8\x05W6\xdb\x86s\xf4d\xbf\xf8\xed\xc7\xc1\xc1n\xf1x[\x07\xb8\x9a\xb7S\x1b.\x90+\x9cAe\xe8\xfe+\x979\xac\x13\xd5\xdaQx\xa1fB\x98\xaf\xa3\x12t\x8a\x87\x7f\x0f\x0e\xbe\xac:\x7fZ\xc9\xd2tLy\xd9\xe50\xb8\xdfQw\xa2&\x96\x0c-y\x893\xeb\xf1\xa4\xdfn.4n\xcc2W$\xedR\xafz\x1d\xa6\x7fj\xf6\xfdL\xf6Mgp\xf8\xea\xf8\x9b?*"\xc5g\x8f\x8aW\x0fO\x9e\x95\xb3\xa0B8?T\xeeQ\xcc\xfat\xc4\xcd\xd4\x81\xf5\x92Z@\x88\xefbo\xd39z\xb0s\xb2\xbb]\xec<:}\xfa\xa9\xe2[!\r\x0e\xfe\\[\xb9s\xf2l{\xa1\x05T[\xc5\xce?C\x0b\xea\x96\xbc\xecZ\xec\n\xd5S\xe0\xad\xa9\\\x9e\xcc\xc4p\xa5\xeez\xb5\xa9\xbf\x9d\xfe\x07\\\x85C\x01M\t\x00\x00'

 

保存文件:

with open(filename, 'wb') as fd:
    for chunk in r.iter_content(chunk_size):
        fd.write(chunk)

 

4.0 Requests请求头headers:

headers 是一个dict形式,用headers=headers 在get()中传入参数就OK了

>>> url = 'http://www.baidu.com'
>>> headers = {'user-agent':'my-app'}
>>> r = requests.get(url=url,headers=headers)

注意: 所有的 header 值必须是 string、bytestring 或者 unicode。尽管传递 unicode header 也是允许的,但不建议这样做。

 

5.0 Requests发送简单的请求:

5.0.1 需求:通过requests向百度首页发送请求,获取百度首页的数据

response = requests.get(url)

response 的常用方法:

1 response.text
2 response.content
3 response.content_status_code
4 response.request.headers
5 response.headers

 

这里有一个assert函数,断言格式:

官方文档:(https://docs.python.org/3/reference/simple_stmts.html#assert

使用assert断言是学习python一个非常好的习惯,python assert 断言句语格式及用法很简单。在没完善一个程序之前,我们不知道程序在哪里会出错,与其让它在运行最崩溃,不如在出现错误条件时就崩溃,这时候就需要assert断言的帮助。

python assert断言是声明其布尔值必须为真的判定,如果发生异常就说明表达示为假。可以理解assert断言语句为raise-if-not,用来测试表示式,其返回值为假

assert 1==1
assert 2+2==2*2
assert len(['my boy',12])<10
assert range(4)==[0,1,2,3]

 

5.0.2 发送带header的请求:

为什么请求需要带上header?

  • 模拟浏览器,欺骗服务器,获取和浏览器一致的内容
  • header的形式:字典

  

headers = {"User-Agent":"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36"}

  

  • 用法:requests.get(url,headers=headers)

5.0.3 发送带参数的请求:

什么叫做请求参数:

https://www.baidu.com/s?wd=python
  • 参数形式:字典
  • kw = {'wd':'python'}
  • 用法:requests.get(url,params=kw)

 

6.0 简单实倒-贴吧爬虫:

 1 import requests
 2 
 3 #1.0 构造url列表
 4 #2.0 遍历,发送请求,获取响应
 5 #3.0 保存
 6 
 7 
 8 class TiebaSpider:
 9     def __init__(self,tieba_name):
10         self.tieba_name = tieba_name
11         self.url_temp='https://tieba.baidu.com/f?kw='+tieba_name+'&ie=utf-8&pn={}'
12         #https://tieba.baidu.com/f?kw=%E6%9D%8E%E6%AF%85&ie=utf-8&pn=0,原始URL
13         #%E6%9D%8E%E6%AF%85& 这个就是吧名,我们用tieba_name来代替
14         self.headers = {"User-Agent":"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36"}
15 
16     def get_url_list(self): #构造url列表
17         url_list = []
18         for i in range(1000):
19             url_list.append(self.url_temp.format(i*50))
20         return url_list
21 
22     def parse_url(self,url):
23         print(url)
24         response = requests.get(url,headers=self.headers)
25         return response.content.decode()
26 
27     def save_html(self,html_str,page_num):
28         file_path = "{}--第{}页.html".format(self.tieba_name,page_num)
29         with open("file_path","w",encoding='utf-8') as f: #李毅-第1页.html
30             f.write(html_str)
31 
32 
33 
34     def run(self): #实现主要逻辑
35         url_list = self.get_url_list()
36         for url in url_list:
37             html_str = self.parse_url(url)
38             #保存
39             page_num = url_list.index(url) + 1
40             self.save_html(html_str,page_num)
41 
42 
43 
44 if __name__ == '__main__':
45     tieba_spider = TiebaSpider('李毅')
46     tieba_spider.run()

 

7.0 发送POST请求:

哪些地方我们会用到POST请求呢?

  • 登录注册(POST比GET更安全)
  • 需要传输大文本内容的时候(POST请求对数据长度没有要求)

 

所以同样的,我们的爬虫也需要在这两个地方回去模拟浏览器发送post请求

用法:

response = requests.post('http://www.baidu.com',data=data,headers=headers)

data 的形式:字典(dict)

下面我们通过百度翻译的例子看看post请求如何使用。

 

 1 import requests
 2 import json
 3 import sys
 4 
 5 query_str = sys.argv[1]
 6 
 7 headers = {
 8     "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36"}
 9 
10 data = {
11     "query": "query_str",
12     "from": "en",
13     "to": "zh",
14     "token": "42383a89e704f21e9fa415e6af859c6b",
15     "sign": "54706.276099",
16 }
17 
18 post_url = "https://fanyi.baidu.com/basetrans"
19 
20 r = requests.post(post_url, data=data, headers=headers)
21 print(r.content.decode())
22 dict_ret = json.loads(r.content.decode())
23 ret = dict_ret['trans'][0]['dst']
24 
25 print('result is:',ret)
View Code

 

8.0 requests如何使用代理:

代理分类:

1.0 反向代理:nginx,访问的都是nginx服务器,可以防攻击

2.0 正向代理:vpn,能过国外IP,直接访问服务器,

  用法:

requests.get('http://www.baidu.com',proxies=proxies)

  proxies的形式:字典

proxies{

"http":"http://12.34.45.78:9525",

"https":"https://12.34.45.78:9525",

}

 

为什么爬虫需要使用代理:

  • 让服务器以为不是同一个客户端在请求
  • 防止我们的真实地址被泄露,防止被追究

 

使用代理IP注意事情:

  • 准备一堆的IP地址,组成IP池,随机选择一个IP 地址
  • 如何随机选择代理IP,让使用次数较少的IP有更大的机会被作用
  1. {"IP":ip,"time":0}
  2. 对这个IP的列表进行排序,按照使用次数进行排序
  3. 选择使用次数较少的10个IP,从中随机选择一人h
  • 检查代理IP的可使用性:
  1. 可以使用requests增加超时参数,判断IP地址的质量。
  2. 或者使用第三方网站在线检测IP

 

9.0 requests如何使用cookie和session:

cookie和session的区别:

  • cookie数据存放在客户的浏览器上,session数据放在服务器上
  • cookie不是很安全,别人可以分析放在本地的cookie并进行cookie欺骗
  • session会在一定时间内保存在服务器上,当访问增多,会比较占用的你服务器的性能
  • 单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie

爬虫上处cookie和session:

  • 带上cookie,session的好处:能够请求到登录之后的页面
  • 带上cookie,session的害处:一套cookie与session往往和一个用户对应,请求太多,请求次数太多,容易被服务器识别为爬

不需要cookie的时候尽量不去使用cookie

但是为了获取登录之后的页面,我们必须发送带有cookie的请求

 

携带cookie请求:

  • 携带一堆cookie进行请求,把cookie组成cookie池
  • 如何随机选择cookie,让使用次数较少的cookie有更大的机会被作用
    1. {"cookie":cookie,"time":0}
    2. 对这个cookie的列表进行排序,按照使用次数进行排序
    3. 选择使用次数较少的10个cookie,从中随机选择一个

 

 处理cookie与session的请求:

requests提供了一个叫做session类,赤实现 客户端和服务端的会话保持

  使用方法:

1 实例化一个session对象
2 让session发送get 或者 post请求
3 session = requests.session()
4 response = session.get(url,headers)

 

10.0 requests如何保存图片

response.content:就是以byte类型

import requests

response = requests.get('https://www.baidu.com/img/bd_logo1.png')

with open('a.png','wb') as f:
    f.write(response.content)
    
    #以二进制的方法保存图片
    #必须注意图片类型,video:mp3,mp4,mk...photo:png,jpg,pdf

 

 

  

 

posted @ 2019-06-16 15:09  Rollo|St  阅读(778)  评论(0编辑  收藏  举报