內(nèi)容簡(jiǎn)述:? ? ?
? ??一:爬蟲概述和學(xué)習(xí)路線
? ??二:協(xié)議和請(qǐng)求方法?
? ??三:抓包工具-谷歌瀏覽器 和fiddler安裝及介紹? ??
? ??四:urllib庫(kù)介紹和使用
? ? 五:構(gòu)建請(qǐng)求對(duì)象-Request
一:爬蟲起源
????大數(shù)據(jù)時(shí)代數(shù)據(jù)來(lái)源:
? ? ? ? ?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.政府/機(jī)構(gòu)提供的公開數(shù)據(jù)? 例如:統(tǒng)計(jì)局|世界銀行等
????????????????http://www.stats.gov.cn/https://data.worldbank.org.cn/
? ? ? ? ?4.第三方數(shù)據(jù)平臺(tái)購(gòu)買數(shù)據(jù)? ? 例如:貴陽(yáng)大數(shù)據(jù)交易平臺(tái)
? ? ? ? ?5.爬蟲爬取數(shù)據(jù)
二:爬蟲概念及分類
概念:是抓取網(wǎng)頁(yè)數(shù)據(jù)的程序。
使用場(chǎng)景分類:通用爬蟲和聚焦爬蟲概念
? ? ?通用爬蟲:
??????? 通用網(wǎng)絡(luò)爬蟲是捜索引擎抓取系統(tǒng)(Baidu肯适、Google危融、Yahoo等)的組成部分集晚。
????????主要目的是將互聯(lián)網(wǎng)上的網(wǎng)頁(yè)下載到本地,形成一個(gè)互聯(lián)網(wǎng)內(nèi)容的鏡像備份层宫。
? ? ? ?通用爬蟲工作流程:
????????????1-抓取網(wǎng)頁(yè)
????????????????A-向搜索引擎主動(dòng)提供
????????????????B-其它優(yōu)質(zhì)網(wǎng)站設(shè)置外鏈
????????????????C-搜索引擎與DNS服務(wù)商合作痘儡,快速收錄新網(wǎng)站
? ? ? ? ? ? 2-數(shù)據(jù)存儲(chǔ)
? ? ? ? ? ? 3-數(shù)據(jù)處理
? ? ? ? ? ? 4-提供檢索服務(wù)、網(wǎng)站排名
????????缺點(diǎn)
?????????? ????1-數(shù)據(jù)大部分無(wú)用
? ? ? ? ? ?????2-搜索引擎無(wú)法針對(duì)于某個(gè)用戶提供服務(wù)
????????Robots協(xié)議:協(xié)議會(huì)指明通用爬蟲可以爬取網(wǎng)頁(yè)的權(quán)限蛛勉。
????????Robots.txt 并不是所有爬蟲都遵守,大型的搜索引擎爬蟲會(huì)遵守睦柴。
? ? ? ? 聚焦爬蟲:是"面向特定個(gè)性化需求"的一種網(wǎng)絡(luò)爬蟲程序诽凌。
三:怎么爬數(shù)據(jù)?
?? 網(wǎng)頁(yè)特征:
????????1-URL定位(統(tǒng)一資源定位符)
????????2-HTML展示(超文本標(biāo)記語(yǔ)言)描述頁(yè)面信息
????????3-HTTP|HTTPS等協(xié)議(傳輸html數(shù)據(jù)
?? 設(shè)計(jì)思路:
????????1.確定需要爬取的網(wǎng)頁(yè)URL。
????????2.通過(guò)HTTP/HTTP協(xié)議獲取HTML頁(yè)面坦敌。
????????3.提取HTML頁(yè)面里有用的數(shù)據(jù):
? ? ? ? ? ? ? ? a.如果是需要的數(shù)據(jù)侣诵,就保存起來(lái)。
? ? ? ? ? ? ? ? ?b.如果是頁(yè)面里的其他URL,那就繼續(xù)執(zhí)行第二步狱窘。
四:學(xué)習(xí)爬蟲必備知識(shí)點(diǎn)
????????1.Python的基本語(yǔ)法知識(shí)
????????2.如何抓取HTML頁(yè)面:
??????????? ????HTTP請(qǐng)求的處理窝趣,urllib、urllib2训柴、requests
? ? ? ? ? ? ????處理后的請(qǐng)求可以模擬瀏覽器發(fā)送請(qǐng)求哑舒,獲取服務(wù)器響應(yīng)文件
????????3.解析服務(wù)器響應(yīng)的內(nèi)容
? ? ? ? ? ? ? ? ? ?re、xpath幻馁、BeautifulSoup4(bs4)洗鸵、jsonpath、pyquery等
????????4.如何采集動(dòng)態(tài)HTML仗嗦、驗(yàn)證碼的處理(豆瓣電影)
? ? ? ? ? ? ? ? ? ? Selenium+ PhantomJS(無(wú)界面瀏覽器):
????????????????????模擬真實(shí)瀏覽器加載js膘滨、ajax等非靜態(tài)頁(yè)面
?? ????????????????Tesseract:機(jī)器學(xué)習(xí)庫(kù),機(jī)器圖像識(shí)別系統(tǒng)稀拐,可以處理簡(jiǎn)單的驗(yàn)證碼火邓。
????????????????????復(fù)雜的驗(yàn)證碼可以通過(guò)手動(dòng)輸入/專門的打碼平臺(tái)
????????5.Scrapy框架:(Scrapy|Pyspider)
??? ?????? ????個(gè)性化高性能(底層使用-異步網(wǎng)絡(luò)框架twisted),下載速度快,提供了數(shù)據(jù)存儲(chǔ)铲咨、數(shù)據(jù)下載躲胳、提取規(guī)則等組件。
????????6.分布式策略 scrapy-reids:
? ? ? ? ? ? ? ? ? 在Scrapy的基礎(chǔ)上添加了以 Redis 為核心的組件纤勒。支持分布式的功能坯苹。
? ? ? ? ? ? ? ? ? ?主要在Redis里做請(qǐng)求指紋去重、請(qǐng)求分配摇天、數(shù)據(jù)臨時(shí)存儲(chǔ)等粹湃。
? ? ? ? ? ?7.爬蟲-反爬蟲-反反爬蟲之間的戰(zhàn)斗
? ? ? ? ? ? ? ? ? ? User-Agent、代理泉坐、驗(yàn)證碼为鳄、動(dòng)態(tài)數(shù)據(jù)加載、加密數(shù)據(jù)腕让。
五:HTTP和HTTPS
????????HTTP協(xié)議(HyperText TransferProtocol孤钦,超文本傳輸協(xié)議):
????????????????是一種發(fā)布和接收 HTML頁(yè)面的方法。
????????HTTPS(Hypertext TransferProtocol over Secure Socket Layer)
????????????????是HTTP的安全版记某,在HTTP下加入SSL層。
????????SSL(Secure Sockets Layer 安全套接層)主要用于Web的安全傳輸協(xié)議构捡,在傳輸層對(duì)網(wǎng)絡(luò)連接進(jìn)行加密液南,保障在Internet上數(shù)據(jù)傳輸?shù)陌踩?/p>
????????HTTP的端口號(hào)為80,HTTPS的端口號(hào)為443
HTTP工作原理
????網(wǎng)絡(luò)爬蟲抓取過(guò)程可以理解為模擬瀏覽器操作的過(guò)程勾徽。
????瀏覽器的主要功能是向服務(wù)器發(fā)出請(qǐng)求滑凉,在瀏覽器窗口中展示你選擇的網(wǎng)絡(luò)資源,HTTP是一套計(jì)算機(jī)通過(guò)網(wǎng)絡(luò)進(jìn)行通信的規(guī)則喘帚。
HTTP通信由兩部分組成:?客戶端請(qǐng)求消息?與?服務(wù)器響應(yīng)消息
瀏覽器發(fā)送HTTP請(qǐng)求的過(guò)程:
????????1-當(dāng)用戶在瀏覽器的地址欄中輸入一個(gè)URL并按回車鍵之后畅姊,瀏覽器會(huì)向HTTP服務(wù)器發(fā)送HTTP請(qǐng)求。HTTP請(qǐng)求主要分為“Get”和“Post”兩種方法吹由。
????????2-當(dāng)我們?cè)跒g覽器輸入U(xiǎn)RL?http://www.hao123.com的時(shí)候若未,瀏覽器發(fā)送一個(gè)Request請(qǐng)求去獲取hao123的html,服務(wù)器把Response文件對(duì)象發(fā)送回給瀏覽器倾鲫。
????????3-瀏覽器分析Response中的 HTML粗合,發(fā)現(xiàn)其中引用了很多其他文件,比如Images文件乌昔,CSS文件隙疚,JS文件。瀏覽器會(huì)自動(dòng)再次發(fā)送Request去獲取css|js
????????4-當(dāng)所有的文件都下載成功后磕道,網(wǎng)頁(yè)會(huì)根據(jù)HTML語(yǔ)法結(jié)構(gòu)供屉,完整進(jìn)行顯示。
六-URL
????????Uniform/Universal Resource Locator的縮寫):統(tǒng)一資源定位符。
????????是用于完整地描述互聯(lián)網(wǎng)上網(wǎng)頁(yè)和其他資源的地址的一種手段伶丐。
????????基本格式:scheme://host[:port#]/path/…/[?query-string][#anchor]
????????????????Scheme:協(xié)議(例如:http,https, ftp)
????????????????Host:服務(wù)器的IP地址或者域名
????????????????port#:服務(wù)器的端口(如果是走協(xié)議默認(rèn)端口悼做,缺省端口80)
????????????????path:訪問資源的路徑
????????????????query-string:參數(shù),發(fā)送給http服務(wù)器的數(shù)據(jù)
? ? ? ? ? ? ? ? anchor:錨(跳轉(zhuǎn)到網(wǎng)頁(yè)的指定錨點(diǎn)位置)
七:請(qǐng)求方法
八:發(fā)送請(qǐng)求谷歌調(diào)試細(xì)節(jié)
General:
Request URL:https://www.baidu.com/請(qǐng)求地址
????????????????????Request Method: GET? ? ? ? ? ? ? ? ? ? ? ? ? ? 請(qǐng)求方法
????????????????????Status Code: 200 OK? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 狀態(tài)碼
? ? ? ? ? ? ?????????Remote Address: 61.135.169.125:443?? 客戶端請(qǐng)求ip
Response Headers
????????????????????Cache-Control: private? 告訴客戶端下次請(qǐng)求的方式
????????????????????Connection: Keep-Alive? 客戶端和服務(wù)端的連接類型
????????????????????Content-Encoding: gzip? 服務(wù)端返回的數(shù)據(jù)是經(jīng)過(guò)gzip編碼的
????????????????????Content-Type:text/html;charset=utf-8? 響應(yīng)文件的類型和字符編碼
????????????????????Date: Wed, 27 Jun 2018 01:48:50GMT? 服務(wù)器發(fā)送文件的時(shí)間
????????????????????Server: BWS/1.1 服務(wù)器版本
????????????????????Set-Cookie: BDSVRTM=68; path=/? 設(shè)置cookie信息
RequestHeaders
????????????????????Accept:text/html?? 可以接受返回的類型
????????????????????Accept-Encoding: gzip,
????????????????????deflate, br 可以接受的字符編碼
????????????????????Accept-Language:zh-CN,zh;q=0.9??? 語(yǔ)言
????????????????????Cache-Control:max-age=0? 不會(huì)緩存服務(wù)器資源
????????????????????Connection: keep-alive? 和服務(wù)端連接類型
? ? ? ? ? ? ? ? ? ?Cookie: BAIDUID=F68132AFC5355:FG=1; Cookie類型
Host:www.baidu.com請(qǐng)求地址
? ? ? ? ? ? ? ? ? ? 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-在谷歌瀏覽器中導(dǎo)入證書
備注:window版本不需要安裝mono
軟件說(shuō)明和使用:
????????1、配置軟件撵割,配置fiddler能夠抓取https的包
????????????Tools==>Options==>HTTPS
????????????選中 Capture Https Connects
????????????選中 Decrypt Https Traffic
????????????選中 Ignore
????????????然后將fiddler關(guān)閉再次打開即可
????????2贿堰、fiddler軟件介紹
????????????????左邊欄、右邊欄
? ? ? ? ? ? ? ?左邊欄:所有的請(qǐng)求
????????????????????????html?? <>
????????????????????????css? ? 圖片中的標(biāo)記
? ? ? ? ? ? ? ? ? ? ? ? ?js? ?? 前面標(biāo)注有js
? ? ? ? ? ? ? ? ? ? ? ? ?json?? 前面標(biāo)注有json
? ? ? ? ? ? ? ? ? ? ? ? ? post?? 一個(gè)書本啡彬,一個(gè)箭頭
????????????????????????右邊欄:點(diǎn)擊左邊其中一個(gè)請(qǐng)求羹与,這個(gè)請(qǐng)求的詳細(xì)信息就會(huì)顯示到右邊欄
????????????????????????右上邊欄:http請(qǐng)求信息
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 點(diǎn)擊? Insepctors
????????????????????????????????????webforms:post請(qǐng)求所有的表單數(shù)據(jù)
????????????????????????????????????raw:整個(gè)請(qǐng)求以純文本的格式顯示給你
????????????????????????右下邊欄:http請(qǐng)求響應(yīng)信息
????????????????????????????????有一個(gè)黃色提示信息響應(yīng)體被編碼過(guò),需要點(diǎn)擊解碼庶灿。
????????????????????????????????headers:響應(yīng)頭信息
????????????????????????????????textview:響應(yīng)的信息以文本的形式顯示出來(lái)
????????????????????????????????imageview:如果圖片纵搁,在這里顯示圖片
????????????????????????????????webview:模擬瀏覽器顯示
????????????????????????????????cookies:cookie信息
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?raw:將響應(yīng)的信息以純文本的形式展示給你
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?json:一些接口返回給你json,在這里查看
????????????????3往踢、禁止fiddler抓包腾誉,file,點(diǎn)擊第一個(gè)選項(xiàng)取消對(duì)號(hào)即可
????????????????4峻呕、清除所有的請(qǐng)求利职, 點(diǎn)擊x號(hào),remove all
????????????????5瘦癌、左下角黑色框框猪贪,輸入指令的地方
? ? ? ? ? ? ? ? ? ? ?select json? select html? select image? cls 清楚所有請(qǐng)求? ??main? 搜索
十:urllib庫(kù)
? ? ? ?urllib庫(kù)是Python提供的用于操作URL的模塊,在2版本中讯私,有urllib和urllib2兩個(gè)庫(kù)热押,在3版本中,只有urllib庫(kù)斤寇,我們使用3系列
urllib.request可以用來(lái)發(fā)送request和獲取request的結(jié)果
urllib.parse用來(lái)解析和處理URL
?? 【1】urllib.request.urlopen方法
????? urlopen(url, data = None,context = None)
??????? 如果有data桶癣,則代表是post請(qǐng)求,context表示的是https請(qǐng)求的消除ssl錯(cuò)誤
??????? urllib.request.urlretrieve(url, file_path) 將url內(nèi)容直接下載到file_path中
注意:windows和mac在通過(guò)urlopen發(fā)送https請(qǐng)求的時(shí)候有可能報(bào)錯(cuò)
? ? ? ? 錯(cuò)誤:SSL: CERTIFICATE_VERIFY_FAILED
? ? ? ? 原因:Python 2.7.9 之后引入了一個(gè)新特性娘锁,當(dāng)使用urllib.urlopen打開一個(gè) https 鏈接時(shí)牙寞,會(huì)驗(yàn)證一次 SSL證書。
解決方案:
? ? ? ? ? ? ? ? 1-使用ssl創(chuàng)建未經(jīng)驗(yàn)證的上下文莫秆,在urlopen中傳入上下文參數(shù)
? ??????????????????????context = ssl._create_unverified_context()
? ? ? ? ? ? ? ? ????????urllib.request.urlopen("url",context=context).read()
? ? ? ? ? ? ? ? 2-全局取消證書驗(yàn)證
? ? ? ? ? ? ? ? ? ? 在文件中導(dǎo)入ssl并添加一行代碼
? ????????????????????import ssl
? ? ? ? ? ? ? ? ? ? ? ssl._create_default_https_context = ssl._create_unverified_context
?? 【2】HTTPResponse對(duì)象常見方法
??????? read()??讀取的是二進(jìn)制數(shù)據(jù)
????????? 字符串類型和字節(jié)類型
??????? ????? 字符串==》字節(jié)? 編碼encode()
??????? ? ??? 字節(jié)==》字符串? 解碼decode()
????????readline() 讀取一行
????????readlines()讀取全部碎税,返回一個(gè)列表
????? 【注意】上面的讀取都是字節(jié)類型,轉(zhuǎn)為字符串類型需要解碼
????? ?? getcode()狀態(tài)碼
????? ?? geturl()??獲取url
????? ?? getheaders()響應(yīng)頭信息 列表里面有元祖
??????? status屬性??http狀態(tài)碼
?? 【3】urllib.parse
????? ?A-urllib.parse.urlencode
??????? 通過(guò)post提交的數(shù)據(jù)馏锡,都需要通過(guò)這個(gè)函數(shù)轉(zhuǎn)碼雷蹂,且發(fā)送請(qǐng)求的時(shí)候必須為字節(jié)格式的,所以post數(shù)據(jù)經(jīng)常如下使用
?????????? data :是一個(gè)字典
?????????? formdata =urllib.parse.urlencode(data).encode('utf-8')
?? ??B-urllib.parse.quote()
?????????? get參數(shù)中杯道,有中文的匪煌,需要使用這個(gè)函數(shù)轉(zhuǎn)碼
http://www.baidu.com?name=中國(guó)
http://tool.chinaz.com/tools/urlencode.aspx編碼在線工具
?? ??C-urllib.parse.unquote()?? url解碼
十一:構(gòu)造請(qǐng)求對(duì)象Request(高級(jí)請(qǐng)求)
?? user-agent在線解析工具
http://www.atool.org/useragent.php
????? request = urllib.request.Request(fullurl,headers=None)
????? 可以直接傳遞headers责蝠,也可request.add_header('User-Agent','xxx')
十二:帶中文的get請(qǐng)求