欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Python使用urllib,urllib3,requests库爬取网页

程序员文章站 2022-05-03 20:04:39
...

笔者使用的是python 3.8.1

urllib

urllib提供了一系列用于操作URL的功能。
urllib的request模块可以非常方便地抓取URL内容,也就是发送一个GET请求到指定的页面,然后返回HTTP的响应。

使用pip下载:

pip install urllib

例如对百度搜索界面的抓取(www.baidu.com)

#!/usr/bin/python
# -*- coding: UTF-8 -*-
import urllib
from urllib import request
if __name__ == "__main__":
	headers = {
            'Connection': 'Keep-Alive',
            'Accept': 'text/html, application/xhtml+xml, */*',
            'Accept-Language': 'en-US,en;q=0.8,zh-Hans-CN;q=0.5,zh-Hans;q=0.3',
            'Accept-Encoding': 'gzip, deflate',
            'User-Agent': 'Mozilla/6.1 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko',
            'Host': 'www.so.com',
            'Referer': 'https://www.so.com'
        }
    respond = urllib.request.urlopen('http://www.baidu.com', headers=headers)
    print(respond.read().decode('utf-8'))

参考网站:
廖雪峰的官方网站

urllib3

urllib3是一个功能强大且友好的Python HTTP客户端。大多数Python生态系统已经使用urllib3,您也应该使用。urllib3带来了Python标准库中缺少的许多关键功能:

线程安全。
连接池。
客户端SSL / TLS验证。
使用分段编码上传文件。
重试请求和处理HTTP重定向的助手。
支持gzip,deflate和brotli编码。
HTTP和SOCKS的代理支持。
100%的测试覆盖率。
urllib3功能强大且易于使用:
下载:

pip install urllib3

例如抓取百度搜索界面(www.baidu.com)

#!/usr/bin/python
# -*- coding: UTF-8 -*-
import urllib3

if __name__ == "__main__":
    http = urllib3.PoolManager()
    headers = {
        'Connection': 'Keep-Alive',
        'Accept': 'text/html, application/xhtml+xml, */*',
        'Accept-Language': 'en-US,en;q=0.8,zh-Hans-CN;q=0.5,zh-Hans;q=0.3',
        'Accept-Encoding': 'gzip, deflate',
        'User-Agent': 'Mozilla/6.1 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko'
    }
    r=http.request('GET', 'http://www.baidu.com', headers=headers)
    print(r.data)

requests

我们已经讲解了Python内置的urllib模块和其升级版urllib3,用于访问网络资源。但是,它用起来比较麻烦,而且,缺少很多实用的高级功能。

更好的方案是使用requests。它是一个Python第三方库,处理URL资源特别方便。
下载:

pip install requests

注意有 srequests

例如抓取360搜索结果:

# -*- coding: utf-8 -*-
import requests

if __name__ == '__main__':
    keyword = "123sad"
    keyword = input("请输入你想搜索的内容")
    try:
		#添加headers防止被最简单的反爬虫阻止,在chrome按F12后点击Network中一个下滑查看
        headers = {
            'Connection': 'Keep-Alive',
            'Accept': 'text/html, application/xhtml+xml, */*',
            'Accept-Language': 'en-US,en;q=0.8,zh-Hans-CN;q=0.5,zh-Hans;q=0.3',
            'Accept-Encoding': 'gzip, deflate',
            'User-Agent': 'Mozilla/6.1 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko',
            'Host': 'www.so.com',
            'Referer': 'https://www.so.com'
        }
        page = 1
        #GET参数列表
        kv = {'q': keyword, 'ie': 'utf-8', 'pn': page}

        # requests.ReadTimeout(60)
        r = requests.get("http://www.so.com/s", headers=headers,
                         params=kv)
        print('url:'+r.request.url)
        r.raise_for_status()
        html = r.text
        print(html)
    except requests.HTTPError as a:
        print(a)
        print("爬取失败")
    except:
        print('失败')

参考网站:廖雪峰的官方网站

笔者遇到的问题

1.结果不全

笔者在vs code 中执行时,结果显示不全
如果结果显示不全,需要在cmd中执行文件

python xxx.py

2.‘抓取失败’

显示该问题,一般是因为IP被屏蔽
目前很多搜索引擎都装备了反爬虫,这个时候需要重启路由器(重新拨号)或者挂代理(proxy),或者试一试别的搜索引擎,笔者抓取百度时频繁出现错误,只能抓取360搜索

3.返回乱码

对返回结果解码

html.decode('utf-8')

进阶

urllib

parse

使用parse模块拼接参数:

params = {'ie': 'utf-8', 'wd': 'python是这个世界上最好的语言'}
url = 'www.baidu.com/s?'+urllib.parse.urlencode(params)
print(url)

结果:

www.baidu.com/s?ie=utf-8&wd=python%E6%98%AF%E8%BF%99%E4%B8%AA%E4%B8%96%E7%95%8C%E4%B8%8A%E6%9C%80%E5%A5%BD%E7%9A%84%E8%AF%AD%E8%A8%80

error

在urllib中设置了两个主要异常类,一个是URLError,一个是HTTPError

try:
...
except urllib.error.HTTPError as e:
    print(e.code)#错误码
    print(e.reason)#错误的原因
    pring(e.headers)#响应的报头
except urllib.error.URLError as e:
    print(e)

re库

re库是用来分析网页返回结果的正则库
安装:

pip install re

正则:

import re
pattern = re.compile(
            r'<li class="res-list" data-lazyload="1"><h3 class="res-title "><a href="(.*?)"', re.S)
        results = pattern.findall(html)

其中,re.compile是创建正则式,findall是在文本中匹配全部,并返回数组格式的数据
有关正则表达式写法和更多数据请看官方文档

笔者推荐使用requests库

END
相关标签: python