文章目錄
一、獲取數據的方式,爬蟲的必要性
-
企業生產的用戶數據:大型互聯網公司有海量用戶,所以他們積累數據有天然優勢,有數據意識的中小型企業,也開始積累的數據。
-
數據管理諮詢公司:艾瑞,埃森哲等。通常這樣的公司有很龐大的數據採集團隊,一般會通過市場調研、問卷調查、固定的樣本監測、和各行各業公司進行合作、專家對話(數據積累很多年了,最後得出科研結果)來採集數據。
-
政府/機構提供的公開數據:政府一般通過各地政府統計上報的數據進行合併;機構都是權威的第三方網站。
-
第三方數據平臺購買數據:貴陽大數據交易平臺,數據堂,淘寶等。通過各個數據交易平臺來購買各行各業需要的數據,根據獲取難度不同,價格也會不同。
-
爬蟲爬取數據:如果市場上沒有我們需要的數據,或者價格太高不願意買,那麼就可以招/做一個爬蟲工程師,從互聯網定向採集數據。
二、爬蟲的定義 分類 流程 搜索引擎
1. 網絡爬蟲的定義:
一個程序腳本--->自動的抓取互聯網上信息的腳本
2. 爬蟲可以解決的問題:
- 解決冷啓動問題。
- 搜索引擎的根基:做搜索引擎少不了爬蟲。
- 建立知識圖譜,幫助建立機器學習知識圖譜。
- 可以製作各種商品的比價軟件,趨勢分析。
- 其他:比如分析淘寶上競爭對手的數據;分析微博的數據傳遞影響力;分析人與人之間的關係等。
3. 爬蟲工程師的進階之路
-
初級爬蟲工程師
- web 前端的知識: HTML、CSS、JavaSc1ipt、 DOM、 DHTML 、Ajax、jQuery、json 等;
- 正則表達式, 能提取正常一般網頁中想要的信息,比如某些特殊的文字, 鏈接信息, 知道什麼是懶惰, 什麼是貪婪型的正則;
- 會使用 XPath 等獲取一些DOM 結構中的節點信息;
- 知道什麼是深度優先, 廣度優先的抓取算法, 及實踐中的使用規則;
- 能分析簡單網站的結構, 會使用urllib或requests 庫進行簡單的數據抓取。
-
中級爬蟲工程師
- 瞭解什麼事HASH,會簡單地使用MD5,SHA1等算法對數據進行HASH一遍存儲
- 熟悉HTTP,HTTPS協議的基礎知識,瞭解GET,POST方法,瞭解HTTP頭中的信息,包括返回狀態碼,編碼,user-agent,cookie,session等
- 能設置user-agent進行數據爬取,設置代理等
- 知道什麼事Request,什麼事response,會使用Fiddler等工具抓取及分析簡單地網絡數據包;對於動態爬蟲,要學會分析ajax請求,模擬製造post數據包請求,抓取客戶端session等信息,對於一些簡單的網站,能夠通過模擬數據包進行自動登錄。
- 對於一些難搞定的網站學會使用phantomjs+selenium抓取一些動態網頁信息
- 併發下載,通過並行下載加速數據爬取;多線程的使用。
-
高級爬蟲工程師
- 能夠使用Tesseract,百度AI,HOG+SVM,CNN等庫進行驗證碼識別。
- 能使用數據挖掘技術,分類算法等避免死鏈。
- 會使用常用的數據庫進行數據存儲,查詢。比如mongoDB,redis;學習如何通過緩存避免重複下載的問題。
- 能夠使用機器學習的技術動態調整爬蟲的爬取策略,從而避免被禁IP封禁等。
能使用一些開源框架scrapy,scrapy-redis等分佈式爬蟲,能部署掌控分佈式爬蟲進行大規模數據爬取。
4. 爬蟲的分類
① 通用爬蟲:
就是將互聯網上頁面整體的內容爬取下來之後,保存到本地。
- 通用爬蟲要想爬取網頁,需要網站的url.但是搜索引擎是可以搜索所有網頁的。那麼通用爬蟲url就要涉及到所有網頁,這個‘所有’是如何做到的。
- 新網站向搜索引擎主動提交網址
- 在其他網站上設置新網站外鏈。
- 搜索引擎和DNS解析服務商(如DNSPod等)合作,新網站域名將被迅速抓取。
②聚焦爬蟲:
聚焦爬蟲在實施網頁抓取時會對內容進行處理篩選,儘量保證只抓取與需求相關的網頁信息。
5. 爬蟲的流程
- 向起始url發送請求,並獲取響應
- 對響應進行提取
- 如果提取url,則繼續發送請求獲取響應
- 如果提取數據,則將數據進行保存
6. 爬蟲如何爬取網頁數據
(一)網頁三大特徵:
-
每個網頁都有自己唯一的URL(統一資源定位符)來進行定位。
-
網頁都使用HTML(超文本標記語言)來描述頁面信息。
-
網頁都使用HTTP/HTTPS (超文本傳輸協議)協議來傳輸HTML數據。
(二)爬蟲的設計思路
-
首先確定需要爬取的網頁URL地址。
-
通過HTTP/HTTPS協議來獲取對應的HTML頁面。
-
提取HTML頁面裏有用的數據:
a.如果是需要的數據,就保存起來。 b.如果是頁面裏的其他URL,那就繼續執行第二步。
7. 搜索引擎:
- 搜索引擎的工作流程:
第一步:抓取網頁
通過將待爬取的url加入到通用爬蟲的url隊列中,進行網頁內容的爬取
第二步:數據存儲:
將爬取下來網頁保存到本地。這個過程中會有一定的去重操作。如果某個網頁的內容大部分重複,搜索引擎可能不會保存。
第三步:預處理
提取文字
中文分詞
消除噪音(比如版權聲明文字、導航條、廣告等……)
索引處理
第四步: 設置網站排名,爲用戶提供檢索服務。
-
搜索引擎的侷限性(通用爬蟲):
1、搜索引擎只能爬取原網頁,但是頁面90%內容都是無用的。
2、搜素引擎不能滿足不同行業,不同員的特定需求。
3、通用搜索引擎只能爬取文字信息,對於視頻,文件,音頻等其他信息無法爬取。
4、只能基於關鍵字查詢,無法基於語義查詢。
三、爬蟲所需知識點
1. 爬蟲的準備工作
- robots協議
- 定義:網絡爬蟲排除標準(全稱)
- 作用:告訴搜索引擎哪些內容可以爬,哪些不能爬
- 網站地圖sitemap
- 就是一個網站地圖,可以指導我們查看該網頁下有哪些內容
- 估算網站大小
- 在百度中輸入site:www.zhihu.com (site:目標網站網址)
- 識別網站用了哪些技術
- 安裝builtwith:pip install builtwith
- 爲了更好的瞭解網站,抓取該網站的信息,我們可以先了解一下該網站大致所使用的的技術架構。
- 安裝builtwith:pip install bulitwith
- 使用:在python交互環境下,輸入:
Import buildwith Buildwith.parse(‘http://www.sina.com.cn’)
- 尋找網站所有者
2. http和https
- 什麼是http協議
- http:超文本傳輸協議(全稱)
- 是一個規範--------------->約束髮布和接收html頁面的規範
- 什麼是https協議
- HTTPS (Hypertext Transfer Protocol over Secure Socket Layer)簡單講是http的安全版,在http下加入SSL層
- http和https協議的端口號
- http端口號:80
- https端口號:443
- http協議的特點
- 是一個應用層協議
- 無連接(每次連接只處理一個請求)
- 每次請求都是獨立的
- http 1.1 增加了一個Connection:keep-alive,表示客戶端和服務器的連接是一個長連接
- 無狀態
- 無狀態表示客戶端每次請求都不能進行請求狀態。也就是兩條請求之間無法進行通信
- cookie和session可以幫助記錄狀態
- url:統一資源定位符
-
爲什麼可以通過url來定位互聯網上的任意資源?
- http://ip:port/path
- ip:可以定位一個電腦
- port:端口號------->用來從互聯網上進入電腦
- path:就是爲了在電腦中找到對應的資源路徑
- http://ip:port/path
-
有三種特殊符號
- ?:問號後面就是請求參數
- &:請求參數用&連接。?username=‘zhangsan’&password=‘123’
- ·#·:表示錨點,錨點就是在請求這個url時,頁面會跳入錨點指定位置
- 基本格式:scheme://host[:port#]/path/…/?query-string
scheme:協議(例如:http, http, ftp) host:服務器的IP地址或者域名 port:服務器的端口(如果是走協議默認端口,缺省端口80) path:訪問資源的路徑 query-string:參數,發送給http服務器的數據 anchor:錨(跳轉到網頁的指定錨點位置)
-
在python中,有一個模塊可以幫助我們解析url
代碼: from urllib import parse url = 'http://localhost.com:8080/index.htm?username="zhangsan"&password="123"' print(parse.urlparse(url)) 輸入內容: ParseResult( scheme='http', netloc='localhost.com:8080', path='/index.htm', params='', query='', fragment='')
- HTTP工作過程
-
地址解析
-
將url解析出對應的內容
scheme:協議(例如:http, http, ftp) host:服務器的IP地址或者域名 port:服務器的端口(如果是走協議默認端口,缺省端口80) path:訪問資源的路徑 query-string:參數,發送給http服務器的數據 anchor:錨(跳轉到網頁的指定錨點位置)
-
-
封裝http請求數據包
- 將上一步url解析出的內容封裝
-
封裝成TCP包,建立TCP連接(TCP三次握手)
-
客戶端發送請求
-
服務器接收請求,發送響應
-
服務器關閉TCP連接
3. http請求和瀏覽器響應
-
當我們在瀏覽器輸入一個url,爲什麼可以加載出一個頁面?
-
爲什麼,在抓包的過程中,請求一個url,會出現很多的資源請求
- 當我們在瀏覽器輸入一個url,客戶端會發送這個url對應的一個請求到指定的服務器獲取內容
- 服務器收到這個請求,解析出對應的內容,之後將內容封裝到響應裏發送給客戶端。比如index.html頁面
- 當客戶端拿到這個html頁面,會查看這個頁面中是否有css、js、images等url,如果有,再分別進行請求,獲取到這些內容
- 客戶端會通過html的語法,將獲取到的內容完美的顯示出來
4. 客戶端請求
-
組成部分:請求行、請求頭部、空行、請求數據
-
請求方法get/post
- get請求:
- get,獲取------->從服務器上獲取資源------->通過參數來告訴你服務器獲取什麼資源------>請求參數是在url裏面用&進行拼接的,也就是?後面的內容。------>所以不安全------->傳輸大小受限(url受限)
- post請求:
- post,傳遞------->向服務器傳遞數據-------->數據是封裝在請求的實體(請求數據)------->可以傳遞更多的內容(大小不受限)-------->更安全
- get和post的區別
- get是從服務器獲取內容,post是向服務器傳遞內容
- get不安全,因爲參數拼在url後面。post比較安全,因爲參數是放在實體裏面的
- get傳參大小受限,post不受限
- get請求:
-
重要的請求頭
-
User-Agent:客戶端請求標識。 Accept: (傳輸文件類型)允許傳入的文件類型。 Referer :表明產生請求的網頁來自於哪個URL,用戶是從該Referer頁面訪問到當前請求的頁面。 cookie (cookie):在做登錄的時候需要封裝這個頭。 Content-Type (POST數據類型)
-
5. 服務端響應
-
組成:狀態行、消息報頭、空行、響應正文
-
重要的響應頭
- Content-Type:text/html;charset=UTF-8:告訴客戶端,資源文件的類型,還有字符編碼
- Content-Type:text/html;charset=UTF-8:告訴客戶端,資源文件的類型,還有字符編碼
-
響應狀態碼
-
cookie和session
6. hash實現加密文件和加密字符串
-
加密文件
-
加密字符串
7. 遞歸實現斐波那契和列表最大最小數
- 遞歸斐波那契
def dg(n):
if n==1 or n==2:
return 1
return dg(n-1)+dg(n-2)
n = int(input("請輸入一個數n:"))
print(dg(n))
- 用遞歸的方法,獲取一個列表的最大值和最小值
a=[1,43,6,4,7,9,0,59]
max,min = a[0],a[0]
def dg(n,max,min):
if len(a)== 1:
return max,min
else:
num = a.pop()
if num >= max:
max = num
else:
max = max
if num <= min:
min = num
else:
min = min
return dg(len(a),max,min)
print(dg(len(a),max,min))