资讯专栏INFORMATION COLUMN

爬虫学习(2): urllib教程

Cobub / 2653人阅读

摘要:文章目录一前言框架二网址请求打开网址超时设置错误抓取三更深请求打开网址请求头添加链接解析四协议五万能视频下载一前言框架之前我一直没想教大家,思考万分,还是要补一下这个教程。对中文进行编码。

一、前言框架

之前我一直没想教大家urlib,思考万分,还是要补一下这个教程。

我们来学一下爬虫之祖urlib,不管你什么模块都是起源于该模块。
urlib库有几个模块,依次如下:

  1. request :用于请求网址的模块
  2. error:异常处理模块
  3. parse:用于修改拼接等的模块
  4. robotparser:用来判断哪些网站可以爬,哪些网站不可以爬

二、网址请求

2.1 打开网址

以请求我自己的博客为例子,我博客链接为:

https://blog.csdn.net/weixin_46211269?spm=1000.2115.3001.5343

我们使用urlib库中的request模块如下:

import urllib.request  response = urllib.request.urlopen("https://blog.csdn.net/weixin_46211269?spm=1000.2115.3001.5343")  print(response.read().decode("utf-8"))#调用 read 方法可以得到返回的网页内容,打印网页内容

运行结果:

留个问题:你可否去请求一下别的网址试试?比如你自己的博客?

我们接着来看看其它的问题:如何才知道自己请求网址成功?我可不想每次都把他打印出来才看自己成功没有。
我们使用status函数来查看,这个单词就是状态的意思,如果返回结果为200就是请求成功,404就是请求失败的意思。
假设我请求自己博客:

import urllib.request  response = urllib.request.urlopen("https://blog.csdn.net/weixin_46211269?spm=1000.2115.3001.5343")  print(response.status)  

运行:

可以看到是200,代表请求成功了。那么我们来请求一个别的网址呢?比如我们现在来请求国外的facebook:

import urllib.request  response = urllib.request.urlopen("https://www.facebook.com/")  print(response.status)  

运行:

惊奇的是我请求成功了,不过我估计你们可能会请求得到404,这也没关系,正常的。

2.2 超时设置

我们只需要加上timeout参数即可,为什么我们要用超时设置,因为有些网站我们不能马上请求进入,有可能是自己网络原因,也有可能是对方服务器卡顿等原因,因此需要设置一下超过规定的时间就不去请求了。
举个例子:我要请求打开github不能超过十秒,如果超过十秒就不请求了。

import urllib.request  response = urllib.request.urlopen("https://github.com/",timeout=10)  print(response.status)  

运行看看:

显示time out意思就是超时打开错误,如果你把请求十秒钟改为30秒,再去试试能否成功?(毕竟国内上github会卡很正常)

2.3 错误抓取

前面我们遇到了请求超时,就会报错出一大堆,假如先去判是否请求成功,需要用try…except来获取报错信息,具体如下:

import socket  import urllib.request  import urllib.error  try:      response = urllib.request.urlopen("https://github.com/", timeout=5)  except urllib.error.URLError as e:      if isinstance(e.reason, socket.timeout):          print("请求超时")

运行看看:

三、更深请求

3.1 打开网址

import urllib.requestrequest = urllib.request.Request("https://www.csdn.net/?spm=1011.2124.3001.5359")response=urllib.request.urlopen(request)print(response.read().decode("utf-8"))

说一下每一行大概是什么。

  1. 第一行导入模块
  2. 第二行用Requests请求网址
  3. 第三行再用urlopen打开网址
  4. 第四行用read打印内容

运行看看:

3.2 请求头添加

为什么要添加请求头,请求头的作用是模拟浏览器去爬取内容,主要是为了被反扒。
有个新词:反扒 为什么会被反扒?因为有些网站是不允许你去爬取的,但是我们就是需要爬取内容,因此我们使用请求头来模拟进行。请求头的添加能帮助我们解决百分之八十的反扒,不用担心我,后面的反扒技术我都会教大家。
看个例子,我们已爬取CSDN首页为例子:

from urllib import requesturl="https://www.csdn.net/?spm=1011.2124.3001.5359"headers={"User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36"}req=request.Request(url=url,headers=headers)response=request.urlopen(req)print(response.read().decode("utf-8"))

