您的位置:首页 > 编程语言 > Python开发

python学习笔记——爬虫学习中的重要库urllib

2018-05-23 00:06 507 查看

1 urllib概述

1.1 urllib库中的模块类型

urllib是python内置的http请求库

其提供了如下功能:

(1)error 异常处理模块

(2)parse url解析模块

(3)request 请求模块

(4)robotparser robots.txt解析模块

1.2 模块的引用方式

以下应用引用urllib库中的模块时均以 parse模块 为例

(1)引用方式一(正确)

import urllib
from urllib import parse


(2)引用方式二(正确)

import urllib.parse, urllib.request


该方法使用时必须写全,例如:urllib.parse.urlopen()

(3)引用方式三(正确)

from urllib import parse, request


(4)引用方式四(错误)

import urllib

data = bytes(urllib.parse.urlencode(formdata), encoding="utf-8")


注:

(1)urllib尽管是库,但是其Package contents均为诸如parse、request等模块,所以不能将模块当成函数直接使用

(2)urllib可以理解成命名空间,为了优化导入,import urllib时不导入其他模块,因这样不会消耗处理器周期和内存,urllib库中的其他单个模块再使用时需再分别导入

(3)引用方式一使用时urllib.request.Request不报错,而引用方式三会报错(urllib 不存在),此时修改为request.Request即可

参考:AttributeError: module 'urllib' has no attribute 'parse'

2 URL Parsing

URL解析功能主要是将URL字符串分割成各个构成要素,或者将URL构成要素组合成URL字符串。

详细可以参考

python爬虫从入门到放弃(三)之 Urllib库的基本使用

官方文档:21.8.
urllib.parse
— Parse URLs into components


3 有道字典具体实例

import urllib
from urllib import parse, request

# import urllib.parse, urllib.request
import json
import re

key = input("请输入您要查询的英文单词:")

url = "http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom=null"
headers = {
"User-Agent":"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36",
"X-Requested-With":"XMLHttpRequest",
"Accept":"application/json, text/javascript, */*; q=0.01"
}

formdata = {
"i":key,
"from":"AUTO",
"to":"AUTO",
"smartresult":"dict",
"client":"fanyideskweb",
"salt":"1526193679443",
"sign":"ad84e0e993177327436974d720731288",
"doctype":"json",
"version":"2.1",
"keyfrom":"fanyi.web",
"action":"FY_BY_REALTIME",
"typoResult":"false"
}

data = bytes(urllib.parse.urlencode(formdata), encoding="utf-8")
req = urllib.request.Request(url,data,headers,method="POST")
response = urllib.request.urlopen(req)

info = response.read().decode("utf-8")
#print(info)

jsonLoads = json.loads(info) # json str -> dict decode
#print(jsonLoads["translateResult"][0][0]["tgt"])

pattern = re.compile('"tgt":([\s\S]*?)}')
infoResult = re.findall(pattern,info)
for i in infoResult:
i = i.replace('"','')
print(i)

#{"type":"EN2ZH_CN","errorCode":0,"elapsedTime":1,"translateResult":[[{"src":"hello","tgt":"你好"}]]


4 urlopen

4.1 语法

urlopen(url, data=None, timeout=<object object at 0x03C989A8>, *, cafile=None, capath=None, cadefault=False, context=None)


功能:打开URL

参数:

url:可以是字符串也可以是请求对象

data:该数据为指定发送给服务器的附加数据对象,默认为缺省,缺省则表示get方式请求

timeout:超时链接设置,秒为计量单位,可缺省

返回的方法有:

(1)read() , readline() ,readlines() , fileno() , close() :这些方法的使用方式与文件对象完全一样

(2)info():返回一个httplib.HTTPMessage对象,表示远程服务器返回的头信息

(3)getcode():返回Http状态码。如果是http请求,200请求成功完成;404网址未找到

(4)geturl():返回请求的url

一般而言,urlopen函数常用有三个参数:

urllib.requeset.urlopen(url,data,timeout)

4.2 实例

示例一:(常规请求打开URL)

import urllib.request

