您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > Python

Python自带爬虫库urllib使用大全

时间:2020-12-16 11:29:38  来源:  作者:

这篇文章主要来讲解下Python/ target=_blank class=infotextkey>Python自带的爬虫库urllib常见用法,主要围绕urllib定义、urllib的常用模块和urllib+lxml爬虫案例三个部分进行展开。

一、什么是urllib

它是一个http请求的Python自带的标准库,无需安装,直接可以用。并且提供了如下功能:网页请求、响应获取、代理和cookie设置、异常处理、URL解析,可以说是一个比较强大的模块。

二、urllib模块

可分为以下模块:

urllib.request 请求模块urllib.error 异常处理模块urllib.parse 解析模块urllib.robotparser 解析模块

那么,我们先从第一个模块开始说起吧,首先说一下它的大致用法:

urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None) #里面有很多方法,类似与requests模块中的renquest方法

request里包含了很多方法,如果我们要发送一个请求并读取请求内容,最简单的方法就是:

请求格式:

urllib.request.urlopen(url,data,timeout)

url :请求地址

data:请求数据

timeout:请求超时时间

Python自带爬虫库urllib使用大全

这里采用的是get请求,如果想要进行post请求,只需给data方法传参数即可,这里有个问题需要,因为传递参数必须是字节,所以得先编码成bytes才能读取。

Python自带爬虫库urllib使用大全

也可以这样写:

Python自带爬虫库urllib使用大全

通过解析模块先将它解析为byte格式然后读取,同样行之有效,这样就完成了一次post请求。

通过上面例子我们找到了request模块的使用方法,我们使用response.read获取的是响应体的内容,我们还可以通过response.status、response.getheaders.response.getheader("server"),获取状态码以及头部信息,如果我们要给请求的网址添加头部信息的话了,就要使用urllib.request.Request方法了。

它的用法为:

urllib.request.Request(url,data,headers,timeout,method)

url:请求地址

data:请求数据

headers:请求头

timeout:请求超时时间

method:请求方法,如get post

大致了解下我们可以先来访问下起点网:

from urllib import request, parse
url = 'https://book.qidian.com/info/1014243481#Catalog'headers = { 'User-Agent': 'Mozilla/5.0 (windows NT 6.1; WOW64) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/78.0.3904.108 Safari/537.36', 'Host': 'book.qidian.com'}data = { 'hw': 'hw'}data = bytes(parse.urlencode(data), encoding='utf8')req = request.Request(url=url, data=data,timeout=2,headers=headers, method='POST')response = request.urlopen(req)print(response.read.decode('utf-8'))

可以看出这是个post请求,因为method设置为post,data传了参数。

这里补充说明下有个urlencode方法,它的作用是将字典转换为url,例子如下:

from urllib.parse import urlencode
data = { "name":"hw", "age":25,}url = "https://www.baidu.com?"
page_url = url+urlencode(data)print(page_url)

添加请求头其实还有一种方法,请看:

from urllib import request, parseurl = 'https://book.qidian.com/info/1014243481#Catalog'data = { 'hw': 'hw'}data = bytes(parse.urlencode(data), encoding='utf8')req = request.Request(url=url, data=data,method='POST')req.add_header('User-Agent','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrom/78.0.3904.108 Safari/537.36') #添加请求头response = request.urlopen(req)print(response.read.decode('utf-8'))

这种添加方式有个好处是自己可以定义一个请求头字典,然后循环进行添加,伪造多个浏览器头。

urllib.request 还可以设置代理,用法如下,

urllib.request.ProxyHandler({'http':'http://fsdfffs.com','https':'https://fsdfwe.com'})

这样就可以避免同一个IP访问网站多次被封的尴尬局面了。

import urllib.request
proxy_handler = urllib.request.ProxyHandler({ 'http': 'http://127.0.0.1:8000', 'https': 'https://127.0.0.1:8000'})opener = urllib.request.build_opener(proxy_handler) #构建代理池response = opener.open('https://book.qidian.com/info/1014243481#Catalog') #代理访问网站print(response.read)
Python自带爬虫库urllib使用大全

可以看出,由于本人使用无用的IP导致链接错误,所以此时应该处理异常。

Python自带爬虫库urllib使用大全

换了种处理异常的方式,不过总的来说还是比较全面的。异常模块中有两个异常错误:

