Python爬蟲第一天:爬蟲概述及抓包工具和urllib庫

內(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://www.baidu.com?name=中國

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請求

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

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

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