內(nèi)容簡述:? ? ?
? ??一:爬蟲概述和學習路線
? ??二:協(xié)議和請求方法?
? ??三:抓包工具-谷歌瀏覽器 和fiddler安裝及介紹? ??
? ??四:urllib庫介紹和使用
? ? 五:構(gòu)建請求對象-Request
一:爬蟲起源
????大數(shù)據(jù)時代數(shù)據(jù)來源:
? ? ? ? ?1.企業(yè)生產(chǎn)的用戶數(shù)據(jù)(BAT)? 例如:百度指數(shù)|阿里指數(shù)|微指數(shù)等
????????????????http://index.baidu.com/http://index.1688.com/
? ? ? ? ?2.數(shù)據(jù)管理咨詢公司? ? ? ? ? ? ? 例如:艾瑞咨詢|埃森哲
????????????????http://www.iresearch.com.cn/https://www.accenture.com/cn-en
? ? ? ? ?3.政府/機構(gòu)提供的公開數(shù)據(jù)? 例如:統(tǒng)計局|世界銀行等
????????????????http://www.stats.gov.cn/https://data.worldbank.org.cn/
? ? ? ? ?4.第三方數(shù)據(jù)平臺購買數(shù)據(jù)? ? 例如:貴陽大數(shù)據(jù)交易平臺
? ? ? ? ?5.爬蟲爬取數(shù)據(jù)
二:爬蟲概念及分類
概念:是抓取網(wǎng)頁數(shù)據(jù)的程序。
使用場景分類:通用爬蟲和聚焦爬蟲概念
? ? ?通用爬蟲:
??????? 通用網(wǎng)絡爬蟲是捜索引擎抓取系統(tǒng)(Baidu、Google、Yahoo等)的組成部分。
????????主要目的是將互聯(lián)網(wǎng)上的網(wǎng)頁下載到本地,形成一個互聯(lián)網(wǎng)內(nèi)容的鏡像備份。
? ? ? ?通用爬蟲工作流程:
????????????1-抓取網(wǎng)頁
????????????????A-向搜索引擎主動提供
????????????????B-其它優(yōu)質(zhì)網(wǎng)站設置外鏈
????????????????C-搜索引擎與DNS服務商合作,快速收錄新網(wǎng)站
? ? ? ? ? ? 2-數(shù)據(jù)存儲
? ? ? ? ? ? 3-數(shù)據(jù)處理
? ? ? ? ? ? 4-提供檢索服務、網(wǎng)站排名
????????缺點
?????????? ????1-數(shù)據(jù)大部分無用
? ? ? ? ? ?????2-搜索引擎無法針對于某個用戶提供服務
????????Robots協(xié)議:協(xié)議會指明通用爬蟲可以爬取網(wǎng)頁的權(quán)限。
????????Robots.txt 并不是所有爬蟲都遵守,大型的搜索引擎爬蟲會遵守。
? ? ? ? 聚焦爬蟲:是"面向特定個性化需求"的一種網(wǎng)絡爬蟲程序。
三:怎么爬數(shù)據(jù)?
?? 網(wǎng)頁特征:
????????1-URL定位(統(tǒng)一資源定位符)
????????2-HTML展示(超文本標記語言)描述頁面信息
????????3-HTTP|HTTPS等協(xié)議(傳輸html數(shù)據(jù)
?? 設計思路:
????????1.確定需要爬取的網(wǎng)頁URL。
????????2.通過HTTP/HTTP協(xié)議獲取HTML頁面。
????????3.提取HTML頁面里有用的數(shù)據(jù):
? ? ? ? ? ? ? ? a.如果是需要的數(shù)據(jù),就保存起來。
? ? ? ? ? ? ? ? ?b.如果是頁面里的其他URL,那就繼續(xù)執(zhí)行第二步。
四:學習爬蟲必備知識點
????????1.Python的基本語法知識
????????2.如何抓取HTML頁面:
??????????? ????HTTP請求的處理,urllib、urllib2、requests
? ? ? ? ? ? ????處理后的請求可以模擬瀏覽器發(fā)送請求,獲取服務器響應文件
????????3.解析服務器響應的內(nèi)容
? ? ? ? ? ? ? ? ? ?re、xpath、BeautifulSoup4(bs4)、jsonpath、pyquery等
????????4.如何采集動態(tài)HTML、驗證碼的處理(豆瓣電影)
? ? ? ? ? ? ? ? ? ? Selenium+ PhantomJS(無界面瀏覽器):
????????????????????模擬真實瀏覽器加載js、ajax等非靜態(tài)頁面
?? ????????????????Tesseract:機器學習庫,機器圖像識別系統(tǒng),可以處理簡單的驗證碼。
????????????????????復雜的驗證碼可以通過手動輸入/專門的打碼平臺
????????5.Scrapy框架:(Scrapy|Pyspider)
??? ?????? ????個性化高性能(底層使用-異步網(wǎng)絡框架twisted),下載速度快,提供了數(shù)據(jù)存儲、數(shù)據(jù)下載、提取規(guī)則等組件。
????????6.分布式策略 scrapy-reids:
? ? ? ? ? ? ? ? ? 在Scrapy的基礎上添加了以 Redis 為核心的組件。支持分布式的功能。
? ? ? ? ? ? ? ? ? ?主要在Redis里做請求指紋去重、請求分配、數(shù)據(jù)臨時存儲等。
? ? ? ? ? ?7.爬蟲-反爬蟲-反反爬蟲之間的戰(zhàn)斗
? ? ? ? ? ? ? ? ? ? User-Agent、代理、驗證碼、動態(tài)數(shù)據(jù)加載、加密數(shù)據(jù)。

五:HTTP和HTTPS
????????HTTP協(xié)議(HyperText TransferProtocol,超文本傳輸協(xié)議):
????????????????是一種發(fā)布和接收 HTML頁面的方法。
????????HTTPS(Hypertext TransferProtocol over Secure Socket Layer)
????????????????是HTTP的安全版,在HTTP下加入SSL層。
????????SSL(Secure Sockets Layer 安全套接層)主要用于Web的安全傳輸協(xié)議,在傳輸層對網(wǎng)絡連接進行加密,保障在Internet上數(shù)據(jù)傳輸?shù)陌踩?/p>
????????HTTP的端口號為80,HTTPS的端口號為443
HTTP工作原理
????網(wǎng)絡爬蟲抓取過程可以理解為模擬瀏覽器操作的過程。
????瀏覽器的主要功能是向服務器發(fā)出請求,在瀏覽器窗口中展示你選擇的網(wǎng)絡資源,HTTP是一套計算機通過網(wǎng)絡進行通信的規(guī)則。
HTTP通信由兩部分組成:?客戶端請求消息?與?服務器響應消息

