侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

python爬虫之urllib库常用方法用法总结大全

Python  /  管理员 发布于 7年前   226

Urllib

官方文档地址:https://docs.python.org/3/library/urllib.html

urllib提供了一系列用于操作URL的功能。

本文主要介绍的是关于python urllib库常用方法用法的相关内容,下面话不多说了,来一起看看详细的介绍吧

1、读取cookies

import http.cookiejar as cj,urllib.request as requestcookie = cj.CookieJar()handler = request.HTTPCookieProcessor(cookie)opener = request.build_opener(handler)response = opener.open('http://www.bigdata17.com')for item in cookie: print(item.name + "=" + item.value)

2、将cookies保存在文件中

filename = 'baidu_cookies.txt'cookies = cj.MozillaCookieJar(filename)handler = request.HTTPCookieProcessor(cookies)opener = request.build_opener(handler)response = opener.open('http://www.baidu.com')cookies.save(ignore_discard=True,ignore_expires=True)

3、处理异常

URLError和HTTPError类,两个类是父子关系,HTTPError会返回错误代码,两个类都可以处理request模块产生的异常,这两个都有一个reason属性,用于记录出现异常的原因
URLError处理异常:

from urllib import request,errortry: response = request.urlopen('http://www.bigdata17.com/index.htm')except error.URLError as e: print(e.reason)

HTTPError处理异常:

这个类是专门处理http请求的异常,http请求会返回一个请求代码,因此HTTPError会有一个code属性。另外HTTP请求会有包含请求头信息,所以HTTPError还包含一个headers属性。HTTPError继承自URLError类,因此也包含有reason属性。

代码:

try: response = request.urlopen('http://www.bigdata17.com/index.htm')except error.HTTPError as e: print(e.reason) print(e.code) print(e.headers)

4、解析链接

urllib库中的parse类提供了很多用于解析链接的方法。

urlparse()方法是专门用于解析链接的,我们先看这个方法的返回值:

from urllib.parse import urlparseresult = urlparse('http://www.bigdata17.com')print(result)

上面的代码返回的结果:

ParseResult(scheme='http', netloc='www.bigdata17.com', path='', params='', query='', fragment='')

可见urlparse()方法返回的是ParseResult类,这个了有6个属性,分别是scheme、netloc、path、params、query和fragment。其中scheme代表的是协议,有http,https,ftp等协议类型。netloc是网站域名,path是要访问的网页名称。params是代表参数。query查询参数,fragment是锚点。

urlparse()方法是如何将一个链接映射到上面的6个参数中呢?
继续看下一段代码:

from urllib.parse import urlparseresult = urlparse('http://www.bigdata17.com/22.html;user=bigdata17?id=10#content')print(result)

运行的结果如下:

ParseResult(scheme='http', netloc='www.bigdata17.com', path='/22.html', params='user=bigdata17', query='id=10', fragment='content')

可见从链接开始为://止,是scheme。从://开始到一个/位置,是netloc域名。从/开始到;分号为止是path,访问页面的路径。;开始到?为止是params参数。从?问号开始到#井号结束时query查询参数。最后是fragment锚点参数。

5、urlopen()方法

该方法返回的是HTTPResponse对象:

import urllib.request as requestresponse = request.urlopen('http://www.bigdata17.com')print(response)<http.client.HTTPResponse object at 0x000002A9655BBF28>

HTTPResponse对象有read(),getheaders()等方法。

通过read()方法可以读取网页的信息:

import urllib.request as requestresponse = request.urlopen('http://www.bigdata17.com')print(response.read().decode('utf-8'))

使用该方法时要注意网站使用的编码格式,配合decode()方法一起使用,否则会出现乱码。像百度用的是utf-8,网易用的是gbk。

getHeaders()方法返回的是网页的头信息:

import urllib.request as requestresponse = request.urlopen('http://www.bigdata17.com')print(response.getheaders())

结果:

[('Server', 'nginx/1.12.2'), ('Date', 'Mon, 12 Nov 2018 15:45:22 GMT'), ('Content-Type', 'text/html'), ('Content-Length', '38274'), ('Last-Modified', 'Thu, 08 Nov 2018 00:35:52 GMT'), ('Connection', 'close'), ('ETag', '"5be384e8-9582"'), ('Accept-Ranges', 'bytes')]

继续看urlopen()方法有哪些参数:

urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)
其中url是必须传递的参数,其他的参数不是必须传递的。data用于将数据传输到我们要爬取的网站上,例如用户名、密码、验证码等。timeout是设置请求超时时间。

data参数的用法:

>>> import urllib.parse as parse>>> import urllib.request as request>>> data = bytes(parse.urlencode({'username': 'bigdata17'}), encoding='utf8')>>> print(data)b'username=bigdata17'>>> response = request.urlopen('http://httpbin.org/post', data=data)>>> print(response.read())b'{\n "args": {}, \n "data": "", \n "files": {}, \n "form": {\n "username": "bigdata17"\n }, \n "headers": {\n "Accept-Encoding": "identity", \n"Connection": "close", \n "Content-Length": "18", \n "Content-Type": "application/x-www-form-urlencoded", \n "Host": "httpbin.org", \n "User-Agent": "Python-urllib/3.7"\n }, \n "json": null, \n "origin": "183.134.52.58", \n"url": "http://httpbin.org/post"\n}\n'

使用data传输数据时,必须将urlencode方法将data的数据转换为bytes类型。

在使用urlopen方法时,如果不使用data参数,则使用的get方式传送数据,如果使用了data参数,则是以post的方式传送数据。post的方式必须保证要爬取的网站上有相应的方法(上面代码要爬取的网址是http://httpbin.org/post,post就是要处理我们通过data参数传输数据的方法),否则会报urllib.error.HTTPError: HTTP Error 404: NOT FOUND的错误。

timeout参数的用法:

该参数是用于设置请求超时时间,免得出现网络故障或服务器异常时我们的爬虫程序长时间等:

import urllib.request as requestresponse = request.urlopen('http://www.bigdata17.com', timeout=1)print(response.read())

如果将timeout设置为0.01,则会报如下的错误:

socket.timeout: timed out
During handling of the above exception, another exception

设置请求头信息:

请求的头信息一般对带有浏览器的信息,很多网站根据请求头信息来判断该请求是正常的浏览器发起的还是由爬虫发起的。设置爬虫头信息方法:

from urllib import request, parseurl = 'http://httpbin.org/post'headers = { 'User-Agent': 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)', 'Host': 'httpbin.org'}dict = { 'name': 'bigdata17'}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'))

设置代理:

如果一个ip过于频繁的访问某一个网站时,根据反爬虫措施,会限制该IP的访问。我们可以通过urllib提供的ProxyHandler方法来设置代理:

import urllib.requestproxy_handler = urllib.request.ProxyHandler({'http': 'http://www.bigdata17.com:3128/'})proxy_auth_handler = urllib.request.ProxyBasicAuthHandler()proxy_auth_handler.add_password('realm', 'host', 'username', 'password')opener = urllib.request.build_opener(proxy_handler, proxy_auth_handler)# This time, rather than install the OpenerDirector, we use it directly:opener.open('https://accounts.douban.com/login?alias=&redir=https%3A%2F%2Fwww.douban.com%2F&source=index_nav&error=1001')

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家的支持。


  • 上一条:
    对python cv2批量灰度图片并保存的实例讲解
    下一条:
    Python3爬取英雄联盟英雄皮肤大图实例代码
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 智能合约Solidity学习CryptoZombie第四课:僵尸作战系统(0个评论)
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客