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'))
这种方式可以自己定义请求头字典,可以循环添加。
相关文章推荐
- Python学习笔记之简单爬虫
- 【极客学院】-python学习笔记-4-单线程爬虫 (提交表单抓取信息,实战练习)
- ”Python开发简单爬虫“慕课网课程学习笔记1
- python爬虫:使用Mongodb数据库存储数据学习笔记
- python 爬虫学习笔记1
- Python爬虫框架Scrapy 学习笔记 5 ------- 使用pipelines过滤敏感词
- Python爬虫学习笔记Day3
- Python爬虫学习笔记之基础知识
- Python学习笔记55 爬虫(隐藏)
- python爬虫学习笔记3:bs4及BeautifulSoup库学习
- Python爬虫框架Scrapy 学习笔记 1 ----- 环境搭建
- 【python学习笔记】14:开发一个简易的爬虫
- ”Python开发简单爬虫“慕课网课程学习笔记1
- Python学习笔记-Dictionary 【python 3】//为继续学习爬虫准备-00
- Python爬虫学习纪要(六):Requests 库学习笔记1
- Python爬虫学习纪要(十):Requests 库学习笔记5
- Python爬虫框架Scrapy 学习笔记 10.2 -------【实战】 抓取天猫某网店所有宝贝详情
- python学习笔记-(18)python中的动态类型(相当重要)
- Python开发简单爬虫--学习笔记
- Python爬虫框架Scrapy 学习笔记 8----Spider