Python爬虫urllib库的使用
urllib
在Python2中,有urllib和urllib2两个库实现请求发送,在Python3中,统一为urllib,是Python内置的HTTP请求库
request:最基本的HTTP请求模块,可以模拟发送请求。
error:异常处理模块
parse:一个工具模块,提供了许多URL处理方法,拆分、解析、合并等
rebotparser:主要用来识别网站的robots.txt文件,判断哪些文件可以爬,哪些文件不可以爬
urlopen() :urlopen.request模块提供了最基本的构成HTTP请求的方法,可以模拟浏览器请求的发起过程
实例:
import urllib.request #调用 urllib的request方法
response = urllib.request.urlopen(‘http://www.baidu.com’) #请求百度网站
print(response.read().decode('utf-8')) #输出网站内容,设置编码utf-8
print(response.status) #网页响应状态码
print(response.getheaders()) #获取请求头信息
print(response.getheaders('Server')) #获取响应头中的 Server值,获取服务器
参数:
data():data参数是可选的,如果添加该参数,需要使用bytes()方法将参数转化为字节流编码格式的内容,即betyes类型,如果传递了这个参数,请求方式不再是get,二是post
实例:
import urllib.parse
import urllib.request
data = bytes(urllib.parse.urllencode({'word':'hello'}),encoding='utf8') #传递一个参数word,值是hello,转码成bytes类 型,该方法第一个参数是要str类型,用urllib.parse模块里的urlencode()方法转化为字符串
response = urllib.request.urlopen('http://httpbin.org/post',data=data) #请求站点是httpbin.org,可以提供http测试,这个链接可以测试post请求,可以输出请求信息,包含我们传递的data参数
print('response.read()') #传递的参数在form字段中说明模拟了表单提交方式,以post方式传输
timeout():timeout 参数用于设置超时时间,单位为秒,意思是如果请求超出了设置时间,还没有得到响应,就会抛出异常,如果不指定,就会使用全局默认时间,支持 HTTP HTTPS FTP请求
实例:
import urllib.request
import socket
import urllib.error
try:
response = urllib.request.urlopen('http://httpbin.org/get',timeout=1) #请求httpbin.org测试链接,设置超时时间1秒,.
except urllib.error.URLError as e: #捕获异常
if isinstance(e.reason,socket.timeou) #socket.timeout 判断异常是超市异常
pritn(‘TIME OUT’)
Request:利用urllib.urlopen()方法可以完成简单的请求,但是不足以构建一个完整的请求,如果需要加headers等信息,就需要利用更强大request方法来构建
实例:
import urllib.request
request = urllib.urlopen('https://python.org')
response = urllib.request.get(request)
print(response.read()).deaode('utf-8')
#可以发现,我们依然用urlopen()方法来发送请求,只不过这次该方法的参数不再试url,而是request类型的对象,通过构造这个数据结构,一方面可以将请求独立成一个对象,另一方面可以灵活的配置参数
网站身份验证:
实例:
form urllib.request import HTTPPasswordMgrWithDefaultRealm, HTTPBasicAuthHandler,build_opener
from urllib.error import URLError
username = 'username'
password = 'password'
url = 'http://localhost:5000'
p = HTTPPasswordMgrWithDefaultRealm() #实例化HTTPBasicAuthHandler对象,其参数是HTTPPasswordMgrWithDefaultRealm对象
p.add_password(None,url,username,pasword) #通过 add_password()添加进去用户名和密码,这样就建立了一个处理验证的handler
auth_handler =HTTPBasicAuthHandler(p)
opener = buid_oppener(auth_handler) #利用handler使用build_opener()方法构建了一个Opener,这个Opener在发送请求时就相当于验证成功
try:
result = opener.open(url)
html = result.read().decode('utf-8')
pritn(html)
except URLErrot as e:
print(e.reason)
代理IP:
from urllib.error import URLError
from urllib,request import ProxyHandler,biuld_opener
porxy_handler = Proxyhandler({
'http':'http://127.0.0.1:9743',
'https':'https://127.0.0.1:9743'
})
opener = build_opener(proxy_handler)
try:
response = eopner.open('https://www.baidu.com')
print(response.read().decode('utf-8'))
except URLError as e:
pritn(e.reason)
#在本地搭建一个代理,运行在9743端口,使用了Proxyhandler,参数是一个字典,健名是协议类型,值是代理链接,可以添加多个代理,然后使用handler以及build_opener()方法构造一个 opener,之后发送请求即可
urlparse():该方法可以实现入了的识别和分段
分析robots协议:
robots协议也叫爬虫协议,机器人协议,它的全貌叫忘了爬虫排除标准,用来告诉爬虫和搜索引擎哪些页面可以抓取,哪些不可以抓取,它通常是一个叫做robots.txt的文本文件,一般放在网站的根目录下
当搜索爬虫访问一个站点时,它首先检查这个站点根目录下是否存在robots.txt文件,如果存在,搜索爬虫会根据其中定义的爬取范围来爬取,如果没有找到这个文件,搜索爬虫会返耐高温所有可以直接访问的页面
robots.txt 样例:
User-agent:*
Disallow:/
Allow:/public/
这实现了对所有搜索爬虫只允许爬取public目录的功能,将上述内容保存成robots.txt文件,放在网站的根目录下,和网站的入口文件比如(index.pho index.html index.jsp等等)放在一起
上面的User-agent描述了搜索爬虫的名称,这里将其设置为*则代表该协议对任何爬取爬虫有效,比如,我们可以设置 :user-agent:baiduspider
这就代表我们设置的规则对百度爬虫是有效果,如果有多条user-agent的记录,则就会有多个爬虫会受到爬取限制,但是至少指定一条
disallow指定了不允许爬取的目录。比如上个例子设置为/,则代表不允许抓取所有页面
allow一般和disallow一起使用,一般不会单独使用,用来排除某些限制,限制我们设置为/public/,则表示所有页面不允许抓取,但是可以抓取public目录
下面再看几个例子:
user-agent:*
Disallow:/ #禁止所有爬虫访问任何目录
----------------------------------------------------------------
user-agent:*
Disallow:/ private/
Disallow:/tmp/ #允许所有爬虫访问网站某些目录
-------------------------------------------------------------------------
user-agent:WebCrawler
Disallow:/
user-agent:*
Disallow:/ #只允许一个爬虫访问
---------------------------
user-agent:*
Disallow: #允许所有爬虫访问,robots.txt留空也可以
Python爬虫urllib库的使用的更多相关文章
- Python爬虫Urllib库的高级用法
Python爬虫Urllib库的高级用法 设置Headers 有些网站不会同意程序直接用上面的方式进行访问,如果识别有问题,那么站点根本不会响应,所以为了完全模拟浏览器的工作,我们需要设置一些Head ...
- Python爬虫Urllib库的基本使用
Python爬虫Urllib库的基本使用 深入理解urllib.urllib2及requests 请访问: http://www.mamicode.com/info-detail-1224080.h ...
- python爬虫 - Urllib库及cookie的使用
http://blog.csdn.net/pipisorry/article/details/47905781 lz提示一点,python3中urllib包括了py2中的urllib+urllib2. ...
- 对于python爬虫urllib库的一些理解(抽空更新)
urllib库是Python中一个最基本的网络请求库.可以模拟浏览器的行为,向指定的服务器发送一个请求,并可以保存服务器返回的数据. urlopen函数: 在Python3的urllib库中,所有和网 ...
- Python爬虫--Urllib库
Urllib库 Urllib是python内置的HTTP请求库,包括以下模块:urllib.request (请求模块).urllib.error( 异常处理模块).urllib.parse (url ...
- python爬虫---urllib库的基本用法
urllib是python自带的请求库,各种功能相比较之下也是比较完备的,urllib库包含了一下四个模块: urllib.request 请求模块 urllib.error 异常处理模块 u ...
- python爬虫 urllib库基本使用
以下内容均为python3.6.*代码 学习爬虫,首先有学会使用urllib库,这个库可以方便的使我们解析网页的内容,本篇讲一下它的基本用法 解析网页 #导入urllib from urllib im ...
- Python爬虫 Urllib库的高级用法
1.设置Headers 有些网站不会同意程序直接用上面的方式进行访问,如果识别有问题,那么站点根本不会响应,所以为了完全模拟浏览器的工作,我们需要设置一些Headers 的属性. 首先,打开我们的浏览 ...
- python爬虫urllib库使用
urllib包括以下四个模块: 1.request:基本的HTTP请求模块,可以用来模拟发送请求.就像在浏览器里输入网址然后回车一样,只需要给库方法传入URL以及额外的参数,就可以模拟实现这个过程. ...
随机推荐
- 2021年5月15日海外 Meetup 演讲内容分享
北京时间 2021 年 5 月 16 日 05:00-08:00 我们与Apache ShardingSphere 联合举办了第一场海外Meetup,感谢各位小伙伴的参与,让本次活动圆满结束. 同时我 ...
- Sonatype Nexus3 搭建私有仓库
Nexus是Sonatype提供的仓库管理平台,Nuexus Repository OSS3能够支持Maven.npm.Docker.YUM.Helm等格式数据的存储和发布:并且能够与Jekins.S ...
- Luogu1655 小朋友的球 (组合数学,第二类斯特林数,高精)
我bingoyes再高精用STL就饿死,死外边! string真的爽... 斯特林数模板题:\(S(n,m) = S(n-1,m-1)+S(n-1,m)*n\) #include <iostre ...
- Luogu1382 楼房 (线段树 扫描线)
各种低级错误.jpg,数组开大就过.jpg 线段树离散化扫描线 #include <iostream> #include <cstdio> #include <cstri ...
- 稳定好用的短连接生成平台,支持API批量生成
https://www.5w.fit/ 01 安全:快码拥有两种模式:防封模式和极速模式,防封模式使短链更加安全! 02 无流量劫持:快码短链绝不劫持流量! 03 极速:专属大量服务器,支持高并发 ...
- java-重载、包修饰词以及堆栈管理
1.方法的重写(Override):重新写.覆盖 1)发生在父子类中,方法名称相同,参数列表相同,方法体不同 2)重写方法被调用时,看对象的类型2.重写与重载的区别: 1)重写(Override): ...
- Docke 搭建 apache2 + php8 + MySQL8 环境
Docker 安装 执行 Docker 安装命令 curl -fsSL https://get.docker.com/ | sh 启动 Docker 服务 sudo service docker st ...
- .Net Core&RabbitMQ死信队列
过期时间 RabbitMQ可以为消息和队列设置过期时间Time To Live(TTL).其目的即过期. 消息过期时间 消息存储在队列中时,如果想为其设置一个有限的生命周期,而不是一直存储着,可以为其 ...
- 【IDEA】IDEA怎么汉化&汉化后怎么转回英文
① 英文转中文 1.点击左上角的File,然后选择Setting 2.达到Setting页面选择Plugins 3.在搜索框搜索chinese,选择中文语言包下载 4.找到下载插件,选择勾选上,然后o ...
- iOS 苹果集成登录及苹果图标的制作要求
前言 如果要上架的应用集成了三方登录,那么在审核时,苹果会强制要求应用也要集成苹果登录.如果应用没有集成一般情况下都会被审核团队给打回来. 苹果集成登录 首先,你需要在开发者中心,找到你的应用,勾选上 ...