爬虫是通过URL地址定位与下载网页,这两项是网络爬虫的关键功能,Python中实现网络请求常用以下三种方式:urlib、urlib3和requests。
    (1)urllib模块
    urlib是Python的内置模块,该模块提供了一个urlopen()方法,通过该方法指定URL发送网络请求来获取数据。urllib包含几个子模块来处理请求。分别是:
    urllib.request 发送http请求,定义了打开URL的方法和类。
    urllib.error 处理请求过程中,出现的异常,基本的异常类是URLError。
    urllib.parse 解析和引用URL
    urllib.robotparser 解析robots.txt文件

    1. import urllib.request # 导入模块
    2. # 打开指定的需要爬取的网页
    3. file = urllib.request.urlopen('http://www.baidu.com')
    4. data = file.read() # 读取网页全部内容
    5. print(data)
    6. data_line = file.readline() # 读取一行内容
    7. print(data_line) # 输出一行内容
    8. fhandle = open("./test.html", "wb") # 将爬取的网页保存在本地
    9. fhandle.write(data)
    10. fhandle.close()

    此时test.html中为抓取的百度首页的内容

    Urllib3是一个功能强大,条理清晰,用于HTTP客户端的Python库,许多Python的原生系统已经开始使用urllib3。Urllib3提供了很多python标准库里所没有的重要特性。包括:线程安全、连接池、客户端SSL/TLS验证、文件分部编码上传、协助处理重复请求和HTTP重定位、支持压缩编码、支持HTTP和SOCKS代理、100%测试覆盖率等。
    在使用urllib3模块之前,需要在Python中通过“pip install urllib3”命令进行模块的安装。

    1. import urllib3 # 导入模块
    2. # 创建PoolManager对象,用于处理与线程池的连接以及线程安全的所有细节
    3. http = urllib3.PoolManager()
    4. # 对需要爬取的网页发送请求
    5. response = http.request('GET', 'https://www.baidu.com')
    6. print(response.data) # 输出读取的内容

    Requests是用Python语言基于urllib编写的、比urllib更加方便使用的一个第三方模块,该模块在使用时比urllib更加简单,操作更人性化,可以节约我们大量的工作。Requests是Python实现的最简单易用的HTTP库,建议爬虫使用Requests库。默认安装好Python之后,是没有安装Requests模块的,需要单独通过pip安装后再使用。Requests模块具有以下特性:

    ● Keep-Alive & 连接池
    ● 国际化域名和 URL
    ● 带持久 Cookie 的会话
    ● 浏览器式的 SSL 认证
    ● 自动内容解码
    ● 基本/摘要式的身份认证
    ● 优雅的 key/value Cookie
    ● 自动解压
    ● Unicode 响应体
    ● HTTP(S) 代理支持
    ● 文件分块上传
    ● 流下载
    ● 连接超时
    ● 分块请求
    ● 支持 .netrc
    简单抓取网页可以使用 Requests 发送请求,例如以百度贴吧为例,通过向百度贴吧发起一个 HTTP 请求,可以获取到它页面的源代码。

    1. import requests
    2. # 使用 get 方式请求
    3. response = requests.get('https://tieba.baidu.com/')
    4. print(response.text)
    5. # 使用 post 方式请求
    6. response = requests.post('https://tieba.baidu.com/')
    7. print(response.text)

    在请求网页时,经常需要携带一些参数,Requests 提供了params关键字参数来满足需求。params 是一个字符串字典,其值可以为列表,只要将字典构建并赋给 params 即可。 requests 很人性化,会将需要传递的参数正确编码, 用户无须关心参数的编码问题。其具体用法如下:

    1. import requests
    2. url = 'http://httpbin.org/get'
    3. params = {'name': 'Numb', 'author': 'Linkin Park'}
    4. # params 支持列表作为值
    5. # params = {'name': 'Good Time', 'author': ['Owl City', 'Carly Rae Jepsen']}
    6. response = requests.get(url, params=params)
    7. print(response.url)
    8. print(response.text)

    在请求一个网页时,有时发现无论是GET还是POST请求方式,都会出现403错误。这种情况多数因服务器的网页中使用了反爬虫设置,防止恶意采集信息,拒绝了用户的访问。此时可以使用headers关键字参数将 Requests 发起的 HTTP 请求伪装成浏览器,从而解决反爬设置的问题。
    使用方法是通过火狐浏览器的按F12打开调试工具,然后切换到网络工具中,接着刷新下网页,以读取网络请求信息,左侧找到访问的网址,在右侧窗口中打到消息头,消息头就是header的中文意思,具体的数据信息在下方,包括响应头和请求头两种,一般我们是看请求头,一般为“User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:82.0) Gecko/20100101 Firefox/82.0”。具体内容与操作系统和浏览器相关。网络监视器查看头部信息,将头部信息复制并做为Requests参数headers的值。

    1. import requests
    2. url = 'https://tieba.baidu.com/'
    3. headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:82.0) Gecko/20100101 Firefox/82.0'} # 还可以设置其他字段。
    4. response = requests.get(url, headers=headers)
    5. print(response.url)
    6. print(response.text)

    有些网站做了浏览频率限制,如果请求该网站频率过高,该网站会封掉访问者的 IP,禁止访问。这种情况可以使用代理来突破这“枷锁”,用字典类型的proxies参数实现。

    1. import requests
    2. url = 'https://tieba.baidu.com/'
    3. proxies = {
    4. 'http':"web-proxy.oa.com:8080",
    5. 'https':"web-proxy.oa.com:8080"
    6. # 若你的代理需要使用HTTP Basic Auth,可以使用 http://user:password@host/ 语法:
    7. # "http": "http://user:pass@27.154.181.34:43353/"
    8. }
    9. response = requests.get(url, proxies=proxies)
    10. print(response.url)
    11. print(response.text)