爬虫之祖urlib 简易教程

目录

一、前言框架

二、网址请求

2.1 打开网址

2.2 超时设置

2.3 错误抓取

三、更深请求

3.1 打开网址

3.2 请求头添加

3.3 链接解析

四、Robots 协议

         五.万能视频下载 

          小彩蛋


一、前言框架

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

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

二、网址请求

2.1 打开网址

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

https://blog.csdn.net/qq_25990967/article/details/121366143?spm=1001.2014.3001.5501

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

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

运行结果:

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

import urllib.request  
response = urllib.request.urlopen('https://blog.csdn.net/qq_25990967/article/details/121366143?spm=1001.2014.3001.5501')  
print(response.status)  

运行:

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

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

运行:

不出所料,失败了,这也没关系,正常的。 

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.request
request = 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 request
url='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 urlparse
s=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 urlunparse
data=['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 urlsplit
s=urlsplit('https://www.csdn.net/?spm=1011.2124.3001.5359')
print(type(s),s)

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

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

from urllib.parse import urlsplit
s=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 urlunsplit
data=['http','www.csdn.net','/','spm=1011.2124.3001.5359',' ']
print(urlunsplit(data))

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

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

from urllib.parse import  urljoin
print(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 urlencode
parms={'name':'benxiaohai','age':'21'
}
b_url='http://www.baidu.com?'
url=b_url+urlencode(parms)
print(url)

结果:

7.parse_qs

from urllib.parse import parse_qs
u='name=benxiaohai&age=21'
print(parse_qs(u))

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

8.parse_sql

from urllib.parse import parse_qsl
u='name=benxiaoh&age=21'
print(parse_qsl(u))

效果: 

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

from urllib.parse import quote
key='笨小孩'
url='http://www.baidu.com/?wd='+quote(key)
print(url)

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

10.unquote

from urllib.parse import unquote
url='http://www.baidu.com/?wd=%E7%AC%A8%E5%B0%8F%E5%AD%A9'
print(unquote(url))

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

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

四、Robots 协议

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

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

https://www.csdn.net/

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

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

输入回车:

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

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

五.万能视频下载 

一下代码只能在pycharm里运行!!!

首先介绍一下you-get库,非常的强大!hhhhhhh

安装方法:

pip install you_get

下载代码:

import sys
from 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()

输出:

 小彩蛋

import sys
from you_get import common as you_getwhile True:tar=input(r'请输入保存地址:')url = input('请输入视频网址:')if 'bilibili' in url:sys.argv = ['you_get', '-o', tar, '--format=dash-flv', url]elif 'iqiyi' in url:sys.argv = ['you-get', '-o', tar, '--format=SD', url]elif 'youku' in url:sys.argv = ['you-get', '-o', tar, '--format=mp4hd', url]else:passyou_get.main()print('sucessfull')a = input('是否继续?继续按1,否则按2:')if a == '2':break
print('下载成功!!')

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/565259.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【youcans 的 OpenCV 学习课】12. 彩色图像的处理

专栏地址:『youcans 的图像处理学习课』 文章目录:『youcans 的图像处理学习课 - 总目录』 【youcans 的 OpenCV 学习课】12.彩色图像的处理 文章目录【youcans 的 OpenCV 学习课】12.彩色图像的处理1. 图像的颜色空间转换图像的色彩空间基础图像的颜色空…

炫酷线条背景动画

使用H5的Canvas实现网页的炫酷线条背景特效。 效果演示 代码展示 html内容 <!DOCTYPE html> <html > <head> <meta charset"UTF-8"> <title></title><style> canvas{position:absolute;top:0;left:0;background-colo…

MATLAB教程(1) MATLAB 基础知识(3)

第五部分&#xff1a;文本和字符 文本和字符- MATLAB & Simulink- MathWorks 中国 在处理文本时&#xff0c;将其中的字符序列用单引号括起来&#xff0c;可以将文本分配给变量。 例如&#xff1a;myText Hello, world如果文本本身包括一个单引号&#xff0c;则在定义时…

没有bug队——加贝——Python 练习实例 9,10

9.题目&#xff1a; 暂停一秒输出。 程序分析&#xff1a;使用 time 模块的 sleep() 函数。 注&#xff1a;dict.items表示取出字典中的值 代码&#xff1a; #9 import timemyD {1: a, 2: b} for key, value in dict.items(myD):print (key, value)time.sleep(1) # 暂停 …

Spring Boot Data JPA

Spring Data JPA简介 用来简化创建 JPA 数据访问层和跨存储的持久层功能。 Spring Data JPA提供的接口 Repository&#xff1a;最顶层的接口&#xff0c;是一个空的接口&#xff0c;目的是为了统一所有Repository的类型&#xff0c;且能让组件扫描的时候自动识别。 CrudRep…

MATLAB教程(1) MATLAB 基础知识(4)

第七部分&#xff1a;二、三维图 二维图和三维图- MATLAB & Simulink- MathWorks 中国 折线图 &#xff08;1&#xff09; 画图 x 0:pi/1000:2*pi; y sin(x); plot(x,y) 这里x就用到了前面说到的索引。x表示0到2*pi之间步长为pi/100的值。 二维图如下&#xff1a; 这里…

现在能不能升级鸿蒙,能不能升级鸿蒙系统?

电梯直达huafen185613402初窥门径发表于 2021-2-28 14:28:33来自&#xff1a;华为Mate 10 Pro最新回复 2021-2-28 17:34:28这个手机现在性能还非常好呀&#xff0c;期待能够给予鸿蒙系统升级产品型号BLA-AL00出现频率总是问题类型其他应用名称Android 系统应用版本10系统版本BL…

Spring Boot MyBatis

MyBatis简介 MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache 迁移到了google code&#xff0c;并且改名为MyBatis 。 集成spring boot 的时候必须在mapper接口上面标注Mapper注解 项目图片 pom.xml 只需要在pom.xml引入需要的数据库配置&#xff0c;就会…

没有bug队——加贝——Python 练习实例 11,12

11.题目&#xff1a; 古典问题&#xff1a;有一对兔子&#xff0c;从出生后第3个月起每个月都生一对兔子&#xff0c;小兔子长到第三个月后每个月又生一对兔子&#xff0c;假如兔子都不死&#xff0c;问每个月的兔子总数为多少&#xff1f; 程序分析&#xff1a;兔子的规律为…

Spring Boot JDBC

JDBC详解 Java Data Base Connectivity,是一种用于执行SQL语句的Java API&#xff0c;可以为多种关系数据库提供统一访问&#xff0c;它由一组用Java语言编写的类和接口组成。不管是Hibernate&#xff0c;还是JPA或者MyBatis都是对JDBC做了一次封装。 Spring简化了JDBC那些内…

没有bug队——加贝——Python 练习实例 13,14

今天水一天&#xff0c;看了看这两道题&#xff0c;感觉没啥好注意的了&#xff0c;或许是我归被窝的心似箭吧&#xff0c;哈哈哈哈&#xff0c;如果我想起了有补充的&#xff0c;我再出被窝。。。 13.题目&#xff1a; 打印出所有的"水仙花数"&#xff0c;所谓&qu…

Spring Boot 热部署 devtools模块

devtools模块详解 devtools模块&#xff0c;是为开发者服务的一个模块。主要的功能就是代码修改后一般在5秒之内就会自动重新加载至服务器&#xff0c;相当于restart成功。 简单原理 在发现代码有更改之后&#xff0c;自动重新启动应用&#xff0c;但是其速度比手动停止后再…

零基础入门Matlab(补充)

目录 1.界面认识 2.变量命名 3.数据类型 4.元胞数组和结构体 5.矩阵操作 6.程序结构 7.基本绘图操作 7.1.二维平面绘图 7.2.三维立体绘图 8.图形的保存与导出 9.补充 1.界面认识 2.变量命名 注&#xff1a;Matlab中的注释 %% 独占一行的注释&#xff08;有上下横线…

html5中隐藏段落,html怎么隐藏p标签

html隐藏p标签的方法&#xff1a;1、给p标签添加hidden属性&#xff0c;语法“”&#xff1b;2、在p标签中使用style属性&#xff0c;添加“display: none”或“visibility: hidden”样式。”&#xff1b;2、在p标签中使用style属性&#xff0c;添加“display: none”或“visib…

Dev C++详细安装教程

Dev-C是一个Windows环境下的一个适合于初学者使用的轻量级 C/C 集成开发环境&#xff08;IDE&#xff09;。它是一款自由软件&#xff0c;遵守GPL许可协议分发源代码。它集合了MinGW中的GCC编译器、GDB调试器和 AStyle格式整理器等众多自由软件。 Dev C 5.11 简体中文版下载地…

没有bug队——加贝——Python 练习实例 15,16

目录 15.题目&#xff1a; 16.题目&#xff1a; 15.题目&#xff1a; 利用条件运算符的嵌套来完成此题&#xff1a;学习成绩>90分的同学用A表示&#xff0c;60-89分之间的用B表示&#xff0c;60分以下的用C表示。 程序分析&#xff1a;程序分析&#xff1a;(a>b) ? …

普通html和vue单选框的样式,vue2实现自定义样式radio单选框

先上效果主编已回复:{{item.label}}js:data() {return {radio: 1,radios:[{label: 是,value:1,isChecked: true,},{label: 否,value:2,isChecked: false,},{label: 全部,value:3,isChecked: false,},]}},methods: {check(index) {// 先取消所有选中项this.radios.forEach((item…

Dev C++详细配置

首先在我们进行Dev C配置之前&#xff0c;Dev C一定是安装完毕的。 Dev C安装完毕 点击Finish进行Dev C的配置 首次使用 Dev C 还需要简单的配置&#xff0c;包括设置语言、字体、和主题风格。 第一次启动 Dev C 后&#xff0c;提示选择语言。 这里我们选择简体中文&#x…

用html编写一幅简单的画,使用html5画简单的折线图

//得到画布var can1document.getElementByIdx_x_x_x("can");//得到画笔var cxtcan1.getContext("2d");//定义图表的数据&#xff0c;该方式为创建数组直接量的方式var sale_data[80,92,104,110,68,50,45,90,74,98,103];//首先为背景进行设置渐变的效果,表示…

没有bug队——加贝——Python 练习实例 17,18

17.题目&#xff1a; 输入一行字符&#xff0c;分别统计出其中英文字母、空格、数字和其它字符的个数。 程序分析&#xff1a;利用 while 或 for 语句,条件为输入的字符不为 \n。 注&#xff1a;char:字符串个数&#xff1b;space&#xff1a;空格个数&#xff1b;diagt&…