爬虫第三方库的使用
- 一、urllib库的介绍与使用
- 1、urlopen()方法
- 2、Request()方法
- 3、Robots协议
- 二、requests库的介绍与使用
- 1、GET请求
- 2、POST请求
- 3、文件上传
- 4、Cookies
- 5、会话维持
- 6、SSL证书验证
- 7、代理设置
- 8、超时设置
- 9、身份验证
一、urllib库的介绍与使用
1、urlopen()方法
使用该方法模拟浏览器向服务器发送请求,该方法处理授权验证、重定向、浏览器cookie以及其他内容。
使用方法如下:
#导入urllib库
import urllib.request
#爬取百度搜索首页
response = urllib.request.urlopen('https://www.baidu.com')
#打印爬取的内容
print(response.read().decode('utf-8'))
print(response)
【运行结果】
<html>
<head>
<script>
location.replace(location.href.replace("https://","http://"));
</script>
</head>
<body>
<noscript><meta http-equiv="refresh" content="0;url=http://www.baidu.com/"></noscript>
</body>
</html>
<http.client.HTTPResponse object at 0x0000025895475EB8>
可以看出,该方法爬取到网页的源代码,返回值response的类型为HTTPResponse,该类型主要有以下方法:read(),readinto(),getheader(name),getheaders(),fileno()。
以上是urlopen最简单的用法,下面来详细介绍以下urlopen()函数
urllib.request.urlopen(url,data = None,timeout,cafile = None,capath = None,context = None)
(1)data参数
data参数是可选可不选的,如果选择data,data的类型必须为bytes类型,一般使用bytes()方法进行类型转换。选择data参数时,请求方式为POST,不选择data时,请求方法为GET。
(2)timeout参数
设置的超时时间,如果请求超过了设置的timeout,还没有得到响应,则抛出异常。
(3)cafile和capath参数
指定CA证书和其路径。
(4)context参数
指定SSL设置,类型必须为ssl.SSLContext。
2、Request()方法
该方法主要是在请求时加入了Headers信息。
其使用方式为:
urllib.request.Request(url,data = None,headers = {},origin_req_host = None,unverifiable = False,method = None)
(1)headers参数
该参数就是请求头,通常包含User-Agent,通过该请求头达到伪装成浏览器的目的,其类型为字典。
(2)origin_req_host参数
请求方的host或者是IP地址
(3)unverifiable参数
表示该请求是否是无法验证的。
(4)method参数
用来指示请求的方式,是GET还是POST。
3、Robots协议
该协议告诉爬虫和搜索引擎,那些界面可以爬取,那些界面是不允许爬取的。
使用robotparser模块解析robots.txt,该模块提供RobotFileParser方法:
urllib.robotparser.RobotFileParser(url="")
from urllib.robotparser import RobotFileParser
temp = RobotFileParser("https://www.baidu.com/robots.txt")
temp.read()
print(temp.can_fetch('*','https://www.baidu.com/link?'))
【运行结果】
False
直接访问robots.txt也可以看出,https://www.baidu.com/link?是不允许被爬取的。
因为urllib()对于cookie验证和代理服务的处理比较麻烦,故推出requests()方法库
二、requests库的介绍与使用
最简单的一个应用实例:
import requests
temp = requests.get('')
print(type(temp)) #打印temp的数据类型
print(temp.status_code)#打印响应状态码
print(temp.cookies) #打印Cookies
print(temp.text) #打印爬取内容
【运行结果】
<class 'requests.models.Response'>
200
<RequestsCookieJar[<Cookie dc_session_id=10_1629708229451.640122 for .csdn.net/>, <Cookie uuid_tt_dd=10_18646630710-1629708229451-326208 for .csdn.net/>, <Cookie csrfToken=znQtNTJ5Z2tit_oJJtdTvb8V for www.csdn.net/>]>
<!doctype html><html lang="zh" data-server-rendered="true"><head><title>CSDN - 专业开发者社区</title> <meta name="keywords" content="CSDN博客,CSDN学院,CSDN论坛,CSDN直播"> <meta name="description" content="CSDN是全球知名中文IT技术交流平台,创建于1999年,包含原创博客、精品问答、职业培训、技术论坛、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区."> <meta http-equiv="content-type" content="text/html;charset=utf-8"> <meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no, minimal-ui"> <meta name="referrer" content="always"> <!----> <!----> <!----> <!----> <!----> <!---->
<script src=""></script>
<link rel="shortcut icon" href="" type="image/x-icon"> <link rel="canonical" href=""> <!---->
<meta name="toolbar" content={"type":"0"} />
<meta name="report" content={"spm":"1000.2115"} />
<script src=""></script> <script src='//g.csdnimg.cn/common/csdn-report/report.js' type='text/javascript'></script>
<script src=""></script>
<script src=""></script>
......
下面我们详细了解requests库的各种请求用法。
1、GET请求
这里我们给出一个测试网站:http://httpbin.org/get,对该网站发起GET请求:
import requests
rp = requests.get("http://httpbin.org/get")
print(rp.text)
【运行结果】
{
"args": {},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.25.1",
"X-Amzn-Trace-Id": "Root=1-6123623a-1cc64df4378b3f9913a68485"
},
"origin": "111.36.128.31",
"url": "http://httpbin.org/get"
}
该网站是测试网站,数据采用JSON数据格式存储,当我们发送GET请求时,在请求加上参数,请求方式可以写成如下方式:
import requests
data = {
'name':'little fox',
'age':20
}
rp = requests.get("http://httpbin.org/get",params = data)
print(rp.text)
print(type(rp.text)) #打印获取数据的类型
【运行结果】
{
"args": {
"age": "20",
"name": "little fox"
},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.25.1",
"X-Amzn-Trace-Id": "Root=1-61236364-0e7ea320083f082b7db5ace5"
},
"origin": "111.36.128.31",
"url": "http://httpbin.org/get?name=little+fox&age=20"
}
<class 'str'>
从运行结果也可以看出,该请求方式实际上是向服务器发送的该URL(http://httpbin.org/get?name=little+fox&age=20)的请求。
获取数据的类型为<class ‘str’>,对于该类型数据的处理是使用JSON()方法,将格式转化为字典类型。
引入headers参数
引入该参数的目的是将爬虫访问伪装成浏览器访问,避免服务器识别出请求为爬虫,从而禁止爬取。
此处添加的headers参数主要是User-Agent,以爬取CSDN首页为例:
URL:
User-Agent查看方法:
在首页界面按F12进入浏览器检查界面:
import requests
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36'
}
url = ''
rp = requests.get(url = url,headers = headers)
print(rp.text)
【运行结果】
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=Edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no">
<meta name="apple-mobile-web-app-status-bar-style" content="black">
<meta name="referrer"content="always">
<meta name="msvalidate.01" content="3189512127C34C46BC74BED5852D45E4" />
<title>CSDN博客 - 专业IT技术发表平台</title>
<meta data-n-head="true" data-hid="description" name="description" content="CSDN博客为中国软件开发者、IT从业人员、IT初学者打造交流的专业IT技术发表平台,全心致力于帮助开发者通过互联网分享知识,让更多开发者从中受益,一同和IT开发者用代码改变未来.">
<script src='//g.csdnimg.cn/tingyun/1.8.3/www.js' type='text/javascript'></script>
<link ref="canonical" href="">
<link href="" rel="shortcut icon" type="image/x-icon"/>
<link rel="stylesheet" href="//csdnimg.cn/public/common/toolbar/content_toolbar_css/content_toolbar.css">
<link rel="stylesheet" href="//csdnimg.cn/public/common/libs/bootstrap/css/bootstrap.min.css">
<link rel="stylesheet" href="//csdnimg.cn/public/static/css/avatar.css">
<link href="//g.csdnimg.cn/nav-second/1.0.3/css/nav-second.css" type="text/css" rel="stylesheet">
<script src="//csdnimg.cn/public/common/libs/jquery/jquery-1.9.1.min.js" type="text/javascript"></script>
<link href='/css/csdn_feed.css?1627614636' rel='stylesheet' />
<meta name="report" content='{"spm":"1001.2100"}'>
</head>
<body data-category="home" data-host_type="blog">
<script src="//g.csdnimg.cn/common/csdn-toolbar/csdn-toolbar.js" type="text/javascript"></script>
<script src=""></script>
<div class="container clearfix">
<nav id="nav" class="clearfix"></nav>
<div class="fixed_content" id="mainContent">
<!--头部banner广告 begin-->
<!--头部banner广告end-->
<main>
<!DOCTYPE html>
<div class="carousel">
<div class="carousel-left">
<div id="myCarousel" class="slide" data-ride="carousel">
<!-- Indicators -->
<ol class="carousel-indicators">
<li data-target="#myCarousel" data-slide-to="0" class="active"></li>
<li data-target="#myCarousel" data-slide-to="1" class=""></li>
<li data-target="#myCarousel" data-slide-to="2" class=""></li>
</ol>
<div class="carousel-inner" role="listbox" data-report-view='{"mod":"popu_465","strategy":""}'>
......
2、POST请求
import requests
data = {
'name':'little fox',
'age':20
}
rp = requests.post("http://httpbin.org/get",params = data)
print(rp.text)
print(type(rp.text)) #打印获取数据的类型
【运行结果】
{
"args": {},
"data": "",
"files": {},
"form": {
"age": "20",
"name": "little fox"
},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Content-Length": "22",
"Content-Type": "application/x-www-form-urlencoded",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.25.1",
"X-Amzn-Trace-Id": "Root=1-612369a5-1fd9709e318dd6dd21736dca"
},
"json": null,
"origin": "111.36.128.31",
"url": "http://httpbin.org/post"
}
<class 'str'>
在返回结果中,我们可以看到form中就是我们使用表单提交的数据。
3、文件上传
requests可以模拟一些数据的上传,因此也可以向网站上传一些文件。
例如上传一个txt类型的测试文件。
import requests
files = {'file':open('reauests测试文件.txt','rb')}
rp = requests.post('http://httpbin.org/post',files = files)
print(rp.text)
【运行结果】
{
"args": {},
"data": "",
"files": {
"file": "reauests\u6d4b\u8bd5\u6587\u4ef6"
},
"form": {},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Content-Length": "210",
"Content-Type": "multipart/form-data; boundary=7d7ca86cec7b89327059ba0e878a6778",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.25.1",
"X-Amzn-Trace-Id": "Root=1-61236c63-7cde90c158366b4b40ded960"
},
"json": null,
"origin": "111.36.128.31",
"url": "http://httpbin.org/post"
}
4、Cookies
这里我们介绍两种Cookies获取方法
第一种:
import requests
rp = requests.get("https://www.baidu.com")
print(rp.cookies)
for (key,value) in rp.cookies.items():
print(key + '=' + value)
【运行结果】
<RequestsCookieJar[<Cookie BDORZ=27315 for .baidu.com/>]>
BDORZ=27315
第二种:
5、会话维持
使用Session对象,进行会话的维持。
import requests
s = requests.Session()
s.get("http://httpbin.org/cookies/set/age/20")
rp = s.get("http://httpbin.org/cookies")
print(rp.text)
【运行结果】
{
"cookies": {
"age": "20"
}
}
使用Session对象可以方便的维护一个会话,而不用担心Cookies问题。
6、SSL证书验证
当爬取一个不具备SSL证书的网站时,通常会报SSL Error的错误,这是因为在爬取发送请求,默认检查网站是否具有SSL证书,如果要解决此错误,可在发送请求时,将参数verify设置为False。
7、代理设置
在进行大规模爬取时,网站可能会弹出验证码,或者是跳转到登录界面,还可能封禁IP等反爬机制,为了防止出现这种情况,通常设置代理来进行大规模的爬取,使用到的参数为proxies。
import requests
proxies = {
"http":"http://10.0.0.1:8888", #此处设置为自己的有效代理
}
requests.get("",proxies = proxies)
8、超时设置
设置一个超时时间,该时间是发出请求到服务器返回响应的时间。使用到的参数为timeout。
(1)设置整体时间
rp = requests.get("",timeout = 1)
(2)单独设置时间
rp = requests.get("",timeout = (5,20)) #5代表连接阶段的时间,20代表读取阶段的时间
(3)永久等待
rp = requests.get("",timeout = None)
或者
rp = requests.get("")
9、身份验证
在爬取界面通常会遇到登录的情况,而requests库在请求时也有对应的解决方案,使用到的参数为:auth,auth的类型是一个元组,里面包含登录信息,例如用户名、密码等。
rp = requests.get("",auth = ('littlefox','123456789'))