爬虫基础:urllib库

Posted asia9847

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了爬虫基础:urllib库相关的知识,希望对你有一定的参考价值。

urllib库

urllib库是python中的一个基本网络请求库。用于模拟浏览器的行为,向指定服务器发送请求,并接收返回的数据。

在python3中所有的网络请求相关函数都集中在urllib.request模块下面

urlopen函数

向服务器发起请求

urlopen函数的参数

  1. url 目标地址
  2. data 如果有这个参数,将变为post请求
  3. 返回值 http.client.HTTPResponse对象,其中含有下面几个方法:
    • read(size) size为空则读取所有
    • readline() 读取一行
    • readlines() 读取多行
    • getcode() 读取状态值
      基本的使用:
    from urllib import request
    res = request.urlopen("http://www.baidu.com")
    print(res.read())

urlretrieve函数

这个函数可以方便的将网页的一个文件保存到本地。

urlretrieve函数的参数

  1. url 目标地址
  2. 下载路径
    基本使用
from urllib import request
request.urlretrieve("http://www.baidu.com","index.html") #下载百度首页到index.html

urlencode函数

用于完成url中中文以及特殊字符的编码和解码

基本使用:

from urllib import parse
params = 
    "name": "张三",
    "age": 14,
    "地址": "上海市海河大道1544弄3号楼302"

res = parse.urlencode(params)
print(res)

执行结果:
age=14&name=%E5%BC%A0%E4%B8%89&%E5%9C%B0%E5%9D%80=%E4%B8%8A%E6%B5%B7%E5%B8%82%E6%B5%B7%E6%B2%B3%E5%A4%A7%E9%81%931544%E5%BC%843%E5%8F%B7%E6%A5%BC302

在百度上搜索刘德华

from urllib import request
from urllib import parse

# request.urlopen("http://www.baidu.com/s/?wd=刘德华") #直接这样请求会报错
url = "http://www.baidu.com/s/?"
# 定义参数字典
params = 
    "wd": "刘德华"

# 参数转码
qs = parse.urlencode(params)
# url拼接
url += qs
# 发送请求
res = request.urlopen(url)
print(res.read())

parse_qs函数

将已经编码的url进行解码
基本使用

from urllib import parse
qs = "age=14&name=%E5%BC%A0%E4%B8%89&%E5%9C%B0%E5%9D%80=%E4%B8%8A%E6%B5%B7%E5%B8%82%E6%B5%B7%E6%B2%B3%E5%A4%A7%E9%81%931544%E5%BC%843%E5%8F%B7%E6%A5%BC302"  
res = parse.parse_qs(qs)
print(res)

执行结果
‘name‘: [‘张三‘], ‘age‘: [‘14‘], ‘地址‘: [‘上海市海河大道1544弄3号楼302‘]

urlparse 和 urlsplit函数

用于将url各个部分进行分割

基本使用

from urllib import parse
url = "http://www.baidu.com/s/?wd=python"

res = parse.urlsplit(url)
print(res)
res = parse.urlparse(url)
print(res)

执行结果:
SplitResult(scheme=‘http‘, netloc=‘www.baidu.com‘, path=‘/s/‘, query=‘wd=python‘, fragment=‘‘)
ParseResult(scheme=‘http‘, netloc=‘www.baidu.com‘, path=‘/s/‘, params=‘‘, query=‘wd=python‘, fragment=‘‘)

可以发现两个结果基本相同,唯一不同的是urlsplit()函数返回结果没有params属性

request.Request类

如果需要在请求中添加header信息,则必须用request.Request类实现
基本使用:

# 通过构造请求头 获取拉勾网的招聘信息
from urllib import request
from urllib import parse
url = "https://www.lagou.com/jobs/positionAjax.json?needAddtionalResult=false"

headers = 
    'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36',
    'Referer': 'https://www.lagou.com/jobs/list_python?labelWords=&fromSearch=true&suginput=',
    "Cookie": "_ga=GA1.2.620765502.1560083999; _gid=GA1.2.758158058.1560083999; user_trace_token=20190609203959-b18d608c-8ab3-11e9-a228-5254005c3644; LGUID=20190609203959-b18d64d3-8ab3-11e9-a228-5254005c3644; index_location_city=%E5%85%A8%E5%9B%BD; JSESSIONID=ABAAABAAAIAACBI2C1935D6770E19BC5BE4390354414026; X_HTTP_TOKEN=b6c2ab256a325419948821065120ec66a55a5e4b49; _gat=1; LGSID=20190610090729-1e5547bf-8b1c-11e9-a22c-5254005c3644; PRE_UTM=; PRE_HOST=; PRE_SITE=; PRE_LAND=https%3A%2F%2Fwww.lagou.com%2F; LGRID=20190610090729-1e5549e6-8b1c-11e9-a22c-5254005c3644; Hm_lvt_4233e74dff0ae5bd0a3d81c6ccf756e6=1560084000,1560090525,1560128850; Hm_lpvt_4233e74dff0ae5bd0a3d81c6ccf756e6=1560128850; TG-TRACK-CODE=index_search; SEARCH_ID=60cd24c737344a6f98c48dd4fc94c39c"


data = 
    "first": "true",
    "pn": 1,
    "kd": "python"



req = request.Request(url, headers=headers, data=(
    parse.urlencode(data)).encode("utf-8"), method="POST")
resp = request.urlopen(req)
print(resp.read().decode("utf-8"))

以上是关于爬虫基础:urllib库的主要内容,如果未能解决你的问题,请参考以下文章

python爬虫基础02-urllib库

爬虫基础:urllib库

Python爬虫基础

用python零基础写爬虫--编写第一个网络爬虫

python爬虫基础03-requests库

urllib库爬虫技术从0开学习