文章目錄
-
- Python爬蟲————爬蟲基礎
-
-
- 一、爬蟲概述
-
-
- 什麼是爬蟲?
- 網頁三大特征:
- 爬蟲設計思路
-
- 二、通用爬蟲和聚焦爬蟲
-
-
- 通用爬蟲
- 聚焦爬蟲
-
- 三、HTTP和HTTPS
-
-
- HTTP工作原理
- URL
-
- 四、用戶端HTTP請求
-
-
- 請求方法Method
- Get 和 Post 詳解
- 常用的請求報頭
-
- 五、HTTP響應
-
-
- 響應狀态碼
- Cookie和Session
-
- 六、BS4
-
-
- BS4簡介
- BS4的4種對象
-
- 七、執行個體:圖檔下載下傳器
-
-
- 制作爬蟲的基本步驟
- 需求分析
- 代碼實作
-
-
Python爬蟲————爬蟲基礎
一、爬蟲概述
什麼是爬蟲?
爬蟲就是抓取網頁資料的程式。
網頁三大特征:
1.網頁都有自己的為唯一的URL(統一資源定位符)來進行定位;
2.網頁都使用HTML(超文本标記語言)來描述頁面資訊;
3.網頁都使用HTTP/HTTPS(超文本傳輸協定)來傳輸HTML資料。
爬蟲設計思路
1.首先确定需要爬取的網頁URL位址。
2.通過HTTP/HTTPS協定來擷取對應的HTML頁面。
3.提取HTML頁面裡有用的資料:
1)如果是需要的資料,就儲存起來。
2)如果是頁面的其他URL,繼續執行第二步。
二、通用爬蟲和聚焦爬蟲
通用爬蟲
通用網絡爬蟲 是 捜索引擎抓取系統(Baidu、Google、Yahoo等)的重要組成部分。主要目的是将網際網路上的網 頁下載下傳到本地,形成一個網際網路内容的鏡像備份。
通用網絡爬蟲 從網際網路中搜集網頁,采集資訊,這些網頁資訊用于為搜尋引擎建立索引進而提供支援,它決定着 整個引擎系統的内容是否豐富,資訊是否即時,是以其性能的優劣直接影響着搜尋引擎的效果。

搜尋引擎如何擷取一個新網站的URL:
1. 新網站向搜尋引擎主動送出網址:
2. 在其他網站上設定新網站外鍊
3. 和DNS解析服務商(如DNSPod等)合作,新網站域名将被迅速抓取。
通用爬蟲的局限性
1.大多情況下,網頁裡90%的内容對使用者來說都是無用的。
2. 搜尋引擎無法提供針對具體某個使用者的搜尋結果。
3. 圖檔、資料庫、音頻、視訊多媒體等不能很好地發現和擷取。
4. 基于關鍵字的檢索,難以支援根據語義資訊提出的查詢,無法準确了解使用者的具體需求。
聚焦爬蟲
聚焦爬蟲,是"面向特定主題需求"的一種網絡爬蟲程式,它與通用搜尋引擎爬蟲的差別在于:聚焦爬蟲在實施網頁 抓取時會對内容進行處理篩選,盡量保證隻抓取與需求相關的網頁資訊。
三、HTTP和HTTPS
HTTP協定-80端口
HyperTextTransferProtocol, 超文本傳輸協定是一種釋出和接收HTML頁面的方法。
HTTPS-443端口
HypertextTransferProtocoloverSecureSocketLayer, 簡單講是HTTP的安全版,在HTTP下加入SSL 層。
HTTP工作原理
網絡爬蟲抓取過程可以了解為模拟浏覽器操作的過程。
浏覽器發送HTTP請求的過程:
- 當使用者在浏覽器的位址欄中輸入一個URL并按Enter鍵之後,浏覽器會向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]
四、用戶端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
伺服器和用戶端的互動僅限于請求/響應過程,結束之後便斷開,在下一次請求時,伺服器會認為新的用戶端。為了維護他們之間的連結,讓伺服器知道這是前一個使用者發送的請求,必須在一個地方儲存用戶端的資訊。
六、BS4
BS4簡介
Beautiful Soup提供一些簡單的、python式的函數用來處理導航、搜尋、修改分析樹等功能。它是一個
工具箱,通過解析文檔為tiful Soup自動将輸入文檔轉換為Unicode編碼,輸出文檔轉換為utf-8編碼。
你不需要考慮編碼方式,除非文檔沒有指定一個編一下原始編碼方式就可以了。
BS4的4種對象
Beautiful Soup将複雜HTML文檔轉換成一個複雜的樹形結構,
每個節點都是Python對象,所有對象可以歸納為4種: Tag , NavigableString , BeautifulSoup , Comment
2-1. BeautifulSoup對象
2-2. Tag對象
Tag就是html中的一個标簽,用BeautifulSoup就能解析出來Tag的具體内容,具體的格式為soup.name,其中name是html下的标簽。
七、執行個體:圖檔下載下傳器
制作爬蟲的基本步驟
- 需求分析
- 分析網頁源代碼,配合F12
- 編寫正規表達式或者其他解析器代碼
- 正式編寫python爬蟲代碼
需求分析
"我想要圖檔,我又不想上網搜“
“最好還能自動下載下傳”
……
這就是需求,至少要實作兩個功能,一是搜尋圖檔,二是自動下載下傳。
pic_url = re.findall(’“objURL”:"(.*?)",’,html,re.S)
代碼實作
"""
圖檔下載下傳器
"""
# -*- coding:utf-8 -*-
import re
import requests
import os
def downloadPic(html, keyword):
"""
:param html: 頁面的源代碼
:param keyword: 搜尋的關鍵字
:return:
"""
# (.*?)代表任意多個字元
# ()代表分組, 值傳回符合條件的字元串中括号裡面的内容;
pic_url = re.findall('"objURL":"(.*?)",', html, re.S)[:5]
count = 0
print('找到關鍵詞:' + keyword + '的圖檔,現在開始下載下傳圖檔...')
# each 是每個圖檔的url位址
for each in pic_url:
try:
headers = {
'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) '
'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.109 '
'Mobile Safari/537.36'}
# 擷取指定圖檔的相應對象;
response = requests.get(each, timeout=10, headers=headers)
except requests.exceptions.ConnectionError:
print('【錯誤】目前圖檔無法下載下傳')
continue
except Exception as e:
print('【錯誤】目前圖檔無法下載下傳')
print(e)
continue
else:
# print(response.status_code)
if response.status_code != 200:
print("通路失敗: ", response.status_code)
continue
# ******** 存儲圖檔到本地*******************************
if not os.path.exists(imgDir):
print("正在建立目錄 ", imgDir)
os.makedirs(imgDir)
posix = each.split('.')[-1]
if posix not in ['png', 'jpg', 'gif', 'jpeg']:
break
print('正在下載下傳第' + str(count + 1) + '張圖檔,圖檔位址:' + str(each))
name = keyword + '_' + str(count) + '.' + posix
filename = os.path.join(imgDir, name)
count += 1
with open(filename, 'wb') as f:
# response.content: 傳回的是二進制文本資訊
# response.text:傳回的字元串文本資訊
f.write(response.content)
if __name__ == '__main__':
imgDir = 'pictures'
word = input("Input key word: ")
url = 'http://image.baidu.com/search/index?tn=baiduimage&ps=1&ct=201326592&lm=-1&cl=2&nc=1&ie=utf-8&word=' + word
try:
response = requests.get(url)
except Exception as e:
print(e)
content = ''
else:
content = response.text
downloadPic(content, word)