第一天:前端
爬蟲概要:python
爲何咱們要學習爬蟲?web
首先請問:都說如今是‘大數據時代’,那數據從何而來?瀏覽器
什麼是大數據:安全
多大的數據纔算大數據?服務器
B: bytes(字節)微信
K:1K = 1024B 1K=2**10網絡
M:1M = 1024K 1M=2**20session
G:1G = 1024M 1G=2**30多線程
4G=2**32
T:1T = 1024G 1T = 2**40
P:1P = 1024T 1P=2**50
E:1E = 1024P 1E=2**60
所謂的大數據在100T-10P之間。
爬蟲的定義:
網絡爬蟲(又稱網頁蜘蛛,網絡機器人)就是模擬客戶端發送網絡請求,接收請求的響應,按照必定的規則,自動地抓取互聯網信息的程序。
只要是瀏覽器能作的,原則上,爬蟲都能作
網絡爬蟲的更多用途:
12306搶票
網站上的投票
短信轟炸—》找到不少註冊網站添加對應的手機號,發送驗證碼,就能實現短信轟炸。(往後你惹出禍來,不把師傅說出來就好了)
舉例12306—》攜程
微信—》搜狗微信
兩個陣營的鬥爭
爬蟲——反爬蟲——反反爬蟲
爬蟲與反爬蟲的鬥爭
反爬蟲:驗證碼、流量監控(封IP、封session、封userAgent)
反反爬蟲:驗證碼圖像識別、代理、隨機userAgent、……
爬蟲與反爬蟲的鬥爭最後勝利的一方永遠是爬蟲
注意:搜索引擎也是爬蟲。反爬蟲總不可能去反搜索引擎吧
爲何用python作爬蟲?
PHP:PHP是作後臺的,小型網站。爬蟲是在前端運行的。確定是不合適。
Java:Java既能夠作後臺,也能夠作爬蟲。可是Java比較臃腫,修改Java代碼比較耗人力
C/C++:C/C++是作嵌入式的。若是讓搞嵌入式的人作爬蟲有點大材小用了,資源浪費
Python:輕量級。快速更新迭代。代碼易讀。有不少已成型的庫,直接import就能夠了。支持多線程
爬蟲的分類
1通用爬蟲:一般指搜索引擎的爬蟲
2.聚焦爬蟲:針對特定網站的爬蟲
通用搜索引擎工做原理
想想:若是咱們本身實現一個和百度同樣的網站須要怎麼作?
通用爬蟲和聚焦爬蟲工做流程
搜索引擎流程:抓取網頁à數據存儲à預處理à提供檢索服務,網站排名
聚焦爬蟲流程:
爲何要從響應內容提取url?(拿翻頁舉例)
通用搜索引擎的侷限性
Robots協議
網站經過robots協議告訴搜索引擎哪些頁面能夠抓取,哪些頁面不能抓取。
例如:https://www.taobao.com/robots.txt
複習HTTP HTTPS
http協議(超文本傳輸協議):是一種發佈和接收HTML頁面的方法。
https:簡單來說是http的安全版,在http下加入SSL層。
SSL(安全套接字層)主要用於web的安全傳輸協議,在傳輸層對網絡鏈接進行加密,保障在internet上數據傳輸的安全。
http默認的端口:80
HTTPS默認的端口:443
https比http更安全,可是性能更低(多了加解密的過程)
url的形式
形式 scheme://host[port]/path…/[?query-string][anchor]
scheme:協議(例如:http,https,ftp)
host:服務器的IP地址或者域名
port:服務器的端口號
path:訪問資源的路徑
query-string:參數
anchor:錨
http常見請求頭
host(主機和端口號)
connection(鏈接類型)
Upgrade-Insecure-Requests (升級爲HTTPS請求)
User-Agent (瀏覽器名稱)
Accept (傳輸文件類型)
Referer (頁面跳轉處)
Accept-Encoding(文件編解碼格式)
Cookie (保存用戶的我的信息)
x-requested-with :XMLHttpRequest (是Ajax 異步請求)
常見的請求方法
GET
POST
二者有什麼區別呢?
POST請求更安全,適用於表單,提交數據量很大的時候。
常見響應狀態碼(status code)
200:成功
302:臨時轉移至新的url
307:臨時轉移至新的url
404:not found
500:服務器內部錯誤
Requests使用入門
問題:爲何學習requests,而不是utllib?
發送簡單的請求
需求:經過requests向百度首頁發送請求,獲取百度首頁的數據
response = requests.get(url)
response的經常使用方法:
import requests
# 發送請求
r = requests.get('https://www.baidu.com/img/bd_logo1.png')
# 保存
# wb以二進制的方式寫入
with open("a.png", 'wb') as f:
f.write(r.content)
print(r.request.headers)
發送帶header的請求
爲何請求須要帶上header?
模擬瀏覽器、欺騙服務器、獲取和瀏覽器一致的內容
header的形式:字典
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"}
用法:requests.get(url,headers=headers)
發送帶參數的請求
什麼叫作請求參數:
參數的形式:字典
kw = {‘wd’:’歐冠’}
用法:requests.get(url,params=kw)