天天看點

python網絡爬蟲——爬蟲第三方庫的使用(二)

爬蟲第三方庫的使用

      • 一、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
           
python網絡爬蟲——爬蟲第三方庫的使用(二)

直接通路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進入浏覽器檢查界面:

python網絡爬蟲——爬蟲第三方庫的使用(二)
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類型的測試檔案。

python網絡爬蟲——爬蟲第三方庫的使用(二)
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
           

第二種:

python網絡爬蟲——爬蟲第三方庫的使用(二)

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的類型是一個元組,裡面包含登入資訊,例如使用者名、密碼等。