最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

selenium在執(zhí)行phantomjs的API并獲取執(zhí)行結(jié)果的方法

 更新時間:2018年12月17日 10:07:42   作者:Bendawang  
今天小編就為大家分享一篇selenium在執(zhí)行phantomjs的API并獲取執(zhí)行結(jié)果的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

前言

因為最近要寫一個抓取sitemap和相應的參數(shù)的小腳本,現(xiàn)有的爬蟲無論用什么語言寫的,幾乎都無法抓取參數(shù),所以我思考了一下,先做一個簡單的總結(jié)。

本來以為寫個這種sitemap的爬蟲很簡單,經(jīng)過思考之后才發(fā)現(xiàn)其中的可怕之處,最關(guān)鍵的是參數(shù)的提取,這個太麻煩了。。。這個時候才發(fā)現(xiàn)AWVS的無敵和強大之處。。。

如果我們要獲取網(wǎng)站的sitemap同時還要抓取對應鏈接的參數(shù),我大概總結(jié)了url的幾個來源:

1、頁面上直接現(xiàn)有的form表單以及現(xiàn)有的href等指向的鏈接及參數(shù),這個相對比較簡單,不過要考慮post和get的問題。

2、由js生成的DOM中的form表單和href指向的鏈接

3、由js發(fā)起的訪問請求,例如AJAX請求等

4、通過點擊然后調(diào)用js發(fā)送請求,或是點擊生成一個form或是生產(chǎn)一個DOM,然后再點擊再由js發(fā)送請求。例如如下代碼

 <div>
 <input id="searchTitle" name="searchTitle" value="" type="text">
 <div class="button" onclick="javascript:searchWeb();"></div>
 </div>

5、通過setTimeout函數(shù)延遲觸發(fā)的js的請求,例如setTimeout("request()", 2000);,這一類我暫時還沒有太好的辦法解決,不過有初步的辦法,后面會說到。

目前我大概想到這么五類,肯定還有沒考慮到的地方,并且目前實際的代碼還沒有寫出來,我先記錄一下我的想法,要是有哪位師傅有興趣請務必聯(lián)系我。。。。orz。。

要解決上述的5個問題,因為我的工程的前半部分使用python寫的,所以這里我需要用python來解決,那么最佳選擇必然是selenium和phantomjs,其實比起來我更想用原生的phantomjs來寫。

用phantomjs的話第一個和第二個問題不攻自破,直接正則匹配下來就行了,因為它會幫我們先把頁面的js執(zhí)行了。

第三個問題也相對比較好解決,我們通過原生phantomjs的APIonResourceRequested就能夠監(jiān)控所有從頁面發(fā)出去的請求。

然后再來看第四個問題,我目前的想法應該沒有辦法徹底解決,我們同樣可以用phantomjs向頁面的所有的dom發(fā)送一個click事件,但是這樣子的話時間是一個很大的問題,所以初步想法向所有具有onclick事件的標簽發(fā)送點擊事件

然后再來看第五個問題,這應該是最麻煩的一個,我初步的想法還是用onResourceRequested事件,然后設置一個超時時限,讓頁面執(zhí)行個幾秒鐘,但是最后我還是放棄了這個想法,我決定忽視這個問題,因為如果每個頁面都等上幾秒那時間耗費不堆上天了。

以上就是我目前初步的一些思考,還有很多不成熟之處。

selenium與phantomjs聯(lián)動的問題

之前一直知道有selenium這個東西,不夠因為沒有地方需要,也沒有可以去學習,不過對phantomjs可能會稍微熟悉一些。

先寫個簡單的程序

from selenium import webdriver
service_args=[]
service_args.append('--load-images=no') ##關(guān)閉圖片加載
service_args.append('--disk-cache=yes') ##開啟緩存
service_args.append('--ignore-ssl-errors=true') ##忽略https錯誤

d=webdriver.PhantomJS("phantomjs",service_args=service_args)
d.get("http://xxxxxxxxxxxxxxxxxxxxx")
print d.page_source
d.quit()

這樣就可以發(fā)送get請求了。

問題一:沒有post請求?

我覺得應該是我還了解的不夠。不過翻了API,確實沒有找到,希望大家能夠指出我的錯誤,但我真的好像沒有找到能夠發(fā)送post請求的地方,真是蠢爆了。。

這里我想到了兩種方法解決,先說一種,第二種留到后面說。

就是用requests庫遞交post請求,拿下來的cookie,調(diào)用add_cookie函數(shù)給它,然后讓它帶著cookie發(fā)送get請求就好了。

樣例如下

from selenium import webdriver
import requests
r=requests.session()

