天天看點

爬蟲入門之jsonPath PhantomJS與 selenium詳解(六)

1 jsonPath資料格式

pip安裝: pip install jsonpath

用來解析json格式的字元串,類似于xpath

(1) json對象的轉換
json.loads()
json.dumps()
json.load()
json.dump()

#直接讀取json對象
json_obj = json.load(open('books.json','r',encoding='utf-8'))
print(json_obj) 

#先讀取json字元串,再轉json對象
with open('books.json','r',encoding='utf-8') as fp:
    json_str = fp.read()
json_obj = json.loads(json_str,encoding='utf-8')
print(json_obj)           
(2) XPath與jsonPath格式對比
XPath JSONPath Description
/ $ 表示根元素
. @ 目前元素
. or [] 子元素
.. n/a 父元素
// 遞歸下降,JSONPath是從E4X借鑒的。
* 通配符,表示所有的元素
屬性通路字元
[] 子元素操作符
| [,] 連接配接操作符在XPath 結果合并其它結點集合。JSONP允許name或者數組索引。
[start:end:step] 數組分割操作從ES4借鑒。
?() 應用過濾表示式
() 腳本表達式,使用在腳本引擎下面。
Xpath分組
結果

/store/book/author

$.store.book[*].author

書點所有書的作者

//author

$..author

所有的作者

