寫在前面
之前寫了兩篇關(guān)于爬蟲的文章微信好友大揭秘平酿,趙雷到底在唱什么塞椎,純粹是自己的興趣引導(dǎo)自己學(xué)習(xí)爬蟲尔许,關(guān)注里應(yīng)該有好多對(duì)爬蟲感興趣的小伙伴,為了鞏固自己的爬蟲知識(shí)诀浪,從今天開始更新python爬蟲這個(gè)基礎(chǔ)教程棋返,自己準(zhǔn)備了挺長(zhǎng)時(shí)間整理了自己的學(xué)習(xí)筆記,希望能給初學(xué)者帶來一點(diǎn)幫助雷猪,在這個(gè)教程里我會(huì)給大家介紹爬蟲常用的庫(kù)跟大家做幾個(gè)有意思的Demo睛竣。這篇文章主要是讓大家了解爬蟲和爬蟲需要的基礎(chǔ)知識(shí),話不多說春宣,我們開始吧酵颁。
什么是爬蟲?
爬蟲就是請(qǐng)求網(wǎng)站并提取數(shù)據(jù)的自動(dòng)化程序月帝,從技術(shù)層面來說就是通過程序模擬瀏覽器請(qǐng)求站點(diǎn)的行為躏惋,把站點(diǎn)返回的HTML代碼/JSON數(shù)據(jù)/二進(jìn)制數(shù)據(jù)(圖片、視頻) 爬到本地嚷辅,進(jìn)而提取自己需要的數(shù)據(jù)簿姨,存放起來使用。舉個(gè)小栗子來加深印象簸搞,如果我們把互聯(lián)網(wǎng)比作一張大的蜘蛛網(wǎng)扁位,數(shù)據(jù)便是存放于蜘蛛網(wǎng)的各個(gè)節(jié)點(diǎn),而爬蟲就是一只小蜘蛛趁俊,沿著網(wǎng)絡(luò)抓取自己的數(shù)據(jù)域仇。
爬蟲的基本流程
發(fā)起請(qǐng)求,通過使用HTTP庫(kù)向目標(biāo)站點(diǎn)發(fā)起請(qǐng)求寺擂,即發(fā)送一個(gè)Request暇务,請(qǐng)求可以包含額外的headers等信息泼掠,并等待服務(wù)器響應(yīng)。
獲取響應(yīng)內(nèi)容如果服務(wù)器能正常響應(yīng)垦细,則會(huì)得到一個(gè)Response择镇,Response的內(nèi)容就是所要獲取的頁(yè)面內(nèi)容,其中會(huì)包含:html括改,json腻豌,圖片,視頻等嘱能。
解析內(nèi)容得到的內(nèi)容可能是Html數(shù)據(jù)吝梅,可以使用正則表達(dá)式,第三方解析庫(kù)如Beautifulsoup惹骂,pyquery等憔涉,要解析json數(shù)據(jù)可以使用json模塊,二進(jìn)制數(shù)據(jù)析苫,可以保存或者進(jìn)一步的處理兜叨。
保存數(shù)據(jù)保存的方式比較多元,可以存入數(shù)據(jù)庫(kù)也可以使用文件的方式進(jìn)行保存衩侥。
字符串的區(qū)別和轉(zhuǎn)化
為什么要掌握python3字符串的相關(guān)知識(shí)国旷?
在我們爬蟲過程中url,響應(yīng)內(nèi)容茫死,提取的數(shù)據(jù)都是字符串跪但,因此我們需要去了解字符串的相關(guān)知識(shí)。大家都知道bytes是一個(gè)二進(jìn)制峦萎,當(dāng)然互聯(lián)網(wǎng)的數(shù)據(jù)都是以二進(jìn)制的方式傳輸?shù)穆啪茫籹tr是unicode的呈現(xiàn)形式,后續(xù)的爬蟲過程中少不了兩者的相互轉(zhuǎn)換爱榔,str使用encode方法轉(zhuǎn)換成bytes被环,bytes通過decode轉(zhuǎn)化為str,值的引起注意的是編碼方式解碼方式必須一樣详幽,否則就會(huì)出現(xiàn)亂碼筛欢。
Http和Https
我們?cè)谂老x過程中需要運(yùn)用到Http的相關(guān)知識(shí),在這里簡(jiǎn)單的給大家介紹Http和Https的相關(guān)概念唇聘。
HTTP是超文本傳輸協(xié)議版姑,被用于在Web瀏覽器和網(wǎng)站服務(wù)器之間傳遞信息,HTTP協(xié)議以明文方式發(fā)送內(nèi)容迟郎,不提供任何方式的數(shù)據(jù)加密剥险,如果攻擊者截取了Web瀏覽器和網(wǎng)站服務(wù)器之間的傳輸報(bào)文,就可以直接讀懂其中的信息宪肖,默認(rèn)端口號(hào):80表制。
為了解決HTTP協(xié)議的這一缺陷宇姚,需要使用另一種協(xié)議:安全套接字層超文本傳輸協(xié)議HTTPS,為了數(shù)據(jù)傳輸?shù)陌踩蛲梗琀TTPS在HTTP的基礎(chǔ)上加入了SSL協(xié)議,SSL依靠證書來驗(yàn)證服務(wù)器的身份阱持,并為瀏覽器和服務(wù)器之間的通信加密夭拌,默認(rèn)端口號(hào):443。
URL的形式
這是我們需要了解一個(gè)url的基本形式衷咽。
scheme:協(xié)議 例如http https ftp
host:服務(wù)器的ip地址或者域名
port:服務(wù)器的端口鸽扁,協(xié)議的默認(rèn)端口是80或者443
path:訪問資源的路徑
query-string :參數(shù),發(fā)送給http服務(wù)器的數(shù)據(jù)镶骗,以桶现?開頭 &鏈接
anchor:錨 跳轉(zhuǎn)到網(wǎng)頁(yè)的指定錨點(diǎn)位置
可以對(duì)應(yīng)的看一下百度網(wǎng)址:
https://www.baidu.com/baidu?wd=%E7%99%BE%E5%BA%A6&tn=monline_dg&ie=utf-8
Http請(qǐng)求格式
這里帶大家簡(jiǎn)單的了解Http請(qǐng)求的格式:
Host:主機(jī)和端口號(hào)
Connection:連接類型
User-Agent:瀏覽器名稱
Accept:傳輸文件類型
Accept-Encoding:文件編碼格式
Cookie:cookie
X-Requested-With:Ajax異步請(qǐng)求
瀏覽器中可以查看具體請(qǐng)求頭數(shù)據(jù),以百度為例:
GET / HTTP/1.1 使用Get方法 Http協(xié)議
Host: www.baidu.com
Connection: keep-alive 表示長(zhǎng)鏈接鼎姊,想要復(fù)用上次的鏈接骡和,目的提高響應(yīng)時(shí)間
Accept: text/javascript, application/javascript, application/ecmascript, application/x-ecmascript, /; q=0.01 瀏覽器身份標(biāo)識(shí)
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Cookie: BAIDUID=E67EB919B93326D6D11DE4F2688038F8:FG=1;
Request與Response
瀏覽器就發(fā)送消息給該網(wǎng)址所在的服務(wù)器,這個(gè)過程叫做HTTP Request相寇。服務(wù)器收到瀏覽器發(fā)送的消息后慰于,能夠根據(jù)瀏覽器發(fā)送消息的內(nèi)容,做相應(yīng)處理唤衫,然后把消息回傳給瀏覽器婆赠。這個(gè)過程叫做HTTP Response。瀏覽器收到服務(wù)器的Response信息后佳励,會(huì)對(duì)信息進(jìn)行相應(yīng)處理休里,然后展示。
Resquest中主要包含請(qǐng)求方式赃承,請(qǐng)求頭妙黍,請(qǐng)求體和請(qǐng)求URL,Response中包含響應(yīng)狀態(tài)瞧剖,響應(yīng)頭废境,響應(yīng)體。
抓取的數(shù)據(jù)都是什么樣的筒繁?
我們爬取來的數(shù)據(jù)一般都是網(wǎng)頁(yè)文本(HTML文檔噩凹、Json格式文本),圖片或者視頻(獲取到的是二進(jìn)制文件毡咏,相應(yīng)的保存為圖片或者視頻格式)驮宴。
怎樣解析數(shù)據(jù)
在將我們抓取到的數(shù)據(jù)進(jìn)行解析的時(shí)候需要用到下面的方法:直接處理,json解析呕缭,正則表達(dá)式堵泽,BeautifulSoup修己,PyQuery,XPath迎罗。
總結(jié)
1睬愤、爬蟲流程:
請(qǐng)求--->獲取響應(yīng)--->解析--->存儲(chǔ)
2、爬蟲所需工具:
請(qǐng)求庫(kù):requests,selenium(可以驅(qū)動(dòng)瀏覽器解析渲染CSS和JS纹安,但有性能劣勢(shì)(有用沒用的網(wǎng)頁(yè)都會(huì)加載)
解析庫(kù):正則尤辱,beautifulsoup,pyquery
存儲(chǔ)庫(kù):文件厢岂,MySQL光督,Mongodb,
【推薦閱讀】