service_args=[]
service_args.append('--load-images=no') ##關(guān)閉圖片加載
service_args.append('--disk-cache=yes') ##開啟緩存
service_args.append('--ignore-ssl-errors=true') ##忽略https錯誤

d=webdriver.PhantomJS("phantomjs",service_args=service_args)

data={
 "username":"123",
 "password":"123",
 "login":"1"
 }

result=r.post("http://127.0.0.1:8000/web/login.php",data=data)
cookies=r.cookies.get_dict()
for i in cookies:
 d.add_cookie({
 'name': i,
 'value' :cookies[i],
 'path':'/',
 'domain':'127.0.0.1'
  })
d.get("http://127.0.0.1:8000/web/index.php")
print d.page_source
d.quit()

另外這個add_cookie函數(shù)還比較刁鉆,還要把path和domain都設置好,不然有時會報錯。

第二個方法的話,我們知道,如果用原生PhantomJS的話,我們可以很容易遞交post請求,比如如下:

var webPage = require('webpage');
var page = webPage.create();

var settings = {
 operation: "POST",
 header:{},
 data: "username=123&password=123&login=1"
};
page.open('http://127.0.0.1:8000/web/login.php', settings, function(status) {
 //console.log(page.content);
 for(var i=0;i<page.cookies.length;i++){
 console.log(page.cookies[i].name+":"+page.cookies[i].value)
 }
});

所以我們想辦法就是直接在 Selenium中讓PhantomJS 執(zhí)行它的 API就可以了,這里不貼了,看完下一小節(jié)就知道怎么寫了。

問題二:在 Selenium中獲取PhantomJS 的API的執(zhí)行結(jié)果?

還好Selenium帶了個get_log函數(shù),比如我監(jiān)控'http://127.0.0.1:8000/web/index.php‘頁面向外發(fā)送的所有請求,如果用原生的phantomjs,很好辦,如下:

var webPage = require('webpage');
var page = webPage.create();

page.onResourceRequested = function (request) {
 console.log('Request ' + request.url);
};
...........
...........

所以我們直接在Selenium中調(diào)用PhantomJS 的API就好了。如下

from selenium import webdriver
import requests
r=requests.session()

service_args=[]
service_args.append('--load-images=no') ##關(guān)閉圖片加載
service_args.append('--disk-cache=yes') ##開啟緩存
service_args.append('--ignore-ssl-errors=true') ##忽略https錯誤

d=webdriver.PhantomJS("phantomjs",service_args=service_args)

data={
 "username":"123",
 "password":"123",
 "login":"1"
 }

result=r.post("http://127.0.0.1:8000/web/login.php",data=data)
cookies=r.cookies.get_dict()
for i in cookies:
 d.add_cookie({
 'name': i,
 'value' :cookies[i],
 'path':'/',
 'domain':'127.0.0.1'
  })
script = "var page=this;page.onResourceRequested = function (request){console.log(request.url);};"
d.command_executor._commands['executePhantomScript'] = ('POST', '/session/$sessionId/phantom/execute')
d.execute('executePhantomScript', {'script': script, 'args': []})

d.get("http://127.0.0.1:8000/web/index.php")
print d.page_source
d.quit()

這里上述代碼確實能夠?qū)崟r執(zhí)行,但是就這樣寫的話沒有辦法獲取到結(jié)果。

這里需要用到一個get_log函數(shù),改進如下:

from selenium import webdriver
import requests
r=requests.session()

service_args=[]
service_args.append('--load-images=no') ##關(guān)閉圖片加載
service_args.append('--disk-cache=yes') ##開啟緩存
service_args.append('--ignore-ssl-errors=true') ##忽略https錯誤

d=webdriver.PhantomJS("phantomjs",service_args=service_args)

data={
 "username":"123",
 "password":"123",
 "login":"1"
 }

result=r.post("http://127.0.0.1:8000/web/login.php",data=data)
cookies=r.cookies.get_dict()
for i in cookies:
 d.add_cookie({
 'name': i,
 'value' :cookies[i],
 'path':'/',
 'domain':'127.0.0.1'
  })
script = "var page=this;page.onResourceRequested = function (request){page.browserLog.push(request.url);};"
d.command_executor._commands['executePhantomScript'] = ('POST', '/session/$sessionId/phantom/execute')
d.execute('executePhantomScript', {'script': script, 'args': []})

d.get("http://127.0.0.1:8000/web/index.php")
print d.page_source
print d.get_log('browser')
d.quit()

在js腳本中我們調(diào)用page.browserLog.push,然后在python腳本中我們get_log('browser')去獲取就可以實現(xiàn)相互溝通,當然肯定還有別的辦法,不過我沒有找到。。。。僵硬了。。。。

