爬蟲的入門基礎(chǔ)
什么是爬蟲挽懦?
網(wǎng)絡(luò)爬蟲(又被成為網(wǎng)頁蜘蛛,網(wǎng)絡(luò)機器人)约郁,就是模擬客戶端發(fā)起網(wǎng)絡(luò)請求,接收請求的響應(yīng)但两,按照一定的個規(guī)則鬓梅,自動的抓取互聯(lián)網(wǎng)信息的程序
爬蟲的基本流程
分析網(wǎng)站,得到目標url
根據(jù)url谨湘,發(fā)起請求绽快,獲取頁面的HTML源碼
從頁面源碼中提取數(shù)據(jù) a. 提取到目標數(shù)據(jù)芥丧,做數(shù)據(jù)的篩選和持久化存儲 b. 從網(wǎng)頁中提取到新的url地址,繼續(xù)執(zhí)行第二步
爬蟲結(jié)束:所有的目標url都提取完坊罢,并且得到數(shù)據(jù)续担,再也沒有其他請求任務(wù)
網(wǎng)頁的三大特征
每一個網(wǎng)頁都有一個唯一的url(統(tǒng)一資源定位符),來進行定位
網(wǎng)頁都是通過HTML展示的
所有的網(wǎng)頁都是通過HTTP/HTTPS協(xié)議來傳輸?shù)?br>
通用爬蟲和聚焦爬蟲
通用爬蟲:是搜索引擎的重要組成部分 目的:盡可能的將所有的互聯(lián)網(wǎng)上的網(wǎng)頁下載到本地活孩,經(jīng)過預(yù)處理(去噪物遇,分詞,去廣告)憾儒,最終將數(shù)據(jù)存儲到本地询兴,做一個鏡像備份,形成一個檢索系統(tǒng) 缺點: ∑鹬骸1.必須遵守robot協(xié)議:就是一個規(guī)范诗舰,告訴搜索引擎,哪些目錄下的資源允許爬蟲阳掐,哪些不允許 ∈夹啤2.搜索引擎返回的都是網(wǎng)頁冷蚂,并且返回的90%都是無用的數(shù)據(jù) $员!3.不能根據(jù)不同用戶的需求或者檢索結(jié)果返回不同的結(jié)果 4.通用爬蟲對于媒體的文件不能獲取
聚焦爬蟲:聚焦爬蟲是面向主題的爬蟲蝙茶,再爬取數(shù)據(jù)的過程中對數(shù)據(jù)進行篩選艺骂,往往只會【爬取與需求相關(guān)的數(shù)據(jù)
Robot.txt
Robot協(xié)議(也稱為爬蟲協(xié)議、機器人協(xié)議等)的全稱是“網(wǎng)絡(luò)爬蟲排除標準”隆夯,Robot.txt是一個協(xié)議钳恕,而不是一個命令,他是國際互聯(lián)網(wǎng)界通行到的規(guī)范蹄衷,大型網(wǎng)站會通過Robot協(xié)議來告訴搜索引擎哪些頁面可以爬取忧额,哪些不能
參數(shù):
allow:允許爬取
disallow:不允許爬取
七層協(xié)議
從上往下 應(yīng)用層:為用戶的應(yīng)用程序提供網(wǎng)絡(luò)服務(wù)的(http,https,ftp...) 表示層:負責(zé)端到端的數(shù)據(jù)信息可以被另一個主機所理解和識別,并且按照一定的格式將信息傳遞到會話層 會話層:會話層是管理主機之間的會化進程愧口,負責(zé)建立睦番,管理,和終止會話進程 傳輸層:進行數(shù)據(jù)傳輸?shù)模╰cp udp) 網(wǎng)絡(luò)層:路由器 數(shù)據(jù)鏈路層:網(wǎng)橋 交換機 物理層:網(wǎng)線 網(wǎng)卡 集線器 中繼器
http和https協(xié)議
HTTP協(xié)議(HyperText Transfer Protocol)中文名叫超文本傳輸協(xié)議: 是用于從網(wǎng)絡(luò)傳送超文本數(shù)據(jù)到本地瀏覽器的傳送協(xié)議
HTTP協(xié)議(HyperText Transfer Protocol)中文名叫超文本傳輸協(xié)議: 是用于從網(wǎng)絡(luò)傳送超文本數(shù)據(jù)到本地瀏覽器的傳送協(xié)議
HTTP的端口號為80,HTTPS的端口號為443
HTTPS的安全基礎(chǔ)是SSL,因此通過它可以傳輸?shù)膬?nèi)容都是經(jīng)過SSL加密的耍属,主要作用是:
建立一個安全有效的信息傳送通道托嚣,保證數(shù)據(jù)傳送的安全性
確定網(wǎng)站的真實性和有效性
注意:HTTPS比HTTP更安全,但是性能更低
url的基本組成部分
基本格式:schema://host[:port#]/path/?[query-string][#]anchor schema:協(xié)議(例如:http, https, ftp) host:服務(wù)器的IP地址或者域名 path:訪問資源的路徑 query-string:參數(shù)厚骗,發(fā)送給http服務(wù)器的數(shù)據(jù) anchor:錨(跳轉(zhuǎn)到網(wǎng)頁的指定錨點位置)
請求的基本流程
from urllib import request
目標url
url = 'http://www.baidu.com'
response = request.urlopen(url,timeout=10)
從response響應(yīng)結(jié)果中獲取參數(shù)
狀態(tài)碼
code = response.status
print(code)
獲取頁面源碼的二進制數(shù)據(jù)
b_html = response.read()
print(b_html,len(b_html))
獲取響應(yīng)的相應(yīng)頭部(response headers)
res_headers = response.getheaders()
print(res_headers)
獲取響應(yīng)頭中指定參數(shù)的值
cokie_data = response.getheader('Set-Cookie')
print(cokie_data)
reason返回一個響應(yīng)結(jié)果的原因
reason = response.reason
print(reason)
get請求和post請求的區(qū)別 1.傳輸數(shù)據(jù)的大惺酒簟:對于GET,特定的 瀏覽器和服務(wù)器對URL的長度有限制领舰;對于POST夫嗓,由于不是URL傳值迟螺,理論上是不會受限制的,但是實際上各個服務(wù)器會規(guī)定對POST提交數(shù)據(jù)大小進 行限制啤月,Apache煮仇、IIS都有各自的配置。 2.安全性:POST的安全性比GET的高
請求頭的參數(shù) 'User-Agent':模擬瀏覽器進行請求 'Cookie':存儲在瀏覽器里面的,使用 cookie表明用戶的身份 'Refere':說明當前的請求是從哪個頁面發(fā)起的
常用的狀態(tài)碼
200:請求成功
301:永久重定向 302:臨時重定向
400:客戶端錯誤 401:未授權(quán) 403:服務(wù)器拒絕訪問 404:頁面未找到 405:請求方式不對 408:請求超時
500:服務(wù)器錯誤 503:服務(wù)器不可用
bytes類型和str字符串類型的相互轉(zhuǎn)換,bytes和bytearray的區(qū)別
1.bytes是Python 3中特有的谎仲,Python 2 里不區(qū)分bytes和str浙垫。 2.str類型使用encode方法轉(zhuǎn)化為bytes類型 bytes類型通過decode轉(zhuǎn)化為str類型 3.bytearray bytearray和bytes不一樣的地方在于,bytearray是可變的郑诺。
如何發(fā)起一個get請求
response = response.get
('www.baidu.com')
正則的基本用法:
. :表示匹配除了換行符之外的任意字符
\ :轉(zhuǎn)義字符
[a-z] : 匹配a-z里面的任意一個字符
\d: 匹配數(shù)字 -> [0-9]
\D: 匹配非數(shù)字 [^\d]
\s: 匹配空白字符(空格,\n,\t...)
\S: 匹配非空白字符
\w: 匹配單詞字符 [A-Za-z0-9_]
\W: 匹配非單子字符
^:匹配以...開頭
$:匹配以....結(jié)尾
():分組
|:或
多字符匹配
*:匹配*前面的字符任意次數(shù)
- : 匹配+號前面的字符至少1次
夹姥?: 匹配?前面的字符0次或1次
{m}:匹配{m}前面的字符m次
{m,n}:匹配{m,n}前面的字符m~n次
非貪婪匹配
*?
+?
??
{m,n}?