爬蟲第三方庫的使用
-
-
- 一、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()函數
(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資訊。
其使用方式為:
(1)headers參數
該參數就是請求頭,通常包含User-Agent,通過該請求頭達到僞裝成浏覽器的目的,其類型為字典。
(2)origin_req_host參數
請求方的host或者是IP位址
(3)unverifiable參數
表示該請求是否是無法驗證的。
(4)method參數
用來訓示請求的方式,是GET還是POST。
3、Robots協定
該協定告訴爬蟲和搜尋引擎,那些界面可以爬取,那些界面是不允許爬取的。
使用robotparser子產品解析robots.txt,該子產品提供RobotFileParser方法:
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
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiIXZ05WZj91YpB3I2EzX4xSZz91ZsAzNfRHLGZkRGZkRfJ3bs92YsczXlpXazxCSXplNk1yS2wWd2UzN2kVN690b102SxVDN1RTNRVHN1A1QiVTQClGVF5UMR9Fd4VGdsATNfd3bkFGazxycykFaKdkYzZUbapXNXlleSdVY2pESa9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL5MGN2MmMkVGZiVGNxQDMiBDNwQzM5UDZxIGZ3kDMzczLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
直接通路robots.txt也可以看出,https://www.baidu.com/link?是不允許被爬取的。
因為urllib()對于cookie驗證和代理服務的處理比較麻煩,故推出requests()方法庫
二、requests庫的介紹與使用
最簡單的一個應用執行個體:
import requests
temp = requests.get('https://www.csdn.net/')
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 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="https://g.csdnimg.cn/tingyun/1.8.5/www-index.js"></script>
<link rel="shortcut icon" href="https://g.csdnimg.cn/static/logo/favicon32.ico" target="_blank" rel="external nofollow" type="image/x-icon"> <link rel="canonical" href="https://www.csdn.net" target="_blank" rel="external nofollow" > <!---->
<meta name="toolbar" content={"type":"0"} />
<meta name="report" content={"spm":"1000.2115"} />
<script src="https://g.csdnimg.cn/??lib/jquery/1.12.4/jquery.min.js,user-tooltip/2.2/user-tooltip.js,lib/qrcode/1.0.0/qrcode.min.js"></script> <script src='//g.csdnimg.cn/common/csdn-report/report.js' type='text/javascript'></script>
<script src="https://g.csdnimg.cn/user-ordercart/2.0.1/user-ordercart.js?ts=2.0.1"></script>
<script src="https://g.csdnimg.cn/login-box/1.1.7/login-box.js"></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:https://blog.csdn.net/?spm=1001.2014.3001.4477
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 = 'https://blog.csdn.net/?spm=1001.2014.3001.4477'
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="https://blog.csdn.net">
<link href="https://g.csdnimg.cn/static/logo/favicon32.ico" 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="https://g.csdnimg.cn/??login-box/1.1.4/login-box.js,login-box/1.1.4/login-auto.js"></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("https://www.csdn.net/",proxies = proxies)
8、逾時設定
設定一個逾時時間,該時間是送出請求到伺服器傳回響應的時間。使用到的參數為timeout。
(1)設定整體時間
(2)單獨設定時間
(3)永久等待
rp = requests.get("https://www.csdn.net/",timeout = None)
或者
rp = requests.get("https://www.csdn.net/")
9、身份驗證
在爬取界面通常會遇到登入的情況,而requests庫在請求時也有對應的解決方案,使用到的參數為:auth,auth的類型是一個元組,裡面包含登入資訊,例如使用者名、密碼等。