






數(shù)據(jù)采集工具
urllib庫(kù)
簡(jiǎn)介
它是python的標(biāo)準(zhǔn)庫(kù),提供了一系列用于操作url的功能,是模擬瀏覽器發(fā)送請(qǐng)求的庫(kù)
模塊
request:
常用方法
urlopen(url,data):向服務(wù)器發(fā)送請(qǐng)求
Request(url,headers):構(gòu)建請(qǐng)求頭信息
error
功能:urllib.error可以接收有urllib.request產(chǎn)生的異常。
常見(jiàn)類
URLError
1.網(wǎng)絡(luò)故障導(dǎo)致網(wǎng)絡(luò)不通
2.服務(wù)器連接失敗
3.找不到指定服務(wù)器
HTTPError
它是URLError的子類,當(dāng)這兩個(gè)同時(shí)捕獲異常的時(shí)候,必須把HTTPError寫(xiě)在URLError上面。
parse
簡(jiǎn)介
urllib中對(duì)url進(jìn)行解析的模塊
常用方法
urlencode(字典格式的數(shù)據(jù))
將字典格式的數(shù)據(jù)轉(zhuǎn)換成:key=value&key=value的格式
quote(url)
將中文轉(zhuǎn)化為%XXX的格式
unquote(url)
將%xxx格式轉(zhuǎn)化為中文
robotparse
urllib爬蟲(chóng)步驟
1.導(dǎo)入模塊 import urllib.request
2、使用urllib.request.urlopen(url)向服務(wù)器發(fā)送請(qǐng)求
3. 使用read()讀取網(wǎng)頁(yè)內(nèi)容(字節(jié)串),并通過(guò)decode()進(jìn)行轉(zhuǎn)碼(將字節(jié)串轉(zhuǎn)化為字符串)
實(shí)例:豆瓣中通過(guò)輸入關(guān)鍵字和編號(hào)來(lái)獲取部分?jǐn)?shù)據(jù)
get請(qǐng)求方式的步驟:
1.將url中?后的內(nèi)容進(jìn)刪除
2.將?后的數(shù)據(jù)分別提取屬性名和屬性值,并將其存放到字典中
3.使用urllib.parse.urlencode()將字典進(jìn)行轉(zhuǎn)碼
4.將url與轉(zhuǎn)碼后的內(nèi)容進(jìn)行拼接
5.用拼接后的url向服務(wù)器發(fā)送請(qǐng)求
實(shí)例:肯德基門店信息數(shù)據(jù)采集
post請(qǐng)求步驟
1.將參數(shù)存儲(chǔ)到字典中
2.使用urllib的解析模塊對(duì)字典數(shù)據(jù)進(jìn)行解析(注意:進(jìn)行encode()轉(zhuǎn)碼)
3.在urllib中urlopen()方法中將解析后的數(shù)據(jù)作為data參數(shù)的參數(shù)值。
擴(kuò)展知識(shí)
AJAX
簡(jiǎn)介:異步的javascript和XML
特點(diǎn):在不重復(fù)加載整個(gè)頁(yè)面的情況下,可以與服務(wù)器交換數(shù)據(jù)并更新部分網(wǎng)頁(yè)內(nèi)容。
工作原理
請(qǐng)求方式
get方式
簡(jiǎn)單快捷,大部分情況都能使用,主要應(yīng)用在數(shù)據(jù)傳輸量少時(shí)。
post方式
1.無(wú)法使用緩存文件(更新服務(wù)器上的文件或數(shù)據(jù)庫(kù))
2.向服務(wù)器發(fā)送大量數(shù)據(jù)時(shí)使用(post方式無(wú)數(shù)據(jù)量限制)
3.當(dāng)發(fā)送未知字符時(shí)post方式比get方式穩(wěn)定。
JSON
簡(jiǎn)介:javascript對(duì)象表示法,是存儲(chǔ)和交換文本信息的語(yǔ)法
? ? ? ? 是輕量級(jí)的文本數(shù)據(jù)交換格式,使用javascript語(yǔ)法來(lái)
? ? ? ? 描述數(shù)據(jù)對(duì)象。
語(yǔ)法
1.對(duì)象在{ key:value}中定義
2.數(shù)據(jù)在[數(shù)據(jù) ]中定義
3.數(shù)據(jù)由逗號(hào)隔開(kāi)
4.數(shù)據(jù)在名稱/值對(duì)中。
python處理json字符串方法
1.導(dǎo)入json模塊:import json
2.調(diào)用該模塊的方法
json.dumps():將字典或列表格式轉(zhuǎn)化為json字符串
json.loads():將json字符串格式轉(zhuǎn)化為字典
json.dump():將字典或列表格式轉(zhuǎn)化為json字符串并寫(xiě)入文件中。
json.load():將json字符串格式轉(zhuǎn)化為字典并寫(xiě)入文件中
例:json.dump(dict,open("文件名",“打開(kāi)方式",編碼))
requests
簡(jiǎn)介
requests是python第三方庫(kù),是基于urllib基礎(chǔ)上編寫(xiě)的爬蟲(chóng)庫(kù)。
安裝方法
pip install requests
使用方法
1.導(dǎo)入模塊:import requests
2.使用get/post/put/head()方法向服務(wù)器發(fā)送請(qǐng)求
3.讀取網(wǎng)頁(yè)內(nèi)容
常用方法
requests.get(url,headers,params,data,cookies,proxies,verity,file,timeout,auth)
參數(shù)說(shuō)明:
url:向服務(wù)器發(fā)送請(qǐng)求的網(wǎng)址
headers:請(qǐng)求的頭信息
params:get請(qǐng)求參數(shù)
data:post請(qǐng)求參數(shù)
cookies:身份信息存儲(chǔ)
proxies:IP代理
verity:證書(shū)驗(yàn)證
file:文件上傳
timeout:設(shè)置超時(shí)時(shí)間
auth:指定用戶用戶名和密碼認(rèn)證登錄
響應(yīng)信息
r.text:以字符串格式獲取網(wǎng)頁(yè)內(nèi)容
r.content:以字節(jié)串格式獲取網(wǎng)頁(yè)內(nèi)容
r.url:返回請(qǐng)求url
r.stauts_code:獲取響應(yīng)狀態(tài)碼
200:請(qǐng)求成功
401:請(qǐng)求要求身份驗(yàn)證
404:找不到請(qǐng)求網(wǎng)頁(yè)
403:服務(wù)器拒絕訪問(wèn)
503:服務(wù)器關(guān)閉維修狀態(tài)
r.reason:獲取狀態(tài)碼返回的信息
r.encoding:返回編碼方式
r.cookies:獲取網(wǎng)頁(yè)的cookies
請(qǐng)求信息
r.request.url/headers/method(請(qǐng)求方法)/cookies
selenium
簡(jiǎn)介
selenium是python的第三方庫(kù),對(duì)外提供
接口可操作瀏覽器,完成瀏覽器的自動(dòng)化操作。
安裝
前期準(zhǔn)備
1.查看谷歌瀏覽器版本(右上角—幫助—版本)
子主題 1
2.查找與本機(jī)瀏覽器版本對(duì)應(yīng)的驅(qū)動(dòng)器版本
https://blog.csdn.net/huilan_same/article/details/51896672
3.下載谷歌驅(qū)動(dòng)器 chromedriver.exe
http://chromedriver.storage.googleapis.com/index.html
安裝
pip install selenium
基本操作
1.導(dǎo)入webdriver模塊
from selenium import webdriver
2.定義瀏覽器對(duì)象
browser = webdriver.Chorme(r'驅(qū)動(dòng)器路徑')
3.打開(kāi)瀏覽器
browser.get(url)
對(duì)html元素的獲取
1.find_element_by_id():根據(jù)id名獲取元素
2.find_element_by_class_name():根據(jù)class名獲取元素
3.find_element_by_name():通過(guò)name屬性名獲取元素
4.find_element_by_link_text():
通過(guò)超鏈接文本名稱獲取元素
5.find_element_by_partical_link_text():
通過(guò)部分鏈接文本獲取元素
6.find_element_by_tag_name():
通過(guò)標(biāo)簽名獲取元素
7.find_element_by_xpath():
通過(guò)xpath路徑獲取數(shù)據(jù)
8.find_element_by_css_selector():
通過(guò)css選擇器獲取元素
常用方法與屬性
方法
get():根據(jù)url打開(kāi)網(wǎng)頁(yè)
send_keys(“輸入文本”):向文本框中輸入數(shù)據(jù)
click():單擊選中元素
save_screenshot():將網(wǎng)頁(yè)保存成圖片存到外部文檔中
implicitly_wait():webdriver提供的一個(gè)隱性等待的時(shí)間,在一個(gè)時(shí)間段內(nèi)只能的等待,超時(shí)則拋出異常
屬性
page_source:獲取html文檔代碼
url:獲取網(wǎng)頁(yè)的url
title:獲取網(wǎng)頁(yè)的標(biāo)題
轉(zhuǎn)換問(wèn)題解決
switch_to.frame()
問(wèn)題描述:當(dāng)一個(gè)網(wǎng)頁(yè)中嵌入另一個(gè)獨(dú)立頁(yè)面時(shí),
需要切換到該獨(dú)立頁(yè)面才能獲取頁(yè)面元素。
解決方法:browser.switch_to.frame(id/name/xpath)
switch_to.window()
問(wèn)題描述:當(dāng)通過(guò)點(diǎn)擊超鏈接時(shí)打開(kāi)一個(gè)新窗口,如果獲取新窗口的元素時(shí),需要切換到該窗口。
解決方法:
1.獲取當(dāng)前窗口的窗口標(biāo)志(句柄)
s_window = browser.current_window_handle
2.獲取所有打開(kāi)窗口的句柄
all_windows = browser.window_handlers
3.遍歷所有窗口,判斷新打開(kāi)窗口不為之前窗口時(shí),切換到新窗口
for h in all_windows:
? ? if h != s_window:
? ? ? ? ? browser.switch_to.window(h)
常用屬性與方法
current_window_handle:獲得當(dāng)前窗口標(biāo)志(句柄)。
window_handles:返回所有窗口的句柄到當(dāng)前會(huì)話。
switch_to.window():用于切換到相應(yīng)的窗口
close():關(guān)閉當(dāng)前窗口
quit():關(guān)閉所有窗口
switch_to_alert()
問(wèn)題描述:當(dāng)通過(guò)觸發(fā)網(wǎng)頁(yè)元素彈出警告框alert()、prompt()、comfirm()時(shí),需要通過(guò)警告框
解決辦法:browser.switch_to_alert()
常用方法
accept():接受警告內(nèi)容,點(diǎn)擊確定按鈕
dismiss():解散現(xiàn)有警告框,點(diǎn)擊取消按鈕。
send_keys():向prompt()警告框中輸入內(nèi)容
操作鼠標(biāo)與鍵盤(pán)
操作鼠標(biāo)
1.導(dǎo)入ActionChains類
from selenium.webdriver.common.action_chains import ActionChains
2.創(chuàng)建該類的對(duì)象
action = ActionChains(browser)
3.調(diào)用該類中的方法對(duì)鼠標(biāo)進(jìn)行操作
格式:action.鼠標(biāo)操作方法
鼠標(biāo)點(diǎn)擊
click():?jiǎn)螕羰髽?biāo)左鍵
context_click():單擊鼠標(biāo)右鍵
double_click():雙擊鼠標(biāo)左鍵
click_and_hold():按住鼠標(biāo)左鍵
鼠標(biāo)移動(dòng)
move_to_element():將鼠標(biāo)移動(dòng)到指定元素
move_to_offset(x,y):按照偏移量移動(dòng)鼠標(biāo)
鼠標(biāo)拖拽
drag_and_drop(source,target):將元素從起點(diǎn)source移動(dòng)到終點(diǎn)target
drag_and_drop_by_offset(source,xoffset,yoffset):按照坐標(biāo)移動(dòng)
操作鍵盤(pán)
解決select標(biāo)簽問(wèn)題
1.導(dǎo)入Select類
from selenium.webdriver.support.select import Select
2.創(chuàng)建對(duì)象
s = Select(select元素)
3.調(diào)用方法選取下拉列表元素
select_by_index(index):根據(jù)index屬性定位選項(xiàng),index從0開(kāi)始
select_by_value(value):根據(jù)value屬性定位
select_by_visible_text(text):根據(jù)選項(xiàng)文本值來(lái)定位
first_selected_option():選擇第一個(gè)選項(xiàng)
scrapy