真正危险的不是计算机开始像人那样去思考,而是人类开始像计算机一样思考。 ——西德尼·哈里斯(Sydney Harris)
python
爬虫之旅之第二站~~
Requests
库是经常用的库,比urllib
更加方便。 首先先领略一下使用Requests
的方便之处:
1 2 3 4 5 6 7 import requestsresponse=requests.get('http://aisleep.xyz' ) print (type (response))print (response.status_code)print (type (response.text))print (response.text)print (response.cookies)
这里的第6行和在urllib
中使用read
的作用是一样的,在urllib
中还要使用.decode
使得其变成字符串类型。在Requests
中就很方便了,直接使用text
就可以了。在最后一行中的cookies
获取中也比在urllib
中方便很多。
再看requests
中还提供了很多比较方便的各种请求方式:
1 2 3 4 5 6 import requestsrequests.post("http://httpbin.org/post" ) requests.put("http://httpbin.org/put" ) requests.delete("http://httpbin.org/delete" ) requests.head("http://httpbin.org/get" ) requests.options("http://htpbin.org/get" )
可见想要进行一个post
请求,直接requests.post
就好。
好,Requsets
的方便之处你现在也稍微感受到一点了,现在在仔细的看一下他的使用。
1 2 3 import requestsresponse=requests.get('http://aisleep.xyz' ) print (response.text)
这里就是一个最简单的一个get
请求。那如果我们还要传一些自己的参数怎么设置呢:
1 2 3 import requestsresponse=requests.get("http://httpbin.org/get?name=lifan&age=23" ) print (response.text)
也可以这样:
1 2 3 4 5 6 7 import requestsdata={ 'name' :'lifan' , 'age' :23 } response=requests.get("http://httpbin.org/get" ,params=data) print (response.text)
第一种方法比较繁琐一点,需要加一个?
再在多个参数之间再加上&
就可以。第二种方法就是自己先构造一个字典,然后传给params
就可以方便的构造一个get
请求的url
,不需要再手动输入了。
1 2 3 4 5 import requestsresponse=requests.get("http://httpbin.org/get" ) print (type (response.text))print (response.json())print (type (response.json()))
这是直接提供的了个解析json
格式的方式,其实第4行就相当于进行一个这样的调用:print(json.load(response.text))
(在前面再加一句import json
)
1 2 3 4 5 6 7 8 import requestsresponse=requests.get("https://github.com/favicon.ico" ) print (type (response.text),type (response.content))print (response.text)print (response.content)with open ('favicon.ico' ,'wb' ) as f: f.write(response.content) f.close()
这里使用content
获取二进制数据,比如图片,视频等,第6行开始到结束做的是保存这个二进制文件的工作:打开一个文件,wb
是说明对这个文件进行操作的方式为“以二进制格式打开一个文件只用于写入”,as f
是帮这个文件起了一个别名,f.write
是写入到打开的文件中,最后要关闭文件。
添加headers
主要是模拟成你是浏览器要求的访问,防止被浏览网站所禁止。这里添加一个浏览器信息就好
1 2 3 4 5 6 7 import requestsheaders={ 'User-Agent' :'Mozilla/5.0 (Macintosh; intel Mac OS X 10_11_4) AppleWebKit/537.36(KHTML,like Gecko)Chrome/52.0.2743.116 Safari/537.36' } response=requests.get('http://www.zhihu.com' ,headers=headers) print (response.text)
1 2 3 4 import requestsdata={'name' :'lifan' ,'age' :'23' } response=requests.post("http://httpbin.org/post" ,data=data) print (response.text)
这里就明显看出比urllib
中的操作方便很多。
1 2 3 4 5 6 7 import requestsresponse=requests.get('http://www.baidu.com' ) print (type (response.status_code),response.status_code)print (type (response.headers),response.headers)print (type (response.cookies),response.cookies)print (type (response.url),response.url)print (type (response.history),response.history)
运行结果为:
1 2 3 4 5 <class 'int'> 200 <class 'requests.structures.CaseInsensitiveDict'> {'Server': 'bfe/1.0.8.18', 'Date': 'Tue, 03 Apr 2018 07:59:03 GMT', 'Content-Type': 'text/html', 'Last-Modified': 'Mon, 23 Jan 2017 13:27:36 GMT', 'Transfer-Encoding': 'chunked', 'Connection': 'Keep-Alive', 'Cache-Control': 'private, no-cache, no-store, proxy-revalidate, no-transform', 'Pragma': 'no-cache', 'Set-Cookie': 'BDORZ=27315; max-age=86400; domain=.baidu.com; path=/', 'Content-Encoding': 'gzip'} <class 'requests.cookies.RequestsCookieJar'> <RequestsCookieJar[<Cookie BDORZ=27315 for .baidu.com/>]> <class 'str'> http://www.baidu.com/ <class 'list'> []
1 2 3 import requestsresponse=requests.get('http://www.baidu.com' ) exit() if not response.status_code==requests.codes.ok else print ('request successfully' )
这个状态码的判断的意思是,在requests.codes
里面他将很多的状态码对应了一些方便记忆的单词,比如,将200
对应了ok
这个词,404
对应了not_found
这个词,这样我们只要查表不需要记住这些状态码就行了,第3行的代码的意思是:如果response
的状态码不等于ok
就退出,如果等于,就打印request successfully
。