CC

自然万物都趋向从有序变得无序

0%

python的requests库用于爬虫的基本知识

requests模块

基本发送请求方式

1
2
3
4
5
6
r = requests.get('https://api.github.com/events')
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.options('http://httpbin.org/get')

其中 r 为Response对象。

HTTP请求方法介绍

GET: GET请求会显示请求指定的资源。一般来说GET方法应该只用于数据的读取,而不应当用于会产生副作用的非幂等的操作中。GET会方法请求指定的页面信息,并返回响应主体,GET被认为是不安全的方法,因为GET方法会被网络蜘蛛等任意的访问。

HEAD:HEAD方法与GET方法一样,都是向服务器发出指定资源的请求。但是,服务器在响应HEAD请求时不会回传资源的内容部分,即:响应主体。这样,我们可以不传输全部内容的情况下,就可以获取服务器的响应头信息。HEAD方法常被用于客户端查看服务器的性能。

POST:POST请求会 向指定资源提交数据,请求服务器进行处理,如:表单数据提交、文件上传等,请求数据会被包含在请求体中。POST方法是非幂等的方法,因为这个请求可能会创建新的资源或/和修改现有资源。

PUT:PUT请求会身向指定资源位置上传其最新内容,PUT方法是幂等的方法。通过该方法客户端可以将指定资源的最新数据传送给服务器取代指定的资源的内容。

DELETE:DELETE请求用于请求服务器删除所请求URI(统一资源标识符,Uniform Resource Identifier)所标识的资源。DELETE请求后指定资源会被删除,DELETE方法也是幂等的。

OPTIONS:OPTIONS请求与HEAD类似,一般也是用于客户端查看服务器的性能。 这个方法会请求服务器返回该资源所支持的所有HTTP请求方法,该方法会用’*'来代替资源名称,向服务器发送OPTIONS请求,可以测试服务器功能是否正常。JavaScript的XMLHttpRequest对象进行CORS跨域资源共享时,就是使用OPTIONS方法发送嗅探请求,以判断是否有对指定资源的访问权限。 允许允许客户端查看服务器的性能。

传递URL参数

requests库使用键值对即字典的形式进行传参

形如:

1
2
payload = {'key1': 'value1', 'key2': 'value2'}
r = requests.get("http://httpbin.org/get", params=payload)

我们可以通过打印 r.url来看到我们请求的url格式,打印上面的url我们预期将会得到

http://httpbin.org/get?key2=value2&key1=value1

定制请求头

很多网站都有一些基本的反爬虫的东西,所以我们需要设置请求头使得我们的爬虫更像正常的访问。

我们通过打开谷歌浏览器的开发者工具,在network > Headers 里面可以找到一个 'User-Agent:'的东西,这个就是我们的请求头。

我们只需要将这个参数以字典的形式传入即可设置请求头

1
2
3
4
url = 'https://api.github.com/some/endpoint'
header = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 '
'(KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36'}
r = requests.get(url, headers=headers)

设置代理

当一个ip地址高频度的访问一个网站时,会给服务器造成很大的压力,所以许多的网站都对于有这样行为的ip进行了封禁处理,禁止其在一段时间内访问本网站。

所以为了避免我们的ip被封掉,我们可以采取有节制的爬取和设置代理ip的方式,网上也有很多免费的代理ip网站,我一般用的都是西刺免费代理:https://www.xicidaili.com/,不过在19年初去看的时候,好像这个网站已经停止更新了,所以免费的代理似乎已经要没了,需要付费了。

代码设置方式

1
2
proxy = {'http': '218.14.115.211:3128'}
r = requests.get(url, proxies=proxy)