內(nèi)容簡(jiǎn)述:? ? ?
?????一:爬蟲(chóng)概述和學(xué)習(xí)路線
? ??二:協(xié)議和請(qǐng)求方法?
? ??三:抓包工具-谷歌瀏覽器抓包介紹? ??
? ??四:urllib庫(kù)介紹和使用
? ? 五:構(gòu)建高級(jí)請(qǐng)求對(duì)象Request的get和post
一:爬蟲(chóng)起源
????大數(shù)據(jù)時(shí)代數(shù)據(jù)來(lái)源:
? ? ? ? ?1.企業(yè)生產(chǎn)的用戶(hù)數(shù)據(jù)(BAT)? 例如:百度指數(shù)|阿里指數(shù)|微指數(shù)等
????????????????http://index.baidu.com/? ? ??http://index.1688.com/?
? ? ? ? ?2.數(shù)據(jù)管理咨詢(xún)公司? ? ? ? ? ? ? 例如:艾瑞咨詢(xún)|埃森哲
????????????????http://www.iresearch.com.cn/? https://www.accenture.com/cn-en
? ? ? ? ?3.政府/機(jī)構(gòu)提供的公開(kāi)數(shù)據(jù)? 例如:統(tǒng)計(jì)局|世界銀行等
????????????????http://www.stats.gov.cn/? ? ? ?https://data.worldbank.org.cn/?
? ? ? ? ?4.第三方數(shù)據(jù)平臺(tái)購(gòu)買(mǎi)數(shù)據(jù)? ? 例如:貴陽(yáng)大數(shù)據(jù)交易平臺(tái)
? ? ? ? ?5.爬蟲(chóng)爬取數(shù)據(jù)
二:爬蟲(chóng)概念及分類(lèi)
? ? ?概念:是抓取網(wǎng)頁(yè)數(shù)據(jù)的程序疯潭。
? ? ?使用場(chǎng)景分類(lèi):通用爬蟲(chóng)和聚焦爬蟲(chóng)概念
? ? ?通用爬蟲(chóng):
??????? 通用網(wǎng)絡(luò)爬蟲(chóng)是捜索引擎抓取系統(tǒng)(Baidu剑勾、Google象浑、Yahoo等)的組成部分驰唬。
????????主要目的是將互聯(lián)網(wǎng)上的網(wǎng)頁(yè)下載到本地谤祖,形成一個(gè)互聯(lián)網(wǎng)內(nèi)容的鏡像備份油宜。
? ? ? ?通用爬蟲(chóng)工作流程:
????????????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è)用戶(hù)提供服務(wù)
????????Robots協(xié)議:協(xié)議會(huì)指明通用爬蟲(chóng)可以爬取網(wǎng)頁(yè)的權(quán)限。
????????Robots.txt 并不是所有爬蟲(chóng)都遵守绞旅,大型的搜索引擎爬蟲(chóng)會(huì)遵守摆尝。
? ? ? ? 聚焦爬蟲(chóng):是"面向特定個(gè)性化需求"的一種網(wǎng)絡(luò)爬蟲(chóng)程序。
三:怎么爬數(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í)爬蟲(chóng)必備知識(shí)點(diǎn)
????????1.Python的基本語(yǔ)法知識(shí)
????????2.如何抓取HTML頁(yè)面:
? ? ? ? ? ? ? ? ?HTTP請(qǐng)求的處理琐鲁,urllib、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)輸入/專(zhuān)門(mén)的打碼平臺(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.爬蟲(chóng)-反爬蟲(chóng)-反反爬蟲(chóng)之間的戰(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ò)爬蟲(chóng)抓取過(guò)程可以理解為模擬瀏覽器操作的過(guò)程。
????瀏覽器的主要功能是向服務(wù)器發(fā)出請(qǐng)求控嗜,在瀏覽器窗口中展示你選擇的網(wǎng)絡(luò)資源茧彤,HTTP是一套計(jì)算機(jī)通過(guò)網(wǎng)絡(luò)進(jìn)行通信的規(guī)則。
HTTP通信由兩部分組成:?客戶(hù)端請(qǐng)求消息?與?服務(wù)器響應(yīng)消息
瀏覽器發(fā)送HTTP請(qǐng)求的過(guò)程:
????????1-當(dāng)用戶(hù)在瀏覽器的地址欄中輸入一個(gè)URL并按回車(chē)鍵之后疆栏,瀏覽器會(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的縮寫(xiě)):統(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:訪問(wèn)資源的路徑
????????????????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?? 客戶(hù)端請(qǐng)求ip
? ?????Response Headers
????????????????????Cache-Control: private? 告訴客戶(hù)端下次請(qǐng)求的方式
????????????????????Connection: Keep-Alive? 客戶(hù)端和服務(wù)端的連接類(lèi)型
????????????????????Content-Encoding: gzip? 服務(wù)端返回的數(shù)據(jù)是經(jīng)過(guò)gzip編碼的
????????????????????Content-Type:text/html;charset=utf-8? 響應(yīng)文件的類(lèi)型和字符編碼
????????????????????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?? 可以接受返回的類(lèi)型
????????????????????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ù)端連接類(lèi)型
? ? ? ? ? ? ? ? ? ?Cookie: BAIDUID=F68132AFC5355:FG=1; Cookie類(lèi)型
????????????????????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? 瀏覽器名稱(chēng)
九: urllib庫(kù)
? ? ?urllib庫(kù)是Python提供的用于操作URL的模塊
?? ??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打開(kāi)一個(gè) https 鏈接時(shí),會(huì)驗(yàn)證一次 SSL證書(shū)启妹。
? ? ? ? 解決方案:
? ? ? ? ? ? ? ? 1-使用ssl創(chuàng)建未經(jīng)驗(yàn)證的上下文筛严,在urlopen中傳入上下文參數(shù)
? ??????????????????????context = ssl._create_unverified_context()
? ? ? ? ? ? ? ? ????????urllib.request.urlopen("url",context=context).read()
? ? ? ? ? ? ? ? 2-全局取消證書(shū)驗(yàn)證
? ? ? ? ? ? ? ? ? ? 在文件中導(dǎo)入ssl并添加一行代碼
? ????????????????????import ssl
? ? ? ? ? ? ? ? ? ? ? ssl._create_default_https_context = ssl._create_unverified_context
?? 【2】HTTPResponse對(duì)象常見(jiàn)方法
??????? ????read()??讀取的是二進(jìn)制數(shù)據(jù)
????????? ????????字符串類(lèi)型和字節(jié)類(lèi)型
??????? ????? ????????字符串==》字節(jié)? 編碼encode()
??????? ? ??? ????????字節(jié)==》字符串? 解碼decode()
????????????readline() 讀取一行
????????????readlines()讀取全部,返回一個(gè)列表
????? 【注意】上面的讀取都是字節(jié)類(lèi)型饶米,轉(zhuǎn)為字符串類(lèi)型需要解碼
????? ?? ????getcode()狀態(tài)碼
????? ?? ????geturl()??獲取url
????? ?? ????getheaders()響應(yīng)頭信息 列表里面有元祖
? ? ? ? ?????status屬性??http狀態(tài)碼
?? 【3】urllib.parse
????? ?????A-urllib.parse.urlencode
??????? ????????通過(guò)post提交的數(shù)據(jù)桨啃,需通過(guò)此函數(shù)轉(zhuǎn)碼,且發(fā)送請(qǐng)求的時(shí)候必須為字節(jié)格式的檬输,
????????????????所以post請(qǐng)求數(shù)據(jù)經(jīng)常如下使用
? ? ? ? ? ? ? ? ?data :是一個(gè)字典
? ? ? ? ? ? ? ? ? data =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)求
十三:POST請(qǐng)求(百度翻譯)
? 溫馨提示:
?? ? ????a.如果只加User-Agent獲取不到想要的結(jié)果析命,將所有請(qǐng)求頭復(fù)制再次請(qǐng)求
? ? ?????b.不要帶-請(qǐng)求頭里面'Accept-Encoding': 'gzip, deflate'
十四:作業(yè)
? ??????1-完成課堂代碼
? ? ? ? 2-完成必應(yīng)翻譯get和post請(qǐng)求