工具簡(jiǎn)介:
1是晨、selenium簡(jiǎn)介:
一個(gè)用于Web應(yīng)用自動(dòng)化程序測(cè)試的工具竟稳,測(cè)試直接運(yùn)行在瀏覽器中,就像真正的用戶在操作一樣沦补,它可以根據(jù)我們的指令该默、讓瀏覽器自動(dòng)加載頁面,獲取需要的數(shù)據(jù)策彤,甚至頁面截屏,或者判斷網(wǎng)站上某些動(dòng)作是否發(fā)生匣摘,本身不帶瀏覽器店诗,不支持瀏覽器的功能,需要與第三方瀏覽器結(jié)合在一起才能使用音榜,如Firefox庞瘸,Chrome,也可以使用headless瀏覽器PhantomJS在后臺(tái)執(zhí)行赠叼,它可以用來爬取任何網(wǎng)頁上看到的數(shù)據(jù)擦囊。
PS:selenium庫有個(gè)叫webdriver的API,它可以加載網(wǎng)站的瀏覽器嘴办,也可以像BeautifulSoup一樣用來定位元素
Selenium的下載與安裝
- 安裝:在終端輸入 pip install selenium
- 下載:下載Chromedriver瞬场,解壓后放在…\Google\Chrome\Application\
- 環(huán)境變量:將該目錄添加至環(huán)境變量
使用代碼測(cè)試:
from selenium import webdriver #導(dǎo)入包
driver = webdriver.Chrome() #打開Chrome瀏覽器
driver.get("http://www.baidu.com/s?wd=python") #輸入url,百度搜索python
界面如下:
Selenium的優(yōu)缺點(diǎn)
- 優(yōu)點(diǎn):可以爬取任何網(wǎng)頁的任何內(nèi)容涧郊,因?yàn)樗峭ㄟ^瀏覽器訪問的方式進(jìn)行數(shù)據(jù)的爬取贯被,沒有網(wǎng)站會(huì)拒絕瀏覽器的訪問
- 缺點(diǎn):時(shí)間以及內(nèi)存消耗太大
Selenium的操作
查找符合條件的單個(gè)元素:driver.find_element_by_name()
查找符合條件的一組元素:driver.find_elements_by_name()
2、Phantomjs:Python爬蟲利器
一個(gè)基于 WebKit 的服務(wù)器端 JavaScriptAPI妆艘,無界面(headless)瀏覽器彤灶,它會(huì)把網(wǎng)站加載到內(nèi)存并執(zhí)行頁面上的JavaScript,是一個(gè)功能完善(雖然無界面)的瀏覽器批旺,可以用于頁面訪問自動(dòng)化幌陕,網(wǎng)絡(luò)監(jiān)測(cè),網(wǎng)頁截屏汽煮,以及無界面的Web測(cè)試等
PS:Phantomjs非一個(gè)Python的庫搏熄,所以要去官網(wǎng)下載棚唆,安裝后進(jìn)行環(huán)境變量的設(shè)置
運(yùn)行報(bào)錯(cuò):Message 'phantomjs' executable needs to be in PATH?
解決辦法:路徑只寫到bin有可能不夠搬卒,把最后的可執(zhí)行文件也要寫上去
driver = webdriver.PhantomJS("G:/Program Files (x86)/Python/Scripts/phantomjs-2.1.1-windows/bin/phantomjs.exe")
元素的定位
對(duì)象的定位是通過屬性定位來實(shí)現(xiàn)的瑟俭,或是其他的一些信息來找到這個(gè)對(duì)象
如百度輸入框源碼:
# 通過id定位
inputid = driver.find_element_by_id("kw")
# 通過name屬性定位
iuputname = driver.find_element_by_name("wd")
# 通過class屬性定位
inputclass = driver.find_element_by_class_name("s_ipt")
# 通過標(biāo)簽屬性定位
inputtagname = driver.find_element_by_tag_name("input")
# 通過css方式定位
inputcss = driver.find_element_by_css_selector("#kw")
# 通過xpath方式定位
inputxpath = driver.find_element_by_xpath("http://*[@id='kw']")
# 獲取標(biāo)簽的類型
print(inputid.tag_name)
瀏覽器操作
1、截屏:save_screenshot
url = "http://www.baidu.com"
driver.get(url)
time.sleep(1)
# 截屏獲取瀏覽器頁面
driver.save_screenshot("baidu.png")
2契邀、前進(jìn)與后退
# 發(fā)送數(shù)據(jù)請(qǐng)求
driver.get("http://www.baidu.com")
time.sleep(1)
# 截屏獲取瀏覽器頁面
driver.save_screenshot("baidu.png")
driver.get("http://www.youku.com")
driver.save_screenshot("youku.png")
# 后退
driver.back()
driver.save_screenshot("baidu2.png")
# 前進(jìn)
driver.forward()
driver.save_screenshot("youku2.png")
對(duì)象操作摆寄,如全選、剪切
# 輸入關(guān)鍵字
inputid.send_keys("python")
# 通過回車進(jìn)行查詢操作
inputid.send_keys(Keys.RETURN)
inputid.send_keys(Keys.ENTER)
# 暫停2秒坯门,獲取數(shù)據(jù)
#time.sleep(2)
#driver.set_page_load_timeout(2)
driver.save_screenshot("baidu3.png")
# 全選輸入框內(nèi)容
inputid.send_keys(Keys.CONTROL, "a")
driver.save_screenshot("baidu4.png")
# 剪切輸入框內(nèi)容
inputid.send_keys(Keys.CONTROL, "x")
# 獲取查詢按鈕微饥,并點(diǎn)擊
button = driver.find_element_by_id("su").click()
實(shí)戰(zhàn)環(huán)節(jié)
爬取淘寶網(wǎng)-波西米亞裙的商品信息,并把爬取的數(shù)據(jù)存儲(chǔ)在MongoDB數(shù)據(jù)庫中
- 訪問淘寶網(wǎng)古戴;
- 分析搜索框的xpath語句欠橘,并send_keys("波西米亞裙");
- 分析頁面现恼,找到每條商品的信息肃续,使用xpath提取數(shù)據(jù)并將其存儲(chǔ)成字典的格式,進(jìn)行輸出叉袍;
- 找到下一頁的按鈕始锚,模擬點(diǎn)擊它,并循環(huán)第3步,直到循環(huán)結(jié)束 。
實(shí)現(xiàn)代碼:
# -*- coding: utf-8 -*-
# __author__ = 'Carina'
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ec
from pyquery import PyQuery as pq
import re
#driver = webdriver.Chrome()
driver = webdriver.PhantomJS()
wait = WebDriverWait(driver, 10)
# 訪問淘寶網(wǎng)费就,輸入波希米亞裙
def search():
try:
driver.get("https://www.taobao.com")
# 首頁輸入框
input_box = wait.until(ec.presence_of_element_located((By.CSS_SELECTOR, "#q")))
# 搜索按鈕
submit = wait.until(ec.presence_of_element_located((By.CSS_SELECTOR, "#J_SearchForm > button")))
input_box.send_keys('波希米亞裙')
submit.click()
total = wait.until(ec.presence_of_element_located((By.CSS_SELECTOR, "#mainsrp-pager > div > div > div > div.total")))
# 調(diào)用函數(shù)--商品信息
get_products()
return total.text
except TimeoutError:
return search()
# 跳轉(zhuǎn)到下一頁
def next_page(page_number):
try:
# 底部頁碼輸入框
input_box = wait.until(ec.presence_of_element_located((By.CSS_SELECTOR, "#mainsrp-pager > div > div > div > div.form > input")))
# 底部確定按鈕
submit = wait.until(ec.presence_of_element_located((By.CSS_SELECTOR, "#mainsrp-pager > div > div > div > div.form > span.btn.J_Submit")))
input_box.clear()
input_box.send_keys(page_number)
submit.click()
wait.until(ec.text_to_be_present_in_element((By.CSS_SELECTOR, "#mainsrp-pager > div > div > div > ul > li.item.active > span"), str(page_number)))
get_products()
except TimeoutError:
next_page()
# 獲取淘寶商品信息
def get_products():
wait.until(ec.presence_of_element_located((By.CSS_SELECTOR, "#mainsrp-itemlist.items.item")))
html = driver.page_source
doc = pq(html) #pyquery (driver.page_source)就相當(dāng)于requests.get獲取的內(nèi)容
items = doc("#mainsrp-itemlist.items.item").items()
for item in items:
product = {
"image": item.find('.pic .img').attr('src'),
"price": item.find('.price').text(),
"deal": item.find('.deal-cnt').text()[:-3],
"title": item.find('.title').text(),
"shop": item.find('.shop').text(),
"location": item.find('.location').text(),
}
print(product)
def main():
total = search()
total = int(re.compile('(\d+)').search(total).group(1))
# 爬取所有的數(shù)據(jù)用total+1
for i in range(2, 4):
next_page(i)
if __name__ == "__main__":
main()
PS:在學(xué)這塊內(nèi)容的時(shí)候,遇到問題了姐呐,然后去尋求答案,無意中看到了頭條上的新聞典蝌,PhantomJS宣布終止開發(fā)曙砂,所以還是學(xué)習(xí)Firefox和Chrome吧
寫在最后的話
1、常用的學(xué)習(xí)方法:邊學(xué)邊做
把自己學(xué)習(xí)成果分享出來赠法,發(fā)在博客或者GitHub上麦轰,變成開源項(xiàng)目,成為自己的加分項(xiàng)
**2砖织、常用的學(xué)習(xí)網(wǎng)站:GitHub
如何去使用Github款侵?
1)點(diǎn)擊Explore
2)向下拉找到“See more trending repositories”
3)點(diǎn)擊選取感興趣的語言方向
4)可以對(duì)感興趣的項(xiàng)目進(jìn)行Star操作
5)點(diǎn)擊項(xiàng)目,可查看項(xiàng)目詳情