Python笔记:网络爬虫中常用库的对比使用

爬虫常用的库

常用的库

  • urllib 库 在python3中自带,但有很多不方便操作的地方:处理网页验证 、Cookies, Header头信息处理等
  • urllib3库 需要安装 $pip3 install urllib3 网址:https://pypi.org/project/urllib3/
  • requests 库 安装 $pip3 install requests 网址:http://2.python-requests.org/en/master/
  • 因此, 实际开发中经常用 urllib3requests 库进行开发,而很少会去选择使用Python自带的 urllib

urllib的应用 (GET方式)

#coding=utf-8
from urllib import request, error
import re
import ssl

context = ssl._create_unverified_context() # 使用ssl创建未经验证的上下文
url = 'http://bj.58.com/job/?key=python&final=1&jump=1'
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36'}
req = request.Request(url, headers=headers) # 封装请求对象

try:
    res = request.urlopen(req, context=context) # 在urlopen中传入上下文参数
    html = res.read().decode('utf-8')
    print(len(html))
    pat = '<span class="address">(.*?)</span>  \| <span class="name">(.*?)</span>'
    dlist = re.findall(pat, html)
    for v in dlist:
        print(v[0] + ' : ' + v[1])

# HTTPError 要在 URLError 之后
except Exception as e:
    if hasattr(e, "code"):
        print("HTTPError")
        print(e.reason)
        print(e.code)
    elif hasattr(e, "reason"):
        print("URLError")
        print(e.reason)

urllib的应用 (POST方式)

from urllib import request, parse
import json # 用于处理json数据的库
import ssl

context = ssl._create_unverified_context() # 使用ssl创建未经验证的上下文

url = 'https://fanyi.baidu.com/sug';
data = {'kw':'python'}
data = parse.urlencode(data) # 对请求数据进行编码

# 设置header头信息
headers = {
    'Content-Length': len(data),
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36',
    'Content-Type': "application/x-www-form-urlencoded; charset=UTF-8"
}

# 发送请求,爬取信息,使用 bytes函数将数据转换成二进制
req = request.Request(url, data=bytes(data, encoding="utf-8"), headers=headers)
res = request.urlopen(req, context=context)

# 解析结果
str_json = res.read().decode('utf-8') # 此处是字符串

# print(str_json)

myjson = json.loads(str_json) # 通过loads函数转换成字典
print(myjson['data'][0]['v']) # n. 蟒; 蚺蛇;

urllib3 的简单使用举例

import urllib3
import re

url = 'http://www.baidu.com' # 必须有协议名,完整访问路径
http = urllib3.PoolManager() # 创建一个池管理对象
res = http.request('GET', url) # 获取一个response对象
print('status: %d' % res.status) # status: 200
data = res.data.decode("utf-8") # 对数据进行编码
print(re.findall("<title>(.*?)</title>", data)) # ['百度一下,你就知道']

requests 的简单使用举例

import requests
import re

url = 'http://www.baidu.com' # 必须有协议名,完整访问路径
res = requests.get(url) # 获取response对象
print('status: %d' % res.status_code) # status: 200

# 有三种方式获取数据:
# res.text 以文本方式
# res.json()
# res.content
data = res.content.decode("utf-8")
print(re.findall("<title>(.*?)</title>", data)) # ['百度一下,你就知道']

requests 的复杂使用举例 (GET方式, 参数分离写法)

#coding=utf-8
import requests
import re
import ssl

context = ssl._create_unverified_context() # 使用ssl创建未经验证的上下文
url = 'http://bj.58.com/job/'
data = {'key':'python', 'final':1, 'jump': 1} # GET请求的参数
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36'}

try:
    res = requests.get(url, headers=headers, params=data) # 封装请求对象
    html = res.content.decode("utf-8")
    print(len(html))
    pat = '<span class="address">(.*?)</span>  \| <span class="name">(.*?)</span>'
    dlist = re.findall(pat, html)
    for v in dlist:
        print(v[0] + ' : ' + v[1])

# HTTPError 要在 URLError 之后
except Exception as e:
    if hasattr(e, "code"):
        print("HTTPError")
        print(e.reason)
        print(e.code)
    elif hasattr(e, "reason"):
        print("URLError")
        print(e.reason)

requests 的复杂使用举例 (POST方式)

import requests
import json

def fanyi(kw):
    url = 'https://fanyi.baidu.com/sug';
    data = {'kw': kw}
    # 设置header头信息 头信息可以不加
    headers = {
        'Content-Length': len(data),
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36',
        'Content-Type': "application/x-www-form-urlencoded; charset=UTF-8"
    }
    # 发送请求,爬取信息
    res = requests.post(url, data = data)
    # 解析结果
    str_json = res.content.decode('utf-8')
    # print(str_json)
    myjson = json.loads(str_json)
    print(myjson['data'][0]['v']) # n. 蟒; 蚺蛇;

if __name__ == '__main__':
    while True:
        kw = input('请输入要翻译的词:')
        if kw == 'q':
            break
        fanyi(kw)

发布了370 篇原创文章 · 获赞 169 · 访问量 66万+

猜你喜欢

转载自blog.csdn.net/Tyro_java/article/details/102890194