瀏覽器發(fā)送HTTP請求的過程:
????????1-當用戶在瀏覽器的地址欄中輸入一個URL并按回車鍵之后,瀏覽器會向HTTP服務器發(fā)送HTTP請求。HTTP請求主要分為“Get”和“Post”兩種方法。
????????2-當我們在瀏覽器輸入URL?http://www.hao123.com的時候,瀏覽器發(fā)送一個Request請求去獲取hao123的html,服務器把Response文件對象發(fā)送回給瀏覽器。
????????3-瀏覽器分析Response中的 HTML,發(fā)現(xiàn)其中引用了很多其他文件,比如Images文件,CSS文件,JS文件。瀏覽器會自動再次發(fā)送Request去獲取css|js
????????4-當所有的文件都下載成功后,網(wǎng)頁會根據(jù)HTML語法結(jié)構(gòu),完整進行顯示。
六-URL
????????Uniform/Universal Resource Locator的縮寫):統(tǒng)一資源定位符。
????????是用于完整地描述互聯(lián)網(wǎng)上網(wǎng)頁和其他資源的地址的一種手段。
????????基本格式:scheme://host[:port#]/path/…/[?query-string][#anchor]
????????????????Scheme:協(xié)議(例如:http,https, ftp)
????????????????Host:服務器的IP地址或者域名
????????????????port#:服務器的端口(如果是走協(xié)議默認端口,缺省端口80)
????????????????path:訪問資源的路徑
????????????????query-string:參數(shù),發(fā)送給http服務器的數(shù)據(jù)
? ? ? ? ? ? ? ? anchor:錨(跳轉(zhuǎn)到網(wǎng)頁的指定錨點位置)
七:請求方法