URLError,HTTPError,其中HTTPError是URLError的子类,URLError 里只有一个属性:reason,即抓异常的时候只能打印错误信息,类似上面的例子。

HTTPError 里有三个属性:code,reason,headers,即抓异常的时候可以获得code,reson,headers三个信息,

import socketimport urllib.requestimport urllib.erroraa=''try: response = urllib.request.urlopen('https://book.qidian.com/info/1014243481#Catalog', timeout=0.1) aa=response.read.decode('utf8')except urllib.error.URLError as e: print(e.reason) if isinstance(e.reason,socket.timeout): print("time out")except urllib.error.HTTPError as e:print(e.reason,e.code)finally: print(aa)

除此之外,它还可以处理cookie数据,不过要借助另一个模块 http。

import http.cookiejar, urllib.requestcookie = http.cookiejar.CookieJar #创建cookiejar对象handler = urllib.request.HTTPCookieProcessor(cookie) 建立cookie请求opener = urllib.request.build_opener(handler) #构建请求response = opener.open('https://www.baidu.com') #发送请求for item in cookie: print(item.name+"="+item.value) #打印cookie信息

同时cookie可以写入到文件中保存,有两种方式http.cookiejar.MozillaCookieJar和http.cookiejar.LWPCookieJar,想用哪种自己决定。

http.cookiejar.MozillaCookieJar方式

import http.cookiejar, urllib.requestfilename = "cookie.txt"cookie = http.cookiejar.MozillaCookieJar(file_name)handler = urllib.request.HTTPCookieProcessor(cookie)opener = urllib.request.build_opener(handler)response = opener.open('https://www.baidu.com')cookie.save(ignore_discard=True, ignore_expires=True)#保存信息

http.cookiejar.LWPCookieJar方式

import http.cookiejar, urllib.requestfilename = 'cookie.txt'cookie = http.cookiejar.LWPCookieJar(file_name)handler = urllib.request.HTTPCookieProcessor(cookie)opener = urllib.request.build_opener(handler)response = opener.open('https://www.baidu.com')cookie.save(ignore_discard=True, ignore_expires=True)

如果想要通过获取文件中的cookie获取的话可以通过load方式,它也有两种方式,http.cookiejar.MozillaCookieJar和http.cookiejar.LWPCookieJar,想用哪种自己决定。

http.cookiejar.MozillaCookieJar方式

import http.cookiejar, urllib.requestcookie = http.cookiejar.MozillaCookieJarcookie.load('cookie.txt', ignore_discard=True, ignore_expires=True)handler = urllib.request.HTTPCookieProcessor(cookie)opener = urllib.request.build_opener(handler)response = opener.open('https://www.baidu.com')print(response.read.decode('utf-8'))

http.cookiejar.LWPCookieJar方式

import http.cookiejar, urllib.requestcookie = http.cookiejar.LWPCookieJarcookie.load('cookie.txt', ignore_discard=True, ignore_expires=True)handler = urllib.request.HTTPCookieProcessor(cookie)opener = urllib.request.build_opener(handler)response = opener.open('https://www.baidu.com')print(response.read.decode('utf-8'))

urllib parse模块

它是负责解析页面内容,模块下有一个urlparse方法用于拆分解析内容,具体用法如下:

urllib.parse.urlparse(url,scheme)

URL:页面地址

scheme: 协议类型 ,比如 http https

Python自带爬虫库urllib使用大全

有拆分当然也会有拼接,我们可以看到上面返回的有六个值,所以我们在做拼接时一定要填写六个参数,否则它会报没有足够的值用来解包的错误。

urllib.parse.urlunpars(url,scheme)

Python自带爬虫库urllib使用大全Python自带爬虫库urllib使用大全

类似的拼接方法其实还有,比如说urljoin,例子如下:

Python自带爬虫库urllib使用大全

urllib.robotparser 它也是一个解析模块,从它的字面意思看,应该是一个机器人解析模块。

而且它还与机器人协议有关联,它的存在就是为了解析每个网站中机器人协议,判断这个网站是否可以抓取。

每个网站中都会有一个robots.txt文件,我们要做的就是先解析它,然后在对要下载的网页数据进行判断是否可以抓取。

Python自带爬虫库urllib使用大全

可以通过直接输入url的方式来判断:

