Python爬蟲(chóng)第一天:爬蟲(chóng)概述及抓包工具和urllib庫(kù)

內(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)求

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容