urllib库基础入门

简介

目前获取请求的爬取工具-requests模块绝对是独占鳌头,但是urllib库作为python的内置模块,实力也不容小觑,在爬虫项目中,urllib还是时常会被用到,因此许多爬虫课也将urllib作为入门学习的前期课程。

目录

一、urllib库常见内置函数及其使用

1.urllib.request.urlretrieve
2.urllib.request.urlopen
3.urllib.request.Request
4.urllib.parse.urlencode
5.urllib.parse.quote

二、示例、使用urllib爬取有道词典

1.urllib.request.urlretrieve

利用python保存文件通常使用 with open方法实例如下

import requests
url  = "https://ss0.bdstatic.com/94oJfD_bAAcT8t7mm9GUKT-xh_/timg?image&quality=100&size=b4000_4000&sec=1594889913&di=694bce89b72880aa039b2b0f72cd973b&src=http://img.mp.sohu.com/upload/20180706/0e4d0accd1874ac09f84071c6013d1f9_th.jpg"
res = requests.get(url)
with open("jame.png",'wb') as f:
    f.write(res.content)
    f.close()

使用urllib内置函数即可实现实例

import urllib.request
url  = "https://ss0.bdstatic.com/94oJfD_bAAcT8t7mm9GUKT-xh_/timg?image&quality=100&size=b4000_4000&sec=1594889913&di=694bce89b72880aa039b2b0f72cd973b&src=http://img.mp.sohu.com/upload/20180706/0e4d0accd1874ac09f84071c6013d1f9_th.jpg"
f = urllib.request.urlretrieve(url,'james.png')
print(f)

2.urllib.request.urlopen

使用urllib.request.urlopen可以向网页发送一个请求,并获取响应但存在弊端当遇到反爬虫机制时无法得到响应,后面会继续讲解遇到反爬虫机制的种种办法,现在为大家提供一个实例,访问百度页面

import urllib.request
#url = "http://www.youdao.com/"
#使用 urllib.request.urlopen向网站发出一个请求并且得到一个响应
#f = urllib.request.urlopen(url)
# read表示读取响应得到的数据
#print(f.read())
#当返回的response是一个字节的时候需要使用decode进行解码解为字符串
#print(f.read().decode("utf-8"))

3.urllib.request.Request()

http请求分为get和post请求,当遇到post请求时,需要在urllib.request.Request()中加入data参数。
当遇到反爬虫机制,使用urllib库访问可以通过以下几步

1.使用urllib.request.Request()创建一个请求对象
2.再将请求对象放入urllib.request.urlopen()得到一个响应
3.读取响应对象
实例:

#1.创建请求对象
response = urllib.request.Request(url,headers=headers)
#2,响应请求对象
f = urllib.request.urlopen(response)
#3.读取对象
HTML=f.read().decode('utf-8')

4. urllib.parse.urlencode

由于urllib不能识别汉字所以使用urllib.parse.urlencode将数据编码成十六机制的数据,urllib.parse.urlencode只能传入字典格式

import urllib.request
import urllib.parse
baseurl = 'https://www.baidu.com/s?'
content = {'wd':'姑娘'}
content = urllib.parse.urlencode(content)
url = baseurl+content
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.129 Safari/537.36'}
reponse = urllib.request.Request(url,headers=headers)
r = urllib.request.urlopen(reponse)
print(r.read().decode('utf-8'))
此代码是最终将url拼接,将搜索的关键字的网页源代码爬取下来

5.urllib.parse.quote()

与urllib.parse.urlencode相同的是都将数据进行编码,有一点不同的是这个方法传入的是字符串 urllib.parse.urlencode传入的是字典

import urllib.parse
baseurl = 'https://www.baidu.com/s?wd='
r = input("请输入")
r=urllib.parse.quote(r)
url = baseurl+r
print(url)

爬取有道字典

import urllib.parse
import urllib.request
import json
headers = {'User-Agent':"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.129 Safari/537.36"}
key = input("请输入要搜索的")
data = {'i': key,
'from': 'AUTO',
'to': 'AUTO',
'smartresult': 'dict',
'client': 'fanyideskweb',
'salt': '15948025094162',
'sign': 'a8f98f153579d4dc7e15efbbed8a5272',
'ts': '1594802509416',
'bv': 'b286f0a34340b928819a6f64492585e8',
'doctype': 'json',
'version': 2.1,
'keyfrom': 'fanyi.web',
'action': 'FY_BY_REALTlME'}
url = "http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule"
data = urllib.parse.urlencode(data)
#将数据转化为字节流模式
data = bytes(data,'utf-8')
req = urllib.request.Request(url,data=data,headers=headers)
res =urllib.request.urlopen(req)
html = res.read().decode('utf-8')
#将json类型的数据转化为字典
dict = json.loads(html)
a = dict['translateResult'][0][0]['tgt']
print(a)

其中json类型的数据是通过loads方法将json转化为字典
由于urllib.request只能接受字节流所以要将data转化为字节流格式

你可能感兴趣的:(python)