response = urllib.request.urlopen('http://www.baidu.com')
print(response.read().decode('utf-8'))


运行

b'word=hello'
b'{"args":{},"data":"","files":{},"form":{"word":"hello"},"headers":{"Accept-Encoding":"identity","Connection":"close","Content-Length":"10","Content-Type":"application/x-www-form-urlencoded","Host":"httpbin.org","User-Agent":"Python-urllib/3.6"},"json":null,"origin":"115.231.11.215","url":"http://httpbin.org/post"}\n'


View Code
备注:

(1)bytes('string',encoding='编码类型') #利用内置bytes方法,将字符串转换为指定编码的bytes

(2)利用urllib库中parse模块中的urlencode()函数,也即利用bytes(urllib.parse.urlencode())将post数据转换成urllib.request.urlopen中所需的data参数,这样就完成了一次post请求

(3)当urllib.request.urlopen()函数中有data的设定值时则表示采用post方式请求

(4)http://httpbin.org/post可以作为网站演示(该网站可以作为练习使用urllib的一个站点使用,可以模拟各种请求操作)

示例三:timeout参数

timeout主要是防止程序持续请求链接,当网络较差或服务器异常时则在超过timeout时间后直接爆出异常

import urllib.request

response = urllib.request.urlopen('http://www.baidu.com', timeout=0.01)
print(response.read().decode('utf-8'))


运行



直接出现urlopen error timed out异常,实际上,将timeout = 1,则能够正常执行。

5 urlencode

5.1 基本语法

urlencode(query, doseq=False, safe='', encoding=None, errors=None, quote_via=<function quote_plus at 0x0584E6F0>)


功能:将字典或者两个元组编码成URL查询字符串

参数:

query:查询参数,可以是字符串类型,也可以是字节类型

其他:其他参数不太重要

5.2 使用示例

from urllib.parse import urlencode

params = {
"wd":"中国",
"ie":"UTF-8",
}
base_url = "http://www.baidu.com/s?"

url = base_url+urlencode(params)
print(url) #http://www.baidu.com/s?wd=%E4%B8%AD%E5%9B%BD&ie=UTF-8


6 Request 对象

很多网站为了防止程序爬虫访问网站而致使的网站瘫痪,网站进行了反爬程序设置。

在编写爬虫程序时,需要对访问过程进行伪装,也即,爬虫程序中需要携带一些headers头部信息进行伪装访问,最常见的有user-agent参数

class Request(builtins.object)

Methods defined here(Initialize self):

__init__(self, url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None)


下面是一个简单没有进行伪装的请求

import urllib.request

request = urllib.request.Request('https://www.baidu.com')
response = urllib.request.urlopen(request)
print(response.read().decode('utf-8'))


下面是添加头部信息进行伪装

from urllib import request, parse

url = 'http://httpbin.org/post'
headers = {
'User-Agent': 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)',
'Host': 'httpbin.org'
}
dict = {
'name': 'zhaofan'
}
data = bytes(parse.urlencode(dict), encoding='utf8')
req = request.Request(url=url, data=data, headers=headers, method='POST')
response = request.urlopen(req)
print(response.read().decode('utf-8'))


运行(以下格式是便于看整理的,实际打印出来是一行)

{"args": {}, "data": "", "files": {}, "form": {"name": "zhaofan"},
"headers": {"Accept-Encoding": "identity", "Connection": "close",
"Content-Length": "12",
"Content-Type": "application/x-www-form-urlencoded",
"Host": "httpbin.org",
"User-Agent": "Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)"},
"json": null, "origin": "183.240.196.58",
"url": "http://httpbin.org/post"
}


另外还可以将其进行优化,示例如下:

from urllib import request, parse

url = 'http://httpbin.org/post'
dict = {
'name': 'Germey'
}
data = bytes(parse.urlencode(dict), encoding='utf8')
req = request.Request(url=url, data=data, method='POST')
req.add_header('User-Agent', 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)')
response = request.urlopen(req)
print(response.read().decode('utf-8'))


这种方式可以自己定义请求头字典,可以循环添加。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: