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模块是我们用的比较多的 就是用它来发起请求 所以我 ...
随机推荐
- tonymillion/Reachability的使用
tonymillion/Reachability是GitHub上的一个开源工具类,目測是依据Apple的Reachability Demo改写而成. 该类能够測试到某一网络.主机等的可达性,支持Blo ...
- SlidingMenu官方实例分析1——ExampleListActivity
1.SlidingMenuDemo下载: 由AndroidManifest.xml能看出项目是从ExampleListActivity启动的: ExampleListActivity继承了Sherlo ...
- 视觉SLAM之词袋(bag of words) 模型与K-means聚类算法浅析(2)
聚类概念: 聚类:简单地说就是把相似的东西分到一组.同 Classification (分类)不同,分类应属于监督学习.而在聚类的时候,我们并不关心某一类是什么,我们需要实现的目标只是把相似的东西聚到 ...
- 单线程爬虫VS多线程爬虫的效率对比
单线程爬虫: import re import requests import time url_EB = 'http://www.amazon.com/gp/search/other/ref=sr_ ...
- Django项目部署(django+guncorn+virtualenv+nginx)
一.说明 为了django项目部署到生产环境上,能够稳定的运行,且能够同时指出http和https的访问,对django的部署进行了一些研究,决定采用django + gunicorn + virtu ...
- Linux下Solr的安装和配置
一.安装 1.需要的安装包:apache-tomcat-7.0.47.tar.gz.solr-4.10.3.tgz.tgz(jdk自行安装) 2.解压tomcat并创建solr文件夹 [root@lo ...
- python字符串拼接相关
#字符串拼接#str.join(元组.列表.字典.字符串) 之后生成的只能是字符串.str = "-";seq = ("a", "b", & ...
- Map.Entry<K,V>分析
一.好处 你是否已经对每次从Map中取得关键字然后再取得相应的值感觉厌倦? Set keys = map.keySet( ); if(keys != null) { Iterator iterator ...
- Js前台页面搜索
$("#filter").on("keyup",function(){$(".aimed_list").hide().filter(&quo ...
- where VS having
where 和 having 的区别: WHERE 子句不能包含聚集函数: 因为试图用聚集函数判断那些行输入给聚集运算是没有意义的.相反,HAVING 子句总是包含聚集函数 hav ...