大概说一些每一行的例子:

  1. 第一行从库导入模块
  2. 第二行就是我们需要请求的网址
  3. 第三行就是我们的请求头,固定这个模式,不用去背,以后添加请求头复制粘贴就行
  4. 第四行就是使用请求头去请求网址
  5. 第五行:请求成功打开网址(urlopen翻译过来就是打开网址的意思啊)
  6. 第六行用read打印内容

3.3 链接解析

我直接以CSDN官网首页为例子。
1.urlparse

from urllib.parse import urlparses=urlparse("https://www.csdn.net/?spm=1011.2124.3001.5359")#解析的网址print(type(s),s)#打印类型和解析结果

看看打印结果:

分析下结果:
ParseResult这个类型对象,打印了六个部分结果:
scheme是协议,这里协议就是https
netloc是域名,域名是啥就步说了吧,自己百度
path是访问路径
params就是参数
query就是查询条件,一般用作get类型的url
fragment就是描点,用于定位页面内部下拉位置
所以网址的标准链接格式就是:

scheme://netloc/path;params?query#fragment

这些能看懂一个网址什么组成的了吧
2.urlunparse
与第一个对立,他接受的参数是可迭代对象,对象长度必须是6

from  urllib.parse import urlunparsedata=["http","www.baidu.com","index.com","user","a=7","comment"]print(urlunparse(data))

结果如下:

这就构造了一个url,当然随便构造一个url是不能正常访问的。对比上面的urlparse,一个是拆分url,这个就是构造url。
3.urlsplit
跟urlparse类似,知识返回结果只有五个,params合并到了path中

from urllib.parse import urlsplits=urlsplit("https://www.csdn.net/?spm=1011.2124.3001.5359")print(type(s),s)

老规矩还是以CSDN首页为例子,看打印结果:

但是呢,SplitResult是元组类型,可以通过索取获得想要的,不用都打印出来:

from urllib.parse import urlsplits=urlsplit("https://www.csdn.net/?spm=1011.2124.3001.5359")# print(type(s),s)print(s.path)print(s.netloc)print(s[1])print(s[3])

这样打印结果姐如下:

4.urlunsplit()
跟上面那个方法类似,这个就是再把各个部分组合成完整的链接,长度必须是5,举例如下:

from urllib.parse import urlunsplitdata=["http","www.csdn.net","/","spm=1011.2124.3001.5359"," "]print(urlunsplit(data))

根据前面打印拆分结果,我再给它复原了,运行结果如下,又得到csdn首页链接了

5.urljoin
就是对链接的补充合并,自己可以多打印几个试试

from urllib.parse import  urljoinprint(urljoin("http://www.baidu.com","index.html"))print(urljoin("http://www.baidu.com","http://www.baidu.com/index.html"))

效果如下:

6.urlencode
跟上面的类似,也是用于构造url
例子如下:

from urllib.parse import urlencodeparms={    "name":"chuan",    "age":"20"}b_url="http://www.baidu.com?"url=b_url+urlencode(parms)print(url)

结果:

7.parse_qs

from urllib.parse import parse_qsu="name=chuan&age=20"print(parse_qs(u))

parse_qs作用就是把得到的get请求参数字符串转为字典,这样便于好看理解。前面都是有序列化,这个就是反无序化。

8.parse_sql

from urllib.parse import parse_qslu="name=chuan&age=20"print(parse_qsl(u))

跟上面第七个方法类似,这个就是返回的列表,列表里装的元组,元组左边为名,右边为值
9.quote

from urllib.parse import quotekey="川川"url="http://www.baidu.com/?wd="+quote(key)print(url)

这个很常见,我的理解就是把中文转换为url格式。对中文进行编码。

10.unquote

from urllib.parse import unquoteurl="http://www.baidu.com/?wd=%E5%B7%9D%E5%B7%9D"print(unquote(url))

它就可以把被编码后的中文还原。

这个模块差不多就这些了,学习爬虫慢慢来,不要一蹴而就。有了这个模块就可以对url解析和构造了。

四、Robots 协议

虽然我在教大家爬虫,但是我还是要声明一下不要什么都去爬,所以我们来看下哪些可以爬,哪些不可以爬,这就要根据robots协议了。(当然我们可能不会完全遵守他的协议,不然爬虫也没啥意思了,自己把握分寸)

