Python实现urllib3和requests库使用 | python爬虫实战之五

 阿里云安全     |      2020-04-07 00:00:00

python爬虫AJAX数据爬取和HTTPS访问 | python爬虫实战之四

urllib3库

https://urllib3.readthedocs.io/en/latest/
标准库urllib缺少了一些关键的功能, 非标准库的第三方库urllib3提供了, 比如说连接池管理。

安装

$ pip install urllib3

之后,我们来借用之前的json数据来看一下:

import urllib3
from urllib.parse import urlencode
from urllib3.response import HTTPResponse

jurl = 'https://movie.douban.com/j/search_subjects'

d = {
    'type':'movie',
    'tag':'热门',
    'page_limit':10,
    'page_start':10
}

with urllib3.PoolManager as http:
  #  http.urlopen()
     response = http.request('GET', '{}?{}'.format(jurl, urlencode(d)), headers={
    'User-agent': "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36"
    })
    print(type(response))
    # response:HTTPResponse = HTTPResponse()
    print(response.status)
    print(response.data)

执行结果:

image.png

image.png

这个封装的属性和方法还是比较原始的,我们对于这样的使用肯定是不行的,那我们需要用什么呢?接着来讲requests库。

requests库

requests使用了urllib3, 但是API更加友好, 推荐使用。
需要先安装,跟之前一样。
安装:

$ pip install requests

我们对上面的例子做出修改:

import urllib3
from urllib.parse import urlencode
from urllib3.response import HTTPResponse

import requests

jurl = 'https://movie.douban.com/j/search_subjects'

d = {
    'type':'movie',
    'tag':'热门',
    'page_limit':10,
    'page_start':10
}


url = '{}?{}'.format(jurl, urlencode(d))

response = requests.request('GET', url, headers = {
    'User-agent': "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36"
})


with response:
    print(response.text)
    print(response.status_code)
    print(response.url)
    print(response.headers)
    print(response.request)

执行结果:

image.png

我们具体来看一下request:

    print(response.headers, '~~~~~')
    print(response.request.headers)

上面的headers是response的,下面的是请求的headers
执行结果:

image.png

里面还有别的参数,大家可以去尝试一下。

image.png

requests默认使用Session对象, 是为了在多次和服务器端交互中保留会话的信息, 例如cookie。

直接使用Session:

image.png
image.png

我们也来尝试去打印一下这些信息:

import requests

urls = ['https://www.baidu.com/s?wd=magedu', 'https://www.baidu.com/s?wd=magedu']
session = request.session()
with session:
    for url in urls:
        response = session.get(url, headers = {
        'User-agent': "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36"
        })
    
        with response:
            print(response.text[:50])
            print('-'*30)
            print(response.cookies)
            print('-'*30)
            print(response.headers, '~~~~~')
            print(response.request.headers)

执行结果:

image.png
image.png
image.png

通过结果可以看出,Session对象对cookie起了作用。观察第一次返回的cookie与第二次发起请求的response.request.headers的cookie。返回的结果依然是键值对,只是之中value的值依然是用键值对来表示的。

配套视频课程,点击这里查看

获取更多资源请订阅Python学习站