python爬虫之urllib库
请求库 urllib
urllib主要分为几个部分
urllib.request 发送请求
urllib.error 处理请求过程中出现的异常
urllib.parse 处理url
urllib.robotparser 解析robots.txt -->规定了该网站的爬虫权限
urllib.request方法
data = urllib.request.urlopen(url) #返回response对象
data.read() --->取出网页源代码 (bytes类型,可以通过decode()转成utf-8) 注意网页源代码不包括js处理后的数据
data.info() --->取出响应的头信息
data.getcode() --->取出返回码
data.geturl() --->取出请求的url
用脚本发出的请求,headers中的User-Agent是python-urllib/3.6,有些网站会根据这个来识别请求是不是脚本发出的,进而过滤掉爬虫,那我们怎么来模拟浏览器访问呢?
用urllib.request.Request()来携带headers头信息
headers = {
'User=Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36',
}
request = urllib.request.Request(url,headers=headers) #实例Request()对象,Request对象初始化可以传入headers
data = urllib.request.urlopen(request) #urlopen不仅可以传入一个url,并且可以传入一个Request对象
urllib.request是如何区分请求时get还是post呢?
看看urllib.request的源代码,可以知道,如果如果请求携带data参数,则为post请求,反之则为get请求
Cookies使用
固定写法
import http.cookiejar
# 创建cookieJar对象
cookie_jar = http.cookiejar.CookieJar()
# 使用HTTPCookieProcessor创建cookie处理器,并以它为参数构建opener对象
opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cookie_jar))
# 把opener变成urlopen,安装之后,给urlopen加上了保存cookies功能
urllib.request.install_opener(opener) #如果不想安装也可以,直接用opener.open(url)打开
设置代理
固定写法
proxy = {'http':'183.232.188.18:80','https':'183.232.188.18:80'} # 代理 ip:port
# 创建代理处理器
proxies = urllib.request.ProxyHandler(proxy)
# 创建opener对象
opener = urllib.request.build_opener(proxies,urllib.request.HTTPHandler)
urllib.request.install_opener(opener) # 如果不想安装也可以,直接用opener.open(url)打开,这样opener就有代理而urlopen没有
urllib.error
URLError是父类 断网或者服务器不存在 有异常原因,没有code属性
HTTPError是子类 服务器存在,但是地址不存在,有code和reason属性
#url = 'http://www.adfdsfdsdsa.com' URLError
#url = 'https://jianshu.com/p/jkhsdhgjkasdhgjkadfhg' HTTPError
判断方法
try:
data = urllib.request.urlopen(url)
print(data.read().decode())
except urllib.error.URLError as e:
if hasattr(e,'code'):
print('HTTPError')
elif hasattr(e,'reason'):
print('URLError')
urllib.parse
import urllib.parse # urllib.parse.urljoin() # 拼接url 字符串拼接,若都是域名,则以后面覆盖
# urllib.parse.urlencode() # 把字典转查询字符串
# urllib.parse.quote() # url采用ascii码编码,出现中文时需要进行url编码
# urllib.parse.unquote() # url解码
#
urlencode >>> from urllib import parse
>>> query = {
'name': 'walker',
'age': 99,
}
>>> parse.urlencode(query)
'name=walker&age=99' quote/quote_plus >>> from urllib import parse
>>> parse.quote('a&b/c') #未编码斜线
'a%26b/c'
>>> parse.quote_plus('a&b/c') #编码了斜线
'a%26b%2Fc' unquote/unquote_plus from urllib import parse
>>> parse.unquote('1+2') #不解码加号
'1+2'
>>> parse.unquote('1+2') #把加号解码为空格
'1 2' url = 'http://www.baidu.com/?wd=书包'
urllib.request.urlopen(url) #会报错编码错误
#如果想正确请求,需要url = 'http://www.baidu.com/?wd={}'.format(urllib.parse.quote('书包')) 先把中文进行url编码,然后再去请求
urllib3
requests库底层用的urllib3 import urllib3
http = urllib3.PoolManager() r = http.request('GET','https://www.jianshu.com',redirect=False) # 关闭重定向
print(r.status)
具体的urllib3的使用可以参考https://www.cnblogs.com/KGoing/p/6146999.html
python爬虫之urllib库的更多相关文章
- python爬虫之urllib库(三)
python爬虫之urllib库(三) urllib库 访问网页都是通过HTTP协议进行的,而HTTP协议是一种无状态的协议,即记不住来者何人.举个栗子,天猫上买东西,需要先登录天猫账号进入主页,再去 ...
- python爬虫之urllib库(二)
python爬虫之urllib库(二) urllib库 超时设置 网页长时间无法响应的,系统会判断网页超时,无法打开网页.对于爬虫而言,我们作为网页的访问者,不能一直等着服务器给我们返回错误信息,耗费 ...
- python爬虫之urllib库(一)
python爬虫之urllib库(一) urllib库 urllib库是python提供的一种用于操作URL的模块,python2中是urllib和urllib2两个库文件,python3中整合在了u ...
- python爬虫之urllib库介绍
一.urllib库 urllib是Python自带的一个用于爬虫的库,其主要作用就是可以通过代码模拟浏览器发送请求.其常被用到的子模块在Python3中的为urllib.request和urllib. ...
- python 爬虫之 urllib库
文章更新于:2020-03-02 注:代码来自老师授课用样例. 一.初识 urllib 库 在 python2.x 版本,urllib 与urllib2 是两个库,在 python3.x 版本,二者合 ...
- Python 爬虫之urllib库的使用
urllib库 urllib库是Python中一个最基本的网络请求库.可以模拟浏览器的行为,向指定的服务器发送一个请求,并可以保存服务器返回的数据. urlopen函数: 在Python3的urlli ...
- python爬虫入门urllib库的使用
urllib库的使用,非常简单. import urllib2 response = urllib2.urlopen("http://www.baidu.com") print r ...
- Python爬虫系列-Urllib库详解
Urllib库详解 Python内置的Http请求库: * urllib.request 请求模块 * urllib.error 异常处理模块 * urllib.parse url解析模块 * url ...
- python爬虫03 Urllib库
Urllib 这可是 python 内置的库 在 Python 这个内置的 Urllib 库中 有这么 4 个模块 request request模块是我们用的比较多的 就是用它来发起请求 所以我 ...
随机推荐
- Eclipse 查找
Eclipse 查找 工作空间中查找 Eclipse 查找对话框中可以允许用户在指定工作空间上使用单词或字母模式来查找文件. 或者你可以在指定项目或在 package explorer 视图上选择好指 ...
- Servlet线程安全 Filter http://zwchen.iteye.com/blog/91088
概述 在探讨java线程安全前,让我们先简要介绍一下Java语言. 任何语言,如C++,C#,Java,它们都有相通之处,特别是语法,但如果有人问你,Java语言的核心是什么?类库?关键字?语法?似乎 ...
- ChemDraw破解版真的不大好用
一直以来都有很多的用户朋友在网上找ChemDraw破解版使用,但是现在厂商清理的厉害,还有国家对知识产权的保护越来越严格,破解版ChemDraw越来越难找了.大家与其花那么多的时候找破解版的,不如买个 ...
- Python:简述 线程、进程和协程
Python线程 定义:Threading用于提供线程相关的操作,线程是应用程序中工作的最小单元. #!/usr/bin/env python # -*- coding:utf-8 -*- impor ...
- Gcc手册(转)
手册链接地址:http://www.shanghai.ws/gnu/gcc_1.htm GCC中文手册 GCC现在是GNU中最主要和最流行的c & c++编译器. gcc/g++在执行编译工作 ...
- DRDS和RDS主要用来存储用户交易信息,MongoDB主要用来存储商品维度信息
数据集成Data Integration-数加-大数据-阿里云 https://www.aliyun.com/product/cdp 数据集成支持的数据源 数据源类型 数据源 来源数据源被读取 目标数 ...
- Java 注解入门
1.什么是注解 注解的语法: @注解名称; 注解的作用: 用来替代 xml 配置文件; 在 Servlet 3.0 中就可以使用注解来代替配置文件; 注解是由框架来读取使用的; 所有的注解都是 Ann ...
- WebService中WSDL和WADL(转)
转自https://blog.csdn.net/liuxiao723846/article/details/51611183#commentBox 自己加了修改批注方便自己理解. 1.Java开发We ...
- Maven学习笔记—坐标和依赖
Maven的坐标和依赖 1 Maven坐标 1.1 什么是Maven坐标 Maven坐标:世界上任何一组构件都可以使用Maven坐标来唯一标识,Maven坐标的元素包括groupId.artifact ...
- nodejs中全栈开发框架meteor的文档
http://wiki.jikexueyuan.com/project/discover-meteor/routing.html, 这本书的源码地址: https://github.com/Dis ...