from urllib import robotparserrb = robotparser.RobotFileParser('https://www.baidu.com/robots.txt')print(rb.read)url = 'https://www.baidu.com'user_agent = 'BadCrawler'aa=rb.can_fetch(user_agent, url) #确定指定的用户代理是否允许访问网页print(aa) #禁止使用的用户代理 falseuser_agent = 'googlebot'bb=rb.can_fetch(user_agent, url) print(bb)#允许使用的用户代理 true

也可以通过间接设置url的方式来判断:

from urllib import robotparserrb = robotparser.RobotFileParserrb.set_url('https://www.baidu.com/robots.txt')rb.read #读取url = 'https://www.baidu.com'user_agent = 'BadCrawler'aa=rb.can_fetch(user_agent, url) #确定指定的用户代理是否允许访问网页print(aa) #禁止使用的用户代理 falseuser_agent = 'Googlebot'bb=rb.can_fetch(user_agent, url) print(bb)#允许使用的用户代理 trueprint(rb.mtime) #返回抓取分析robots协议的时间rb.modified #将当前时间设置为上次抓取和分析 robots.txt 的时间print(rb.mtime)# 返回 robots.txt 文件对请求速率限制的值print(rb.request_rate('Googlebot')) print(rb.request_rate('MSNBot'))# 返回 robotx.txt 文件对抓取延迟限制的值print(rb.crawl_delay('Googlebot'))print(rb.crawl_delay('MSNBot'))

三、应用案例:爬取起点小说名

老样子,按下键盘快捷键F12,进行网页分析,这次我们采用lxml,我们得知只需要将这个页面中的某一个部分的数据变动一下就可以抓取到所有数据。如图:

Python自带爬虫库urllib使用大全

下次我们来讲lxml和xpath语法,以便于大家更好的爬取数据,urllib内容就这么多,并不复杂,requests更为简单易学。