首先我们来学会一下如何查看协议,比如我们要访问CSDM网址:

https://www.csdn.net/

查看协议就是:在网址后面加上robots.txt

https://www.csdn.net/robots.txt

输入回车:

看看这个协议的含义:
user-agent:后面是蜘蛛的名称,表示一种代理的意思;
disallowed: 表示禁止,后面的内容蜘蛛禁止抓取;
allowed :表示允许蜘蛛抓取后面文件的内容;

好家伙,CSDN全部不允许爬,哈哈哈,没事,适当爬可以的。

五、万能视频下载

具体我就不说了,这个可以下载几乎百分之就是的网上和平台的视频,自己去尝试(请悄悄使用)
下载安装包:

pip install you_get

与代码同级目录新建一个mp4文件夹。
源代码如下:

import sysfrom you_get import common as you_get#  导入you-get库#  设置下载目录directory=r"mp4//"#  要下载的视频地址url="https://music.163.com/#/mv?id=14306186"#  传参数sys.argv=["you-get","-o",directory,"--format=flv",url]you_get.main()

效果:

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/124797.html

相关文章

  • python爬虫入门(一)

    摘要:想办法区分爬虫程序和正常的用户。爬虫是工具性程序,对速度和效率要求较高。生态圈完善,是最大对手。最要命的是爬虫需要经常修改部分代码。爬虫分类通用爬虫也就是百度搜狐等搜索引擎。原本是为测试来测试网站的,后来成了爬虫工程师最喜爱的工具。 一、爬虫的基本知识: 1. 什么是爬虫 爬虫的英文翻译为spider或者crawder,意为蜘蛛或者爬行者,从字面意思我们可以体会到:爬虫就是把自己当做蜘...

    lentrue 评论0 收藏0
  • 零基础如何学爬虫技术

    摘要:楚江数据是专业的互联网数据技术服务,现整理出零基础如何学爬虫技术以供学习,。本文来源知乎作者路人甲链接楚江数据提供网站数据采集和爬虫软件定制开发服务,服务范围涵盖社交网络电子商务分类信息学术研究等。 楚江数据是专业的互联网数据技术服务,现整理出零基础如何学爬虫技术以供学习,http://www.chujiangdata.com。 第一:Python爬虫学习系列教程(来源于某博主:htt...

    KunMinX 评论0 收藏0
  • 磨刀霍霍:爬爬爬爬爬爬虫爬起来~

    摘要:目标很简单,因为我想要爬一下证券化率,然后可视化输出结果。证券化率的基础就是上市公司的总市值,对于证券化率其实还蛮多说法的,比如雪球的这篇文。我们可以利用这个回调函数来显示当前的下载进度。 写在前面的叨叨 折腾了这么久,我终于在喝完一听快乐肥宅水后下定决心来学习写爬虫了。目标很简单,因为我想要爬一下证券化率,然后可视化输出结果。证券化率的基础就是上市公司的总市值,对于证券化率其实还蛮多...

    Allen 评论0 收藏0
  • Python定向爬虫,模拟新浪微博登录!

    摘要:当我们试图从新浪微博抓取数据时,我们会发现网页上提示未登录,无法查看其他用户的信息。三模拟登录下面将介绍使用获取新浪微博,然后使用提交从而实现模拟登录。 当我们试图从新浪微博抓取数据时,我们会发现网页上提示未登录,无法查看其他用户的信息。模拟登录是定向爬虫制作中一个必须克服的问题,只有这样才能爬取到更多的内容。 showImg(https://segmentfault.com/img/...

    isaced 评论0 收藏0
  • Python爬虫学习路线

    摘要:以下这些项目,你拿来学习学习练练手。当你每个步骤都能做到很优秀的时候,你应该考虑如何组合这四个步骤,使你的爬虫达到效率最高,也就是所谓的爬虫策略问题,爬虫策略学习不是一朝一夕的事情,建议多看看一些比较优秀的爬虫的设计方案,比如说。 (一)如何学习Python 学习Python大致可以分为以下几个阶段: 1.刚上手的时候肯定是先过一遍Python最基本的知识,比如说:变量、数据结构、语法...

    liaoyg8023 评论0 收藏0

发表评论

0条评论

Cobub

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<