八:發(fā)送請求谷歌調(diào)試細節(jié)
General:
Request URL:https://www.baidu.com/請求地址
????????????????????Request Method: GET? ? ? ? ? ? ? ? ? ? ? ? ? ? 請求方法
????????????????????Status Code: 200 OK? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 狀態(tài)碼
? ? ? ? ? ? ?????????Remote Address: 61.135.169.125:443?? 客戶端請求ip
Response Headers
????????????????????Cache-Control: private? 告訴客戶端下次請求的方式
????????????????????Connection: Keep-Alive? 客戶端和服務端的連接類型
????????????????????Content-Encoding: gzip? 服務端返回的數(shù)據(jù)是經(jīng)過gzip編碼的
????????????????????Content-Type:text/html;charset=utf-8? 響應文件的類型和字符編碼
????????????????????Date: Wed, 27 Jun 2018 01:48:50GMT? 服務器發(fā)送文件的時間
????????????????????Server: BWS/1.1 服務器版本
????????????????????Set-Cookie: BDSVRTM=68; path=/? 設置cookie信息
RequestHeaders
????????????????????Accept:text/html?? 可以接受返回的類型
????????????????????Accept-Encoding: gzip,
????????????????????deflate, br 可以接受的字符編碼
????????????????????Accept-Language:zh-CN,zh;q=0.9??? 語言
????????????????????Cache-Control:max-age=0? 不會緩存服務器資源
????????????????????Connection: keep-alive? 和服務端連接類型
? ? ? ? ? ? ? ? ? ?Cookie: BAIDUID=F68132AFC5355:FG=1; Cookie類型
Host:www.baidu.com請求地址
? ? ? ? ? ? ? ? ? ? User-Agent:Mozilla/5.0 (Windows NT6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181Safari/537.36? 瀏覽器名稱
九-抓包工具fiddler的使用
? ? ??安裝軟件:
????????1-安裝mono
http://www.mono-project.com/download/stable/#download-lin-ubuntu
????????2-下載linux版本的fiddler并解壓
https://www.telerik.com/download/fiddler
????????3-在谷歌瀏覽器中導入證書
備注:window版本不需要安裝mono
軟件說明和使用:
????????1、配置軟件,配置fiddler能夠抓取https的包
????????????Tools==>Options==>HTTPS
????????????選中 Capture Https Connects
????????????選中 Decrypt Https Traffic
????????????選中 Ignore
????????????然后將fiddler關閉再次打開即可
????????2、fiddler軟件介紹
????????????????左邊欄、右邊欄
? ? ? ? ? ? ? ?左邊欄:所有的請求
????????????????????????html?? <>
????????????????????????css? ? 圖片中的標記
? ? ? ? ? ? ? ? ? ? ? ? ?js? ?? 前面標注有js
? ? ? ? ? ? ? ? ? ? ? ? ?json?? 前面標注有json
? ? ? ? ? ? ? ? ? ? ? ? ? post?? 一個書本,一個箭頭
????????????????????????右邊欄:點擊左邊其中一個請求,這個請求的詳細信息就會顯示到右邊欄
????????????????????????右上邊欄:http請求信息
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 點擊? Insepctors
????????????????????????????????????webforms:post請求所有的表單數(shù)據(jù)
????????????????????????????????????raw:整個請求以純文本的格式顯示給你
????????????????????????右下邊欄:http請求響應信息
????????????????????????????????有一個黃色提示信息響應體被編碼過,需要點擊解碼。
????????????????????????????????headers:響應頭信息
????????????????????????????????textview:響應的信息以文本的形式顯示出來
????????????????????????????????imageview:如果圖片,在這里顯示圖片
????????????????????????????????webview:模擬瀏覽器顯示
????????????????????????????????cookies:cookie信息
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?raw:將響應的信息以純文本的形式展示給你
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?json:一些接口返回給你json,在這里查看
????????????????3、禁止fiddler抓包,file,點擊第一個選項取消對號即可
????????????????4、清除所有的請求, 點擊x號,remove all
????????????????5、左下角黑色框框,輸入指令的地方
? ? ? ? ? ? ? ? ? ? ?select json? select html? select image? cls 清楚所有請求? ??main? 搜索
十:urllib庫
? ? ? ?urllib庫是Python提供的用于操作URL的模塊,在2版本中,有urllib和urllib2兩個庫,在3版本中,只有urllib庫,我們使用3系列
urllib.request可以用來發(fā)送request和獲取request的結(jié)果
urllib.parse用來解析和處理URL
?? 【1】urllib.request.urlopen方法
????? urlopen(url, data = None,context = None)
??????? 如果有data,則代表是post請求,context表示的是https請求的消除ssl錯誤
??????? urllib.request.urlretrieve(url, file_path) 將url內(nèi)容直接下載到file_path中
注意:windows和mac在通過urlopen發(fā)送https請求的時候有可能報錯
? ? ? ? 錯誤:SSL: CERTIFICATE_VERIFY_FAILED
? ? ? ? 原因:Python 2.7.9 之后引入了一個新特性,當使用urllib.urlopen打開一個 https 鏈接時,會驗證一次 SSL證書。
解決方案:
? ? ? ? ? ? ? ? 1-使用ssl創(chuàng)建未經(jīng)驗證的上下文,在urlopen中傳入上下文參數(shù)
? ??????????????????????context = ssl._create_unverified_context()
? ? ? ? ? ? ? ? ????????urllib.request.urlopen("url",context=context).read()
? ? ? ? ? ? ? ? 2-全局取消證書驗證
? ? ? ? ? ? ? ? ? ? 在文件中導入ssl并添加一行代碼
? ????????????????????import ssl
? ? ? ? ? ? ? ? ? ? ? ssl._create_default_https_context = ssl._create_unverified_context
?? 【2】HTTPResponse對象常見方法
??????? read()??讀取的是二進制數(shù)據(jù)
????????? 字符串類型和字節(jié)類型
??????? ????? 字符串==》字節(jié)? 編碼encode()
??????? ? ??? 字節(jié)==》字符串? 解碼decode()
????????readline() 讀取一行
????????readlines()讀取全部,返回一個列表
????? 【注意】上面的讀取都是字節(jié)類型,轉(zhuǎn)為字符串類型需要解碼
????? ?? getcode()狀態(tài)碼
????? ?? geturl()??獲取url
????? ?? getheaders()響應頭信息 列表里面有元祖
??????? status屬性??http狀態(tài)碼
?? 【3】urllib.parse
????? ?A-urllib.parse.urlencode
??????? 通過post提交的數(shù)據(jù),都需要通過這個函數(shù)轉(zhuǎn)碼,且發(fā)送請求的時候必須為字節(jié)格式的,所以post數(shù)據(jù)經(jīng)常如下使用
?????????? data :是一個字典
?????????? formdata =urllib.parse.urlencode(data).encode('utf-8')
?? ??B-urllib.parse.quote()
?????????? get參數(shù)中,有中文的,需要使用這個函數(shù)轉(zhuǎn)碼
http://tool.chinaz.com/tools/urlencode.aspx編碼在線工具
?? ??C-urllib.parse.unquote()?? url解碼
十一:構(gòu)造請求對象Request(高級請求)
?? user-agent在線解析工具
http://www.atool.org/useragent.php
????? request = urllib.request.Request(fullurl,headers=None)
????? 可以直接傳遞headers,也可request.add_header('User-Agent','xxx')
十二:帶中文的get請求