爬虫第三方库的使用

  • 一、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

python爬取网页链接 python爬网页url_python

直接访问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进入浏览器检查界面:

python爬取网页链接 python爬网页url_html_02

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类型的测试文件。

python爬取网页链接 python爬网页url_css_03

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'))