爬虫框架urllib 之(三) --- urllib模块
urllib.request模块 方法
从urllib中导入请求模块 编写url
from urllib import request # 导入request模块
# 或者 import urllib.request
url = "http://www.baidu.com/" # 编写 url
1. urlopen( ) 方法
用于打开一个远程的url连接,并且向这个连接发出请求,获取响应结果。返回的结果是一个http响应对象,这个响应对象中记录了本次http访问的响应头和响应体
urllib.request.urlopen 参数介绍:urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)
- url参数使用
response = request.urlopen(url=url) print(response) # 获取响应,结果为:<http.client.HTTPResponse object at 0x10be801d0>
# 获取响应头
print(response.headers) # 获取响应头
print(response.url) # 获取响应url
print(response.status) # 获取响应状态码
# 获取响应体
print(response.read()) # 获取响应体 二进制字符串
print(response.read().decode("utf-8")) # 对响应体进行解码
# 按行读取
print(response.readline()) # 读取一行
print(response.readline()) # 读取下一行
print( response.readlines()) # 读取多行。得到一个列表 每个元素是一行
- data参数使用
上述例子是通过 get请求 获得百度,下面使用urllib的 post请求。添加data参数的时候就是以post请求方式请求,若没有data参数就是get请求方式
import urllib.request
import urllib.parse # urllib.parse模块,后面有介绍
#或者 from urllib import request, parse
data = bytes(urllib.parse.urlencode({'word': 'hello'}), encoding='utf8')
# 用urllib.parse模块,通过bytes(urllib.parse.urlencode())可以将post数据进行转换并放到urllib.request.urlopen的data参数中。这样就完成了一次post请求。 response = urllib.request.urlopen('http://httpbin.org/post', data=data)
print(response.read())
- timeout参数使用
在某些网络情况不好或者服务器端异常会出现请求慢或者请求异常等情况,所以这个时候需要给请求设置一个超时时间,而不是让程序一直在等待结果。使用timeout参数设置超时时间
import urllib.request response = urllib.request.urlopen('http://httpbin.org/get', timeout=1)
print(response.read()) # 正常结束,控制台显示:socket.time : timed out response = urllib.request.urlopen('http://httpbin.org/get', timeout=0.1)
print(response.read()) # 超时,控制台显示:urllib.error.URLErrot : <urlopen error timed out>
2. urlretrieve(url =”xxx“, filename = ”xxx“) 方法
打开url这个连接 并且发起请求,获得响应并把响应结果保存到filename文件中
res3 = request.urlretrieve(url=url,filename="./baidu.html")
print(res3) # 获取url 保存到baidu.html文件中 并打印
3. Request(url=url, data=data, method='POST') 方法
web开发中,同一个url往往可以对应若干套不同的数据(或者界面,如手机、电脑),后台可以根据发起请求的前端的用户代理的不同,
而决定应该给前端做出什么样的响应,如果检测到没有用户代理可以拒绝访问。有很多网站为了防止程序爬虫爬网站造成网站瘫痪,
会需要携带一些headers头部信息才能访问,最长见的有user-agent参数所以需要伪装请求头,去访问目标站。
urllib.ruquest.Request 参数介绍:urllib.ruquest.Request(url=url,headers=headers,data=data,method='POST')
- headers 参数使用
给请求添加头部信息,定制自己请求网站时的头部信息,使得请求伪装成浏览器等终端
req = request.Request(url=url,headers={'UserAgent':'Mozilla/5.0 (Windows NT 10.0; Win64;x64)AppleWebKit/537.36 (KHTML, likeGecko)Chrome/71.0.3578.80Safari/537.36'}) res = request.urlopen(req) # 用加入了请求头的请求对象发起请求
print(res.status) # 打印状态码
添加请求头的post请求方式
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': 'taotao'} 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')
添加请求头的第二种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'))
4. rulllib.request.ProxyHandler( ) 方法。高级用法:各种handler代理
rulllib.request.ProxyHandler( ) 方法设置代理
urllib.request.build_opener(handler) 创建一个opener携带handler
opener.open(req) 用opener发起请求
设置代理,网站它会检测某一段时间某个IP 的访问次数,如果访问次数过多它会禁止访问,所以这个时候需要通过设置代理来爬取数据
import urllib.request,urllib.parse url = "https://www.baidu.com/s?wd=ip"
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36'} req = urllib.request.Request(url=url,headers=headers) # 创建一个请求对象
handler = urllib.request.ProxyHandler( # 创建一个handler
{"http":'122.241.88.79:15872'
"https":'122.241.88.79:15872'}) opener = urllib.request.build_opener(handler) # 创建一个opener携带handler
res = opener.open(req) # 用opener发起请求 with open("ip.html",'wb') as fp:
fp.write(res.read())
会话处理机制
cookie中保存中我们常见的登录信息,有时候爬取网站需要携带cookie信息访问,这里用到了http.cookijar,用于获取cookie以及存储cookie
「采用handler+opener机制处理会话问题」导入cookie初始化工具,处理cookie的时候这个对象就可以存储cookie信息
from urllib import request,parse
from http import cookiejar cookie = cookiejar.CookieJar() # 初始化一个cookie对象
handler = request.HTTPCookieProcessor(cookie) # 创建一个handler对象,携带上cookie
opener = request.build_opener(handler) # 创建一个opener对象携带上handler response = opener.open('http://www.baidu.com') # 用opener来发起请求
print(response.read().decode('utf-8')) # 此时发起的请求结束以后,相关的cookie信息就会被opener的handler通过cookiejar对象保存
cookie写入到文件中保存
方式一: http.cookiejar.MozillaCookieJar( )方式
import http.cookiejar, urllib.request filename = "cookie.txt"
cookie = http.cookiejar.MozillaCookieJar(filename) handler = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(handler)
response = opener.open('http://www.baidu.com') cookie.save(ignore_discard=True, ignore_expires=True)
方式二: http.cookiejar.LWPCookieJar( )方式
import http.cookiejar, urllib.request filename = 'cookie.txt'
cookie = http.cookiejar.LWPCookieJar(filename) handler = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(handler)
response = opener.open('http://www.baidu.com') cookie.save(ignore_discard=True, ignore_expires=True)
cookie从文件中读取,用哪种方式写入的,就用哪种方式读取
方法三:cookie.load( )方式
import http.cookiejar, urllib.request cookie = http.cookiejar.LWPCookieJar()
cookie.load('cookie.txt', ignore_discard=True, ignore_expires=True) handler = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(handler)
response = opener.open('http://www.baidu.com')
print(response.read().decode('utf-8'))
urllib.parse模块
url解析模块
1. urlparse( ) 方法 拆分url
URL解析函数侧重于将URL字符串拆分为其组件,或者将URL组件组合为URL字符串
拆分的时候协议类型部分就会是scheme=“ ”指定的部分。如果url里面已经带了协议,scheme指定的协议不会生效
urllib.parse.urlparse(urlstring, scheme=" ", allow_fragments=True)
urlparse("www.baidu.com/index.html;user?id=5#comment",scheme="https")
from urllib.parse import urlparse # 对传入的url地址进行拆分; 可以用 scheme=“ ” 指定协议类型:
result = urlparse("http://www.baidu.com/index.html;user?id=5#comment")
print(result)
结果:
2. urlunparse( ) 方法 拼接url 功能和urlparse的功能相反,它是用于拼接
from urllib.parse import urlunparse data = ['http','www.baidu.com','index.html','user','a=123','commit']
print(urlunparse(data))
3. urljoin( ) 方法 拼接url 拼接的时候后面的优先级高于前面的url
from urllib.parse import urljoin print(urljoin('http://www.baidu.com', 'FAQ.html'))
# 结果 :http://www.baidu.com/FAQ.html
print(urljoin('http://www.baidu.com', 'https://pythonsite.com/FAQ.html'))
# 结果 :https://pythonsite.com/FAQ.html
print(urljoin('http://www.baidu.com/about.html', 'https://pythonsite.com/FAQ.html'))
# 结果 :https://pythonsite.com/FAQ.html
print(urljoin('http://www.baidu.com', '?category=2#comment'))
# 结果 :http://www.baidu.com?category=2#comment
print(urljoin('www.baidu.com#comment', '?category=2'))
# 结果 :www.baidu.com?category=2
4. urlencode( ) 方法
这个方法可以将字典转换为url参数,对url进行编码,因为urllib这个框架中的url中不能出现汉字,只能出现ascii码字符
from urllib import parse
url = "https://www.baidu.com/s?" # 把参数写成字典的形式
dic= {"ie":"utf-8","wd":"奔驰"}
# 用parse的urlencode方法编码
parames = parse.urlencode(dic)
# 将编码以后的参数拼接到url中
url += parames
print(request.urlopen(url=url))
urllib.error模块 方法
有时候通过程序访问页面的时候,有的页面可能会出现类似404,500等错误。这时就需要我们捕捉异常,
在urllb异常中有两个异常错误:URLError 和 HTTPError。 HTTPError 是 URLError 的子类
1. error.URLError 异常 URLError里只有一个属性:reason,即抓异常的时候只能打印错误信息
from urllib import request,error try:
response = request.urlopen("http://pythonsite.com/1111.html")
except error.URLError as e:
print(e.reason)
2. error.HTTPError 异常 HTTPError里有三个属性:code,reason,headers,即抓异常的时候可以获得code,reson,headers三个信息
from urllib import request,error
try:
response = request.urlopen("http://pythonsite.com/1111.html")
except error.HTTPError as e:
print(e.code)
print(e.reason)
print(e.headers)
except error.URLError as e:
print(e.reason)
else:
print("reqeust successfully")
爬虫框架urllib 之(三) --- urllib模块的更多相关文章
- Golang 网络爬虫框架gocolly/colly 三
Golang 网络爬虫框架gocolly/colly 三 熟悉了<Golang 网络爬虫框架gocolly/colly一>和<Golang 网络爬虫框架gocolly/colly二& ...
- Scrapy爬虫框架补充内容三(代理及其基本原理介绍)
前言:(本文参考维基百科及百度百科所写) 当我们使用爬虫抓取数据时,有时会产生错误比如:突然跳出来了403 Forbidden 或者网页上出现以下提示:您的ip访问频率太高 或者时不时跳出一个验证码需 ...
- Python爬虫框架
本文章的源代码来源于https://github.com/Holit/Web-Crawler-Framwork 一.爬虫框架的代码 import urllib.request from bs4 imp ...
- 小白学 Python 爬虫(13):urllib 基础使用(三)
人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...
- 爬虫系列(三) urllib的基本使用
一.urllib 简介 urllib 是 Python3 中自带的 HTTP 请求库,无需复杂的安装过程即可正常使用,十分适合爬虫入门 urllib 中包含四个模块,分别是 request:请求处理模 ...
- 爬虫之urllib包以及request模块和parse模块
urllib简介 简介 Python3中将python2.7的urllib和urllib2两个包合并成了一个urllib库 Python3中,urllib库包含有四个模块: urllib.reques ...
- python爬虫知识点总结(三)urllib库详解
一.什么是Urllib? 官方学习文档:https://docs.python.org/3/library/urllib.html 廖雪峰的网站:https://www.liaoxuefeng.com ...
- python爬虫入门(1)-urllib模块
作用:用于读取来自网上(服务器上)的数据 基本方法:urllib.request.urlopen(url,data=None,[]timeout]*,cafile=None,cadefault=F ...
- 一、爬虫的基本体系和urllib的基本使用
爬虫 网络是一爬虫种自动获取网页内容的程序,是搜索引擎的重要组成部分.网络爬虫为搜索引擎从万维网下载网页.一般分为传统爬虫和聚焦爬虫. 爬虫的分类 传统爬虫从一个或若干初始网页的URL开始,获得初始网 ...
随机推荐
- JavaScript实现重置表单(reset)的方法
转自:https://www.jb51.net/article/63305.htm <!DOCTYPE html> <html> <head> <script ...
- java.lang.Class.getDeclaredMethod()方法详解
Java.lang.Class.getDeclaredMethod()方法用法 注:方法返回一个Method对象,它反映此Class对象所表示的类或接口的指定已声明方法. 描述 java.lang.C ...
- C++字符串流保存数据
文件流是以外存文件为输入输出对象的数据流.字符串流是以内存中用户定义的字符数组(字符串)为输入输出对象的. 建立输出字符串流: ostrstream strout(c,sizeof(c));第一个参数 ...
- p3203 弹飞绵羊
传送门 分析 基本的lct操作,建一个点N表示弹飞出去的点,每次输出N的左子树的大小即可 代码 #include<iostream> #include<cstdio> #inc ...
- 转/keystore和truststore的区别
keytool是java自带的工具用于产生密钥 keystore可以看成一个放key的库,key就是公钥,私钥,数字签名等组成的一个信息. truststore是放信任的证书的一个store. 那他们 ...
- VS报错之混合模式程序集是针对“v1.1.4322”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集。
看到一个kinect大牛编写的一个水果忍者的体感游戏版本,让我为自己一直以来只用现有的网页游戏来模拟kinect体感游戏控制感到惭愧,没办法,我还是菜鸟.学习一段后自己模仿星际大战这个游戏,自己写了一 ...
- JMeter上传文件 点选form-data依旧失败的解决方法
转子:https://blog.csdn.net/xingyunpi/article/details/77930476 这几天一直在调用JMeter上传文件的一个接口,一直出错,在网上找到一些文章说的 ...
- python产生随机字符串
def GenerateRandomString(len, basechars = []): if (basechars == []): x = range(ord() x.extend(range( ...
- MacBook Pro (13 英寸, 2017 年)安装win10系统
准备: windows10系统镜像 16G或更大容量U盘(存放驱动,必须格式化为FAT) 官方提供的驱动软件 详细步骤: 1.打开Bootcamp,选择镜像文件 2.点击下一步,选择Bootcamp分 ...
- TensorFlow实现卷积神经网络
1 卷积神经网络简介 在介绍卷积神经网络(CNN)之前,我们需要了解全连接神经网络与卷积神经网络的区别,下面先看一下两者的结构,如下所示: 图1 全连接神经网络与卷积神经网络结构 虽然上图中显示的全连 ...