Tags:爬虫   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
Beautiful Soup 简介Beautiful Soup 是一个可以从 HTML 或 XML 文件中提取数据的 Python 库,它提供了一些简单的操作方式来帮助你处理文档导航,查找,修改文档等繁琐的工作。因...【详细内容】
2022-07-04  Tags: 爬虫  点击:(23)  评论:(0)  加入收藏
#coding=utf-8import requestsimport osimport jsonfrom jsonpath import jsonpathimport timeurl='https://api.inews.qq.com/newsqa/v1/query/inner/publish/modules/...【详细内容】
2022-06-29  Tags: 爬虫  点击:(47)  评论:(0)  加入收藏
在学习爬虫前,我们需要先掌握网站类型,才能根据网站类型,使用适用的方法来编写爬虫获取数据。今天小编就以国内知名的ForeSpider爬虫软件能够采集的网站类型为例,来为大家盘点一...【详细内容】
2022-06-16  Tags: 爬虫  点击:(36)  评论:(0)  加入收藏
在使用爬虫的过程中,这些情况你是否遇到过? 没采多久就采集不到数据了采集了好半天,最后发现采集的内容与网页中的内容不一致刚开始采集的好好的,再往后采集的数据有字段竟然是...【详细内容】
2022-05-20  Tags: 爬虫  点击:(62)  评论:(0)  加入收藏
Selenium 操作被屏蔽使用selenium自动化网页时,有一定的概率会被目标网站识别,一旦被检测到,目标网站会拦截该客户端做出的网页操作。比如淘宝和大众点评的登录页,当打开浏览器,...【详细内容】
2022-04-06  Tags: 爬虫  点击:(21)  评论:(0)  加入收藏
私信里经常有人问:为什么自己的爬虫明明设置了代理,但一访问网站就能被发现。我总结了几种常见的情况。实际上,网站要识别你是否使用了代理,并不一定非要什么高深的反爬虫机制,也...【详细内容】
2022-04-01  Tags: 爬虫  点击:(90)  评论:(0)  加入收藏
前言目前是直播行业的一个爆发期,由于国家对直播行业进行整顿和规范,现在整个直播行业也在稳固发展。随着互联网和网络直播市场的快速发展,相信未来还有广阔的发展前景。今天用...【详细内容】
2022-03-15  Tags: 爬虫  点击:(110)  评论:(0)  加入收藏
《开源精选》是我们分享Github、Gitee等开源社区中优质项目的栏目,包括技术、学习、实用与各种有趣的内容。本期推荐的是一个使用 Python 编写的轻量级百度爬虫—&mdash...【详细内容】
2022-02-21  Tags: 爬虫  点击:(39)  评论:(0)  加入收藏
如今,很多互联网创业者若是需要爬出大量数据一般会使用代理工具。代理服务器位于您的设备和互联网之间。因此,在使用代理时,您将无法直接访问Internet,但您的Web请求将首先通过...【详细内容】
2022-02-14  Tags: 爬虫  点击:(74)  评论:(0)  加入收藏
在我没接触这一行时这个问题困扰了我很长时间,让我十分的不理解到底什么是爬虫,它难道是一种实体工具?,直到我学习python 深入分析了解以后才揭开了它神秘的面纱。 爬虫是什么呢...【详细内容】
2022-02-10  Tags: 爬虫  点击:(118)  评论:(0)  加入收藏
▌简易百科推荐
近几年 Web3 被炒得火热,但是大部分人可能还不清楚什么是 Web3,今天就让w3cschool编程狮小师妹带你了解下 Web3 是什么?与我们熟知的 Web1 和 Web2 又有什么区别呢?web3.0什么是...【详细内容】
2022-07-15  编程狮W3Cschool    Tags:Web3.0   点击:(2)  评论:(0)  加入收藏
1、让我们一起来看下吧,直接上图。 第一眼看到是不是觉得很高逼格,暗黑画风,这很大佬。其实它就是------AidLearning。一个运行在安卓平台的linux系统,而且还包含了许多非常强大...【详细内容】
2022-07-15  IT智能化专栏    Tags:AidLearning   点击:(2)  评论:(0)  加入收藏
真正的大师,永远都怀着一颗学徒的心! 一、项目简介 今天说的这个软件是一款基于Python+vue的自动化运维、完全开源的云管理平台。二、实现功能 基于RBAC权限系统 录像回放 ...【详细内容】
2022-07-14  菜鸟程序猿    Tags:Python   点击:(3)  评论:(0)  加入收藏
前言今天笔者想和大家来聊聊python接口自动化的MySQL数据连接,废话不多说咱们直接进入主题吧。 一、什么是 PyMySQL?PyMySQL是在Python3.x版本中用于连接MySQL服务器的一个库,P...【详细内容】
2022-07-11  测试架构师百里    Tags:python   点击:(19)  评论:(0)  加入收藏
aiohttp什么是 aiohttp?一个异步的 HTTP 客户端\服务端框架,基于 asyncio 的异步模块。可用于实现异步爬虫,更快于 requests 的同步爬虫。安装pip install aiohttpaiohttp 和 r...【详细内容】
2022-07-11  VT漫步    Tags:aiohttp   点击:(15)  评论:(0)  加入收藏
今天我们学习下 Queue 的进阶用法。生产者消费者模型在并发编程中,比如爬虫,有的线程负责爬取数据,有的线程负责对爬取到的数据做处理(清洗、分类和入库)。假如他们是直接交互的,...【详细内容】
2022-07-06  VT漫步    Tags:Python Queue   点击:(34)  评论:(0)  加入收藏
继承:是面向对象编程最重要的特性之一,例如,我们每个人都从祖辈和父母那里继承了一些体貌特征,但每个人却又不同于父母,有自己独有的一些特性。在面向对象中被继承的类是父类或基...【详细内容】
2022-07-06  至尊小狸子    Tags:python   点击:(25)  评论:(0)  加入收藏
点击上方头像关注我,每周上午 09:00准时推送,每月不定期赠送技术书籍。本文1553字,阅读约需4分钟 Hi,大家好,我是CoCo。在上一篇Python自动化测试系列文章:Python自动化测试之P...【详细内容】
2022-07-05  CoCo的软件测试小栈    Tags:Python   点击:(27)  评论:(0)  加入收藏
第一种方式:res = requests.get(url, params=data, headers = headers)第二种方式:res = requests.get(url, data=data, headers = headers)注意:1.url格式入参只支持第一种方...【详细内容】
2022-07-05  独钓寒江雪之IT    Tags:Python request   点击:(19)  评论:(0)  加入收藏
什么是python类的多态python的多态,可以为不同的类实例,或者说不同的数据处理方式,提供统一的接口。用比喻的方式理解python类的多态比如,同一个苹果(统一的接口)在孩子的眼里(类实...【详细内容】
2022-07-04  写小说的程序员    Tags:python类   点击:(28)  评论:(0)  加入收藏
站内最新
站内热门
站内头条