后記

再說這個抓取sitemap和請求參數(shù)的小腳本,想了想還是覺得非常麻煩,雖然幾個問題都有了相應的解決辦法,也不管好壞,加上今天稍微研究了一下python調(diào)用phantom的優(yōu)化,還是稍微有點信心了,但是感覺要整合到一起來還是會很麻煩,效率問題是一個,能否真正準確抓取完整又是另一個,慢慢來把,沒想到最初覺得不是問題的問題最后卻成了我最大的麻煩之一。。僵硬。。。最后還要說的是原聲的phantomjs真的比selenium去調(diào)用舒服得多。?!,F(xiàn)在想來要是最開始想把每個環(huán)節(jié)思考一下就好了,要是思考了大概就不會用python了,大概會用nodejs,對了,最近稍微研究了一下nodejs的一些滲透和攻擊方法,后續(xù)整理一下分享出來,希望師傅們能夠幫忙指點指點。

以上這篇selenium在執(zhí)行phantomjs的API并獲取執(zhí)行結(jié)果的方法就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • MacOS安裝python報錯"zsh:?command?not?found:python"的解決方法

    MacOS安裝python報錯"zsh:?command?not?found:python"的

    這篇文章主要給大家介紹了關(guān)于MacOS安裝python報錯"zsh:?command?not?found:python"的解決方法,文中將解決的辦法介紹的非常詳細,需要的朋友可以參考下
    2023-02-02
  • Python實現(xiàn)正整數(shù)分解質(zhì)因數(shù)操作示例

    Python實現(xiàn)正整數(shù)分解質(zhì)因數(shù)操作示例

    這篇文章主要介紹了Python實現(xiàn)正整數(shù)分解質(zhì)因數(shù)操作,結(jié)合實例形式分析了Python循環(huán)與遞歸兩種操作方法實現(xiàn)分解質(zhì)因數(shù)功能的相關(guān)操作技巧,需要的朋友可以參考下
    2018-08-08
  • opencv-python的RGB與BGR互轉(zhuǎn)方式

    opencv-python的RGB與BGR互轉(zhuǎn)方式

    這篇文章主要介紹了opencv-python的RGB與BGR互轉(zhuǎn)方式,具有很好的參考價值,希望對大家有所 幫助。一起跟隨小編過來看看吧
    2020-06-06
  • Python實現(xiàn)快速提取Word表格并轉(zhuǎn)Markdown

    Python實現(xiàn)快速提取Word表格并轉(zhuǎn)Markdown

    這篇文章主要為大家詳細介紹了一套Python零基礎(chǔ)可操作的代碼方案,幫助測試工程師3分鐘內(nèi)完成表格提取與轉(zhuǎn)換,直接對接自動化測試或大模型,需要的小伙伴可以參考下
    2025-04-04
  • 詳解Python Matplot中文顯示完美解決方案

    詳解Python Matplot中文顯示完美解決方案

    這篇文章主要介紹了Python Matplot中文顯示完美解決方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-03-03
  • 為什么是 Python -m

    為什么是 Python -m

    這篇文章給大家介紹了Python -m的含義及python -m 和 python 的區(qū)別解析,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2020-06-06
  • pycharm 代碼自動補全的實現(xiàn)方法(圖文)

    pycharm 代碼自動補全的實現(xiàn)方法(圖文)

    這篇文章主要介紹了pycharm 代碼自動補全的實現(xiàn)方法(圖文),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-09-09
  • Python中filter與lambda的結(jié)合使用詳解

    Python中filter與lambda的結(jié)合使用詳解

    今天小編就為大家分享一篇Python中filter與lambda的結(jié)合使用詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • Django ORM 查詢管理器源碼解析

    Django ORM 查詢管理器源碼解析

    這篇文章主要介紹了Django ORM 查詢管理器源碼解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-08-08
  • python Graham求凸包問題并畫圖操作

    python Graham求凸包問題并畫圖操作

    這篇文章主要介紹了python Graham求凸包問題并畫圖操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06

最新評論

交城县| 喀喇沁旗| 樟树市| 石楼县| 黄山市| 垦利县| 日照市| 靖远县| 淮安市| 汽车| 同心县| 文安县| 西宁市| 沛县| 渝北区| 梁平县| 广西| 肥乡县| 南通市| 嘉鱼县| 周宁县| 禄劝| 德庆县| 彭阳县| 九龙城区| 伊通| 洛阳市| 泊头市| 江阴市| 格尔木市| 田东县| 鹤壁市| 惠东县| 特克斯县| 高州市| 昌乐县| 鲁山县| 阿勒泰市| 梧州市| 定西市| 洪泽县|