爬蟲第一講:什么是爬蟲

什么是爬蟲?

請(qǐng)求網(wǎng)站并提取數(shù)據(jù)的自動(dòng)化程序

請(qǐng)求

用代碼模擬瀏覽器向網(wǎng)站發(fā)出請(qǐng)求。并獲取資源

資源是一堆html代碼。我們需要的數(shù)據(jù)就包含在這堆html代碼中

提取

提取就是從這堆html代碼中獲得我們想要的特定的內(nèi)容。

自動(dòng)化

程序是自動(dòng)運(yùn)行的,代替瀏覽器不斷的發(fā)送請(qǐng)求,批量的提取和處理數(shù)據(jù)

爬蟲的基本流程

  1. 發(fā)起請(qǐng)求

    通過HTTP庫(kù)向目標(biāo)站點(diǎn)發(fā)起請(qǐng)求,即發(fā)送一個(gè)Request,請(qǐng)求可以包含額外的headers等信息,等待服務(wù)器響應(yīng)。

  2. 獲取響應(yīng)內(nèi)容

    如果服務(wù)器能正常響應(yīng),會(huì)得到一個(gè)Response,Response的內(nèi)容便是所要獲取的頁(yè)面內(nèi)容,類型可能有HTML,Json字符串,二進(jìn)制數(shù)據(jù)(如圖片視頻)等類型。

  3. 解析內(nèi)容

得到的內(nèi)容可能是HTML,可以用正則表達(dá)式、網(wǎng)頁(yè)解析庫(kù)進(jìn)行解析??赡苁荍son,可以直接轉(zhuǎn)換為Json對(duì)象解析,可能是二進(jìn)制數(shù)據(jù),可以做保存或者進(jìn)一步處理。

  1. 保存數(shù)據(jù)

    保存形式多樣,可以保存為文本,也可以保存到數(shù)據(jù)庫(kù),或者保存為特定格式的的文件。

什么是Request和Response

1.瀏覽器發(fā)送消息給該網(wǎng)站所在的服務(wù)器,這個(gè)過程叫做HTTP Request。
2.服務(wù)器收到瀏覽器發(fā)送的消息后,能夠根據(jù)瀏覽器發(fā)送消息的內(nèi)容,做相應(yīng)處理,然后把消息回傳給瀏覽器。這個(gè)過程叫做HTTP Response.
3.瀏覽器收到服務(wù)器的Response信息后,會(huì)對(duì)信息進(jìn)行相應(yīng)處理,然后展示。

Request中包含什么?

1.請(qǐng)求方式--主要有GET、POST兩種,還有HEAD、PUT、delete、OPTIONS等
get請(qǐng)求方式的特點(diǎn)--內(nèi)容直接在url參數(shù)中,不安全。
POST要構(gòu)造FormData
2.請(qǐng)求URL--統(tǒng)一資源定位符
3.請(qǐng)求頭--一些配置信息Request headers 最重要的user-Agent:什么類型的瀏覽器。服務(wù)器由此判斷是什么瀏覽器發(fā)起的請(qǐng)求。還有cookie,一般爬蟲都要構(gòu)造Request Headers
4.請(qǐng)求體--請(qǐng)求時(shí)額外攜帶的數(shù)據(jù),如表單提交時(shí)的表單數(shù)據(jù)。

Response中包含什么內(nèi)容

1.響應(yīng)狀態(tài)---有多種響應(yīng)狀態(tài),如200代表響應(yīng)狀態(tài),如200表示成功,301跳轉(zhuǎn),404找不到頁(yè)面,502服務(wù)器錯(cuò)誤。
2.響應(yīng)頭--如內(nèi)容類型、內(nèi)容長(zhǎng)度、服務(wù)器信息、設(shè)置cookie等等
3.響應(yīng)體--最主要的部分,包含請(qǐng)求資源的內(nèi)容,如網(wǎng)頁(yè)的HTML、圖片的二進(jìn)制數(shù)據(jù)等等

能抓怎么樣的數(shù)據(jù)

1.最常見的HTML文檔、Json格式文本等
2.圖片等二進(jìn)制文件,保存為圖片格式

import requests
myres = requests.get('https://n.sinaimg.cn/finance/blackcat/pc/heimao.gif')
print(myres.content) #打印返回的內(nèi)容,是響應(yīng)體的二進(jìn)制格式
with open('/var/tmp/1.gif', 'wb') as f:
     f.write(myres.content)
     f.close()


3.視頻格式,也是二進(jìn)制文件,保存為視頻格式

4.其他,只要能請(qǐng)求到的,都能保存

怎樣解析

解析方式
1.直接處理,返回字符串,簡(jiǎn)單處理就可以了。構(gòu)造簡(jiǎn)單,返回結(jié)構(gòu)簡(jiǎn)單
2.Json解析。一般是Json的字符串,轉(zhuǎn)換為Json對(duì)象
3.正則表達(dá)式,比較普遍的方式
4.BeautifulSoup,更加容易
5.PyQuery
6.XPath

為什么我抓到的和瀏覽器看到的不同

都是JavaScript調(diào)用訪問器接口,得到的數(shù)據(jù)再填充造成的,最后呈現(xiàn)的js渲染完畢之后的代碼,和開始拿到的后臺(tái)請(qǐng)求響應(yīng)的代碼不同。

怎么解決JavaScript渲染的問題?

1.分析Ajax請(qǐng)求
2.Selenium/WebDriver來驅(qū)動(dòng)瀏覽器來模擬加載一個(gè)網(wǎng)頁(yè)。自動(dòng)化測(cè)試的工具

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

options = Options()
options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')
options.add_argument('--headless')
options.add_argument('--disable-gpu')

driver = webdriver.Chrome(executable_path='/usr/bin/chromedriver', chrome_options=options)
driver.get('https://github.com/')
print driver.title
print(driver.page_source) #這里得到的是渲染過后的HTML頁(yè)面,可以作為提取用途
driver.quit()

3.Splash--也是模擬js渲染的

4.PyV8、Ghost.py模擬js

怎樣保存數(shù)據(jù)

1.文本
純文本、Json、Xml等
2.關(guān)系型數(shù)據(jù)庫(kù)
如MySQL、Oracle、SQL Server等具有結(jié)構(gòu)化表結(jié)構(gòu)形式存儲(chǔ)。
3.非關(guān)系型數(shù)據(jù)庫(kù)

4.二進(jìn)制文件--圖片、音頻、視頻等特定格式

最后編輯于
?著作權(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)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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