文章目錄
通用爬蟲和聚焦爬蟲
通用爬蟲
通用網絡爬蟲 是 捜索引擎抓取系統(Baidu、Google、Yahoo等)的重要組成部分。主要目的是將互聯網上的網頁下載到本地,形成一個互聯網內容的鏡像備份。
通用搜索引擎(Search Engine)工作原理
通用網絡爬蟲 從互聯網中搜集網頁,採集信息,這些網頁信息用於爲搜索引擎建立索引從而提供支持,它決定着 整個引擎系統的內容是否豐富,信息是否即時,因此其性能的優劣直接影響着搜索引擎的效果。
搜索引擎如何獲取一個新網站的URL:
1.新網站向搜索引擎主動提交網址:
2.在其他網站上設置新網站外鏈
3.和DNS解析服務商(如DNSPod等)合作,新網站域名將被迅速抓取。
基本工作流程圖
爬蟲限制
搜索引擎蜘蛛的爬行是被輸入了一定的規則的,它需要遵從一些命令或文件的內容。
- rel=“nofollow”,,告訴搜索引擎爬蟲無需抓取目標頁,同時告訴搜索引擎無需將的當前頁的Pagerank傳遞到目標頁.
- Robots協議(也叫爬蟲協議、機器人協議等),全稱是“網絡爬蟲排除標準”(Robots Exclusion Protocol),網站通過Robots協議告訴搜索引擎哪些頁面可以抓取,哪些頁面不能抓取。
侷限性
- 大多情況下,網頁裏90%的內容對用戶來說都是無用的。
- 搜索引擎無法提供針對具體某個用戶的搜索結果。
- 圖片、數據庫、音頻、視頻多媒體等不能很好地發現和獲取。
- 基於關鍵字的檢索,難以支持根據語義信息提出的查詢,無法準確理解用戶的具體需求。
聚焦爬蟲
聚焦爬蟲,是"面向特定主題需求"的一種網絡爬蟲程序,它與通用搜索引擎爬蟲的區別在於:聚焦爬蟲在實施網頁 抓取時會對內容進行處理篩選,儘量保證只抓取與需求相關的網頁信息。
我們後期要學習的就是聚焦爬蟲
HTTP和HTTPS
HTTP協議-80端口
HyperTextTransferProtocol, 超文本傳輸協議是一種發佈和接收HTML頁面的方法。
HTTPS-443端口
HypertextTransferProtocoloverSecureSocketLayer, 簡單講是HTTP的安全版,在HTTP下加入SSL 層。
HTTP工作原理
網絡爬蟲抓取過程可以理解爲模擬瀏覽器操作的過程。
瀏覽器發送HTTP請求的過程
- 當用戶在瀏覽器的地址欄中輸入一個URL並按回車鍵之後,瀏覽器會向HTTP服務器發送HTTP請求。HTTP請求主要分爲“Get”和“Post”兩種方法。
- 當我們在瀏覽器輸入URLhttp://www.baidu.com的時候,瀏覽器發送一個Request請求去獲取http://www.baidu.com的html文件,服務器把Response文件對象發送回給瀏覽器。
- 瀏覽器分析Response中的HTML,發現其中引用了很多其他文件,比如Images文件,CSS文件,JS文件。瀏覽器會自動再次發送Request去獲取圖片,CSS文件,或者JS文件。
- 當所有的文件都下載成功後,網頁會根據HTML語法結構,完整的顯示出來了。
URL
URL(Uniform/UniversalResourceLocator的縮寫):統一資源定位符,是用於完整地描述Internet上網頁和其他資源的地址的一種標識方法。
基本格式: scheme://host[:port#]/path/…/[?query-string][#anchor]
query-string:參數,發送給http服務器的數據
http://www.baidu.com?wd=python
anchor:錨(跳轉到網頁的指定錨點位置)
客戶端HTTP請求
請求消息
客戶端發送一個HTTP請求到服務器的請求消息,包括以下格式:
請求方法Method
根據HTTP標準,HTTP請求可以使用多種請求方法.
- HTTP0.9:只有基本的文本GET功能。
- HTTP1.0:完善的請求/響應模型,並將協議補充完整,定義了三種請求方法:GET,POST和HEAD方法。
- HTTP1.1:在1.0基礎上進行更新,新增了五種請求方法:OPTIONS,PUT,DELETE,TRACE和CONNECT方法。
Get 和 Post 詳解
- GET是從服務器上獲取數據,POST是向服務器傳送數據
- GET請求參數顯示,都顯示在瀏覽器網址上,即“Get”請求的參數是URL的一部分。
- POST請求參數在請求體當中,消息長度沒有限制而且以隱式的方式進行發送,通常用來向HTTP服務器提交量比較大的數據(比如請求中包含許多參數或者文件上傳操作等),請求的參數包含在“Content-Type”消息頭裏,指明該消息體的媒體類型和編碼。
常用的請求報頭
Host: 主機和端口號
Connection : 客戶端與服務連接類型, 默認爲keep-alive
User-Agent: 客戶瀏覽器的名稱
Accept: 瀏覽器或其他客戶端可以接受的MIME文件類型
Referer:表明產生請求的網頁來自於哪個URL
Accept-Encoding:指出瀏覽器可以接受的編碼方式。
Accept-Language:語言種類
Accept-Charset: 字符編碼
Cookie:瀏覽器用這個屬性向服務器發送Cookie
Content-Type:POST請求裏用來表示的內容類型。
HTTP響應
組成
HTTP響應由四個部分組成,分別是: 狀態行 、 消息報頭 、 空行 、 響應正文
響應狀態碼
常見的狀態碼:
200: 請求成功
302: 請求頁面臨時轉移至新url
307和304: 使用緩存資源
404: 服務器無法找到請求頁面
403: 服務器拒絕訪問,權限不夠
500: 服務器遇到不可預知的情況
Cookie和Session
服務器和客戶端的交互僅限於請求/響應過程,結束之後便斷開,在下一次請求時,服務器會認爲新的客戶端。爲了維護他們之間的鏈接,讓服務器知道這是前一個用戶發送的請求,必須在一個地方保存客戶端的信息。
- Cookie:通過在客戶端記錄的信息確定用戶的身份。
- Session:通過在服務器端記錄的信息確定用戶的身份。
圖片下載器
製作爬蟲的基本步驟
- 需求分析
- 分析網頁源代碼,配合F12
- 編寫正則表達式或者其他解析器代碼
- 正式編寫python爬蟲代碼
需求分析:
"我想要圖片,我又不想上網搜“
“最好還能自動下載”
……
這就是需求,至少要實現兩個功能,一是搜索圖片,二是自動下載。
分析網頁源代碼:
得到圖片地址的位置規律。
編寫正則表達式解析代碼:
pic_url = re.findall('"objURL":"(.*?)",',html,re.S)
編寫爬蟲代碼:
# encoding=utf-8
"""
Date:2019-08-07 10:33
User:LiYu
Email:[email protected]
"""
import os
import re
import requests
imgDir = 'pictures'
def downloadPic(html, keyword):
headers = {
'User-Agent': "Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0"
}
pic_url = re.findall('"objURL":"(.*?)",', html, re.S)
if not pic_url:
print('沒有找到關鍵詞:' + keyword + ' 的圖片...')
else:
count = 0
print("找到關鍵詞:" + keyword + " 的圖片, 現在開始下載圖片...")
for i in pic_url:
# 下載五張
if count >= 5:
break
# 目錄不存在則先創建
if not os.path.exists(imgDir):
print('正在創建目錄:', imgDir)
os.makedirs(imgDir)
# 圖片重命名和目錄拼接
name = keyword + '_' + str(count) + '.' + i.split('.')[-1]
filename = os.path.join(imgDir, name)
# 下載圖片
print('正在下載第 ' + str(count + 1) + ' 張圖片', '圖片地址:' + str(i))
try:
response = requests.get(i, headers=headers)
except Exception as e:
print('[錯誤]', e)
count -= 1
continue
# 保存圖片
with open(filename, 'wb') as f:
f.write(response.content)
count += 1
if __name__ == '__main__':
keyword = input('請輸入你要下載的圖片關鍵字:')
url = 'http://image.baidu.com/search/index?tn=baiduimage&ie=utf-8&word=' + keyword
try:
result = requests.get(url)
except Exception as e:
html = ''
print('[錯誤]', e)
else:
html = result.text
downloadPic(html, keyword)