爬虫之祖urlib 简易教程
目录
一、前言框架
二、网址请求
2.1 打开网址
2.2 超时设置
2.3 错误抓取
三、更深请求
3.1 打开网址
3.2 请求头添加
3.3 链接解析
四、Robots 协议
五.万能视频下载
小彩蛋
一、前言框架
我们来学一下爬虫之祖urlib,不管你什么模块都是起源于该模块。
urlib库有几个模块,依次如下:
- request :用于请求网址的模块
- error:异常处理模块
- parse:用于修改拼接等的模块
- 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'))
说一下每一行大概是什么。
- 第一行导入模块
- 第二行用Requests请求网址
- 第三行再用urlopen打开网址
- 第四行用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'))
大概说一些每一行的例子:
- 第一行从库导入模块
- 第二行就是我们需要请求的网址
- 第三行就是我们的请求头,固定这个模式,不用去背,以后添加请求头复制粘贴就行
- 第四行就是使用请求头去请求网址
- 第五行:请求成功打开网址(urlopen翻译过来就是打开网址的意思啊)
- 第六行用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('下载成功!!')
爬虫之祖urlib 简易教程相关推荐
- qmake 简易教程
qmake 简易教程 qmake是Qt开发中默认的构建工具. posted on 2018-05-27 00:09 JichengTang 阅读(...) 评论(...) 编辑 收藏 转载于:http ...
- eslint不报错 vue_【简易教程】基于Vue-cli使用eslint指南
插件安装 首先在vscode插件中搜索eslint和prettier. 啥也不管,这俩必须得装. 插件简介 vscode插件库里的eslint是用来在你写代码的时候就直接给你报错.(vue-cli中的 ...
- Ocelot简易教程(一)之Ocelot是什么
Ocelot简易教程(一)之Ocelot是什么 原文:Ocelot简易教程(一)之Ocelot是什么 作者:依乐祝 原文地址:https://www.cnblogs.com/yilezhu/p/955 ...
- 安装python程序后要进行什么设置-安装好Pycharm后如何配置Python解释器简易教程...
这两天有许多Python小白加入学习群,并且问了许多关于Pycharm基本使用的问题,今天小编就以配置Python解释器的问题给大家简单絮叨一下. 1.一般来说,当我们启动Pycharm,如果Pych ...
- ST单片机使用ST Visual Programmer软件烧录程序简易教程
文章原始地址: http://feotech.com/?p=100 ST单片机使用ST Visual Programmer软件烧录程序简易教程 ST Visual Programmer 是ST公司为自 ...
- mysql游标进阶_mysql进阶(三)游标简易教程
mysql游标简易教程 从mysql V5.5开始,进行了一次大的改变,就是将InnoDB作为默认的存储引擎.InnoDB支持事务,而且拥有相关的RDBMS特性:ACID事务支持,数据完整性(支持外键 ...
- Android开发简易教程
Android开发简易教程 Android 开发因为涉及到代码编辑.UI 布局.打包等工序,有一款好用的IDE非常重要.Google 最早提供了基于 Eclipse 的 ADT 作为开发工具,后来在2 ...
- 文件上传利器SWFUpload入门简易教程
凡做过网站开发的都应该知道表单file的确鸡肋. Ajax解决了不刷新页面提交表单,但是却没有解决文件上传不刷新页面,当然也有其它技术让不刷新页面而提交文件,该技术主要是利用隐藏的iFrame, 较A ...
- 【简易教程】基于Vue-cli使用eslint指南
[简易教程]基于Vue-cli使用eslint指南 插件安装 首先在vscode插件中搜索eslint和prettier. 啥也不管,这俩必须得装. 插件简介 vscode插件库里的eslint是用来 ...
最新文章
- 红米note2移动4g在哪里显示无服务器,红米note2移动版能用联通4g吗?红米note2插联通卡用法介绍...
- python网页请求_python用post请求网页
- react todolist代码优化
- 普通用户安装nginx
- sqlplus / as sysdba 提示权限不足(ORA-01031)问题处理
- 布隆过滤器及其数学推导
- yum安装报错Error:Nothing to do
- VHDL 四选一数据选择器
- QT 调用OCX控件
- 给大家推荐几本最优秀的编程书
- 10.计算机基础之程序设计基础
- u盘盘符不显示 win10_win10系统u盘不显示盘符的解决方法
- 招商银行笔试题之解码方法
- 泰国将于5月1日全面开放,来曼谷骑行探索老城区
- Linux管道通信多次读写,linux进程通信之(二):管道的读与写
- java求出1~100之间,既是3又是7的倍数的自然数出现的次数?
- FFmpeg屏幕录制
- Python实现地图四色原理的遗传算法(GA)着色实现
- 论文阅读|训练过程中动态改变训练方案的Dynamic R-CNN
- iOS 设置模拟器支持定位功能
热门文章
- 萝卜家园win11系统32位微软原版镜像v2021.08
- PP视频如何设置默认缓存个数
- jar包在windows后台运行,通过.bat文件
- Shiro——RememberMe
- 查看分支编码_MySQL分支数据库MariaDB之CentOS安装教程
- java判断对象无数据_java 对象属性不能为空判断
- mysql合并多条纪录字段_mysql合并多条记录的单个字段去一条记录
- 线程被中断跟被阻塞有什么区别_宠物加盟店跟自营店有什么区别
- 云麦体脂秤华为体脂秤_华为、小米和有品体脂秤哪个品牌好?三款智能体脂秤横评结果排行...
- 高并发负载均衡——网络协议原理