什么是爬蟲?
請(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ù)
爬蟲的基本流程
-
發(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)容,類型可能有HTML,Json字符串,二進(jìn)制數(shù)據(jù)(如圖片視頻)等類型。
-
解析內(nèi)容
得到的內(nèi)容可能是HTML,可以用正則表達(dá)式、網(wǎng)頁(yè)解析庫(kù)進(jìn)行解析??赡苁荍son,可以直接轉(zhuǎn)換為Json對(duì)象解析,可能是二進(jìn)制數(shù)據(jù),可以做保存或者進(jìn)一步處理。
-
保存數(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)制文件--圖片、音頻、視頻等特定格式