/store/*

$.store.*

store的所有元素。所有的bookst和bicycle

/store//price

$.store..price

store裡面所有東西的price

//book[3]

$..book[2]

第三個書

//book[last()]

$..book[(@.length-1)]

最後一本書

//book[position()<3]

$..book[0,1]``$..book[:2]

前面的兩本書。

//book[isbn]

$..book[?(@.isbn)]

過濾出所有的包含isbn的書。

//book[price<10]

$..book[?(@.price<10)]

過濾出價格低于10的書。

//*

$..*

所有元素。

2 selenium詳解

支援通過各種driver(FirfoxDriver,IternetExplorerDriver,OperaDriver,ChromeDriver)驅動真實浏覽器完成測試 ,selenium也是支援無界面浏覽器操作的。比如說HtmlUnit和PhantomJs。

1.導入
    from selenium import webdriver
2.建立谷歌浏覽器操作對象
    path = 谷歌浏覽器驅動檔案路徑
    browser = webdriver.Chrome(path)
3.通路網址
    url = 要通路的網址
    browser.get(url)
    clear()  #清空
4.退出浏覽器
    browser.quit()           

元素定位

自動化要做的就是模拟滑鼠和鍵盤來操作來操作這些元素,點選、輸入等等,包含動态加載後的結果。操作這些元素前首先要找到它們,WebDriver提供很多定位元素的方法

#通過browser對象擷取源碼

find_element_by_id  #通過id
find_elements_by_name    #通過name
find_elements_by_xpath   #xpath路徑
find_elements_by_tag_name  #标簽名
find_elements_by_class_name   #類名
find_elements_by_css_selector  #css樣式 
find_elements_by_link_text  #通過連接配接文本

my_input = browser.find_elements_by_css_selector('#kw')[0]  #通過選擇器
browser.find_element_by_link_text("新聞")  #通過連結文本

driver = webdriver.Chrome()
driver.get('http://www.baidu.com')
driver.page_source  # page_source 擷取源碼
driver.close()  # 關閉
driver.quit()  # 退出

driver.find_element_by_name('kw1')  #通過name屬性查找
driver.find_element(by='name',value='kw1')  #通過名字
driver.find_element_by_xpath('//input[@name="kw1"]')  #通過xpath查找

kw1 = driver.find_element_by_css_selector('#wd1')  #selector查找
kw1.send_keys('海賊王')  #發送keys值
form_textfield = driver.find_element_by_name('username')
form_textfield.send_keys("admin")           

通路元素資訊

擷取元素屬性    .get_attribute('class')
擷取元素文本    .text
擷取id         .id
擷取标簽名      .tag_name           

互動

# 點選click()
# 輸入send_keys()
# 模拟JS滾動
    document.body.scrollTop=10000
    execute_script() 執行js代碼

#示例
擷取目前頁面滾動條縱坐标的位置:
document.body.scrollTop

擷取目前頁面滾動條橫坐标的位置:
document.body.scrollLeft

執行js代碼
driver.execute_script(js_statement)   

#示例
driver.execute_script("window.scrollTo(0, document.body.scrollHeight)")
# 下拉滾動條,使浏覽器加載出動态加載的内容
while True:
    # 可能像這樣要拉很多次,中間要适當的延時
    # 如果說說内容都很長,就增大下拉的長度
    for i in range(10):
        driver.execute_script("window.scrollBy(0,1000)")  #每次下拉1000
        time.sleep(3)
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight)")  #内容的總高度
    break           

selenium登入知乎設定代理

#設定代理
from selenium import webdriver

chromeOptions = webdriver.ChromeOptions()
# 設定代理
chromeOptions.add_argument("--proxy-server=http://10.3.132.6:808")
# 一定要注意,=兩邊不能有空格,不能是這樣--proxy-server = http://202.20.16.82:10152
browser = webdriver.Chrome(chrome_options=chromeOptions)

# 檢視本機ip,檢視代理是否起作用
browser.get("https://blog.csdn.net/zwq912318834/article/details/78626739")
print(browser.page_source)

# 退出,清除浏覽器緩存
# browser.quit()

#模拟登入知乎
import time
from selenium import webdriver

driver = webdriver.Chrome()
driver.get('https://www.zhihu.com/')

# 點選登陸按鈕
driver.find_element_by_xpath('//*[@id="root"]/div/main/div/div[2]/div/div/div/div[1]/div/div[1]/div[2]/button[1]').click()
time.sleep(2)

username = driver.find_element_by_name('username')
username.send_keys('18588403840')
time.sleep(1)
password = driver.find_element_by_name('password')
password.send_keys('Changeme_123')
time.sleep(5)
# driver.find_element_by_link_text('登入').click()
driver.find_element_by_xpath('/html/body/div[4]/div/span/div/div[2]/div/div/div/div[2]/div[1]/form/button').click()

driver.get('https://www.zhihu.com/people/zuo-zai-fen-tou-diao-xi-gui-82/activities')
print(driver.page_source)           

selenium模拟登陸知乎

from selenium import webdriver
import time

# http://demo.smeoa.com/
def openURL():
  driver = webdriver.Chrome()
  driver.get("https://user.qzone.qq.com")
  time.sleep(6)
  login = driver.find_element_by_id('login_frame')
  driver.switch_to_frame(login)
  time.sleep(3)
  driver.find_element_by_id('switcher_plogin').click()

  username = driver.find_element_by_id('u')
  password = driver.find_element_by_id('p')
  username.send_keys('*****')
  password.send_keys('*****')
  time.sleep(3)
  driver.find_element_by_id('login_button').click()
  print("OK")

if __name__ == '__main__':
    openURL()           

3 PhantomJS 無界面浏覽器

Headless Chrome是Chrome 浏覽器的無界面形态,可以在不打開浏覽器的前提下,使用所有 Chrome 支援的特性運作程式。相比于現代浏覽器,Headless Chrome 更加友善測試web應用,獲得網站的截圖,做爬蟲抓取資訊等,也更加貼近浏覽器環境。

Headless Chrome基于PhantomJS(QtWebKit核心)由谷歌Chrome團隊開發。團隊表示将專注研發這個項目

確定你的 chrome 浏覽器版本是 60+

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

chrome_options = Options()
chrome_options.add_argument("--headless")
chrome_options.add_argument('--disable-gpu')
driver = webdriver.Chrome(chrome_options=chrome_options)           

今日頭條資料滾動自動加載

from selenium import webdriver
import time

path = 'phantomjs.exe'
driver = webdriver.PhantomJS(path)
url = 'https://www.toutiao.com/'
driver.get(url)
time.sleep(2)
driver.save_scre-enshot('1.png')

js = 'document.body.scrollTop=10000'
driver.execute_script(js)
time.sleep(2)
driver.save_screenshot('2.png')

driver.quit()           

繼續閱讀