python爬虫入门之urllib库的基本使用(附实战训练 爬取内容)

完整代码点赞关注收藏后私信博主要

urllib库是python内置的一个HTTP请求库 由四个模块组成

1:request模块 打开和浏览URL中的内容

2:error模块 包含urllib.request发生的错误或异常

3:parse模块  解析URL

4:robotparser模块 解析robots.txt文件

1.1:发送请求 

下面是一个简单的模拟访问百度首页的例子 代码如下

import  urllib.request
import  ssl
ssl._create_default_https_context=ssl._create_unverified_context
resp=urllib.request.urlopen("http://www.baidu.com")
print(resp)
print(resp.read())
print(resp.geturl())
print(resp.msg)
print(resp.status)
print(resp.version)
print(resp.reason)
print(resp.debuglevel)
print(resp.getheaders()[0:2])

效果如下

 1.2:抓取二进制文件

直接把二进制文件写入文件即可 代码示例如下 

import  urllib.request
import  ssl
pic_url="https://www.baidu.com/img/bd_logo1.png"
pic_resp=urllib.request.urlopen(pic_url)
pic=pic_resp.read()
with open("bd_logo.png","wb")as f:
    f.write(pic)

效果如下

 1.3:修改请求头

有一些站点为了避免有人使用爬虫恶意抓取信息 会进行一些简单的反爬虫操作,比如通过识别请求头里的User-Agent来检查访问来源是否为正常的访问途径 还可以检查Host请求头等等 我们可以修改请求头来模拟正常的访问 Request中有个headers参数 可通过如下两种方法进行设置

(1):把请求头都塞到字典里 在实例化Request对象的时候传入

(2):通过Request对象的add_header()方法一个个添加

 部分代码如下

import  urllib.request

novel_url="http://www.biqukan.com/1_1496/"
headers={'User-Agent':'Mozilla/5.0(X11;Linux x86_64)''AppleWebKit/537.36(KHTML,like Gecko)''Chrome/63.0.3239.84 Safari/537.36',
       
novel_req=urllib.request.Request(novel_url,headers=headers)
novel_resp=urllib.request.urlopen(novel_req)
print(novel_resp.read().decode('GBK'))

1.4:设置连接超时

urlopen()函数中有一个可选参数timeout 单位为秒 作用是如果请求超出了这个事件还没有得到相应 就会抛出异常

1.5:延迟提交数据

通常情况下 服务器都会对请求的客户端IP进行记录  如果在一定时间内访问次数达到了一个阈值,服务器会认为该IP地址就是爬虫 会弹出验证码验证 或者直接对IP进行封禁

为了避免IP被封 一个最简单的方法就是延迟每次发起请求的时间 直接用time模块的sleep休眠即可

1.6:parse模块

urlparse函数 将URL拆分成六大组件

urlsplit函数 和urlparse函数类似 只是不会单独拆分params部分

代码如下

import urllib.parse
urp= urllib.parse.urlparse("https://docs.python.org/3/search.html?q=parse&check_keywords=yes&area=default")
print("urlparse执行结果",urp)
print("urp.scheme",urp.scheme)
print("urp.netloc",urp.netloc)
urp1=urllib.parse.urlsplit("https://docs.python.org/3/search.html?q=parse&check_keywords=yes&area=default")
print("urlsplit执行结果",urp1)

 拼接URL

urlunparse函数 长度为7

urlunsplit函数 长度为6

import urllib.parse
url=urllib.parse.urlunsplit(['https','docs.python.org','/3/search.html','q=parse&check_keywords=yes&area=default',","])
print("urlunsplit函数",url)
url=urllib.parse.urljoin('https://docs.python.org','/3/search.html')
url1=urllib.parse.urljoin(url,'?q=parse&check_keywords=yes&area=default')
print("urljoin函数",url1)

 2:error异常处理模块

error模块定义有request模块引发的异常类 主要用到两个类 URLError和HTTPError

URLError类 具体reason属性 返回错误原因 发生URLError异常的原因一般有以下几种

1:远程地址不存在

2:触发了HTTPError异常

3:远程服务器不存在

4:远程服务器连接不上

HTTPError类 专门处理HTTP和HTTPS请求错误 具体有三个属性 code请求返回的状态码

headers请求返回的响应头信息 reason错误原因 HTTPError类并不能处理父类支持的异常处理 建议对两种异常分开捕获 代码如下

from urllib import  request,error

try:
    response=request.urlopen('http://www.baidu.com')
except error.HTTPError as e:
    print("HTTPerror异常")
    print("reason"+str(e.reason),'code'+str(e.code),'headers'+str(e.headers),sep='\n')
except error.URLError as e:

    print("url异常")
    print('reason'+str(e.reason))
else:
    print('request successfullu')

3:robotparser模块

Robots协议 又称爬虫协议 网站可以通过该协议告知搜索引擎站点内的哪些网页可以抓取 哪些不可以抓取 当搜索爬虫访问某个站点时会先检查是否有这个文件 如果有的话 会根据协议规定范围来爬取 如果没有找到则访问所有页面

Robots只是一个道德规范 并不是强制命令 所以防君子不防小人 代码如下

from urllib import  robotparser
rp=robotparser.RobotFileParser()
rp.set_url('http://www.taobao.com/robots.txt')
rp.read()
url='https://www.douban.com'
user_agent='Baiduspider'
op_info=rp.can_fetch(user_agent,url)
print("Elsespider代理情况",op_info)
bdp_info=rp.can_fetch(user_agent,url)
print('baiduspider代理情况',bdp_info)
user_agent='Elsespider'

完整代码点赞关注收藏后私信博主要

  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

showswoller

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值