selenium爬取網(wǎng)頁(selenium爬取網(wǎng)頁數(shù)據(jù))
本篇文章給大家談?wù)剆elenium爬取網(wǎng)頁,以及selenium爬取網(wǎng)頁數(shù)據(jù)對應(yīng)的知識點,希望對各位有所幫助,不要忘了收藏本站喔。
本文目錄一覽:
- 1、python下 selenium與chrome結(jié)合進行網(wǎng)頁爬取,怎么設(shè)置代理IP
- 2、從零開始學(xué)Python-使用Selenium抓取動態(tài)網(wǎng)頁數(shù)據(jù)
- 3、selenium通過人機驗證爬蟲
- 4、二.動態(tài)網(wǎng)頁抓取
- 5、python網(wǎng)絡(luò)爬蟲:Selenium
- 6、從零開始學(xué)python爬蟲(八):selenium提取數(shù)據(jù)和其他使用方法
python下 selenium與chrome結(jié)合進行網(wǎng)頁爬取,怎么設(shè)置代理IP
#coding:utf-8
import sys,re,random,time,os
import socket
from socket import error as socket_error
import threading
import urllib2,cookielib
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.common.proxy import *
from selenium.webdriver.firefox.firefox_profile import FirefoxProfile
from selenium.webdriver.firefox.firefox_binary import FirefoxBinary
proxyFilePath = time.strftime("%Y%m%d")
def testSocket(ip, port):
'''
socket連接測試,用來檢測proxy ip,port 是否可以正常連接
'''
print '正在測試socket連接...'
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
sock.settimeout(10)
sock.connect((ip, int(port)))
#sock.send('meta')
sock.close()
print ip+':'+port+'--status:ok'
return 1
except socket_error as serr: # connection error
sock.close()
print ip+':'+port+'--status:error--Connection refused.'
return 0
def getDriver(httpProxy = '', type='Firefox'):
if type == 'Firefox':
proxy = Proxy({
'proxyType': ProxyType.MANUAL,
'httpProxy': httpProxy,
'ftpProxy': httpProxy,
'sslProxy': httpProxy,
'noProxy': '' # set this value as desired
})
firefox_profile = FirefoxProfile()
#firefox_profile.add_extension("firefox_extensions/adblock_plus-2.5.1-sm+tb+an+fx.xpi")
firefox_profile.add_extension("firefox_extensions/webdriver_element_locator-1.rev312-fx.xpi")
firefox_profile.set_preference("browser.download.folderList",2)
firefox_profile.set_preference("webdriver.load.strategy", "unstable")
#driver = webdriver.Firefox(firefox_profile = firefox_profile, proxy=proxy, firefox_binary=FirefoxBinary('/usr/bin/firefox'))
#driver = webdriver.Firefox(firefox_profile = firefox_profile, proxy=proxy, firefox_binary=FirefoxBinary("/cygdrive/c/Program\ Files\ (x86)/Mozilla\ Firefox/firefox.exe"))
driver = webdriver.Firefox(firefox_profile = firefox_profile, proxy=proxy)
elif type == 'PhantomJS': # PhantomJS
service_args = [
'--proxy='+httpProxy,
'--proxy-type=http',
]
webdriver.DesiredCapabilities.PHANTOMJS['phantomjs.page.customHeaders.Accept'] = 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8'
webdriver.DesiredCapabilities.PHANTOMJS['phantomjs.page.customHeaders.User-Agent'] = 'Mozilla/5.0 (X11; Windows x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.117 Safari/537.36'
driver = webdriver.PhantomJS(executable_path='windows/phantomjs.exe', service_args=service_args)
else: # Chrome
chrome_options = webdriver.ChromeOptions()
#chrome_options.add_extension('firefox_extensions/adblockplus_1_7_4.crx')
chrome_options.add_argument('--proxy-server=%s' % httpProxy)
driver = webdriver.Chrome(executable_path='windows/chromedriver.exe', chrome_options=chrome_options)
return driver
從零開始學(xué)Python-使用Selenium抓取動態(tài)網(wǎng)頁數(shù)據(jù)
AJAX(Asynchronouse JavaScript And XML:異步JavaScript和XML)通過在后臺與服務(wù)器進行少量數(shù)據(jù)交換,Ajax 可以使網(wǎng)頁實現(xiàn)異步更新,這意味著可以在不重新加載整個網(wǎng)頁的情況下,對網(wǎng)頁的某部分進行局部更新。傳統(tǒng)的網(wǎng)頁(不使用Ajax)如果需要更新內(nèi)容,必須重載整個網(wǎng)頁頁面。
因為傳統(tǒng)的網(wǎng)頁在傳輸數(shù)據(jù)格式方面,使用的是 XML 語法,因此叫做 AJAX ,其實現(xiàn)在數(shù)據(jù)交互基本上都是使用 JSON 。使用AJAX加載的數(shù)據(jù),即使使用了JS將數(shù)據(jù)渲染到了瀏覽器中,在 右鍵-查看網(wǎng)頁源代碼 還是不能看到通過ajax加載的數(shù)據(jù),只能看到使用這個url加載的html代碼。
法1:直接分析ajax調(diào)用的接口。然后通過代碼請求這個接口。
法2:使用Selenium+chromedriver模擬瀏覽器行為獲取數(shù)據(jù)。
Selenium 相當(dāng)于是一個機器人。可以模擬人類在瀏覽器上的一些行為,自動處理瀏覽器上的一些行為,比如點擊,填充數(shù)據(jù),刪除cookie等。 chromedriver 是一個驅(qū)動 Chrome 瀏覽器的驅(qū)動程序,使用他才可以驅(qū)動瀏覽器。當(dāng)然針對不同的瀏覽器有不同的driver。以下列出了不同瀏覽器及其對應(yīng)的driver:
現(xiàn)在以一個簡單的獲取百度首頁的例子來講下 Selenium 和 chromedriver 如何快速入門:
參考:Selenium的使用
直接直接分析ajax調(diào)用的接口爬取
selenium結(jié)合lxml爬取
selenium通過人機驗證爬蟲
之前在學(xué)校曾經(jīng)用過request+xpath的方法做過一些爬蟲腳本來玩,從ios正式轉(zhuǎn)前端之后,出于興趣,我對爬蟲和反爬蟲又做了一些了解,然后發(fā)現(xiàn)了selenium這個神器。selenium原本是一款測試工具,但由于他可以較好的模擬瀏覽器的各種操作,完全無視對于user-agent的限制,所以現(xiàn)在被更多的用于爬蟲腳本中。這里記錄一下借助selenium庫進行爬蟲時碰到的一些問題以及解決方法。(拒絕惡意爬蟲從我做起)
selenium的安裝不多說, pip install selenium就行。不過要注意自己的python版本,要是3.x才行。用它打開瀏覽器,然后通過dom操作獲取需要的dom節(jié)點。
如果需要登錄的,也可以事先將賬號密碼寫好,然后用send_keys方法進行自動輸入。
然后需要什么就直接通過dom方法來獲取。不過現(xiàn)在很多網(wǎng)站的url有防爬處理,使用了不規(guī)律的url,無法像豆瓣排行榜那樣直接遍歷。但這個不難,用selenium就是要模擬人的操作的,真人操作的時候也不會直接輸url來一頁一頁看,比如在線閱讀的網(wǎng)站,一般都會有個目錄頁。先爬取目錄頁面的信息,先將正文url列表保存下來,然后再遍歷列表就行。
這里有個sleep,目的是是確保目錄頁能完全加載完。當(dāng)然這個方法有點蠢,后面我使用了不同的方法來做頁面加載完成的判斷。
頁面加載完成需要時間,一定要等頁面加載好了才能獲取頁面元素。而直接設(shè)置一個固定的sleep顯然是效率極低且容易出錯的。這里有幾種不同的方法來自動判斷頁面加載的情況。
監(jiān)視我最終需要的元素有沒有加載完成,加載完成了就開始后續(xù)操作。比如我要的dom節(jié)點有一個類名為'page-content',并且在整個頁面中一共有兩處,而我需要的是第二處。那就可以監(jiān)視這個節(jié)點的加載情況。
這里設(shè)置了0.5秒的刷新周期,當(dāng)然可以設(shè)置的更短,然后設(shè)置了10秒的timeout,超時自動打開下一章。
這就很簡單了,就一句話,最多等10秒,進行下一步。要是提前加載完就提前進行。這個方便是方便,但是不好用,他會等頁面完全加載完才進行下一步,而事實上我只需要等正文加載完就行,所以效率上要差一點。
顯性等待的好處就是可以在我需要的元素加載完的時候就進入下一步,獲取元素內(nèi)容,但是也有不好的地方,那就是還不夠靈活。顯性等待在超時的時候會拋出TimeoutException異常,在暴露的接口中沒有給我定義異常處理的地方,這也是我選擇自己實現(xiàn)一遍等待機制的原因,這樣我可以對超時的異常進行處理。
很多時候,我們會發(fā)現(xiàn),在登錄賬號時,系統(tǒng)會要我們輸入驗證碼。如果想要讓腳本自動識別驗證碼,可能就涉及到圖像識別技術(shù),還有一些第三方的服務(wù)可以使用,也是可行的。
但有的時候,網(wǎng)站會使用更為復(fù)雜的人機驗證。比如這樣的:
二.動態(tài)網(wǎng)頁抓取
因此,我們?nèi)绻褂?AJAX 加載的動態(tài)網(wǎng)頁,怎么爬取里面動態(tài)加載的內(nèi)容呢?有兩種方法:
方法1操作步驟:
步驟:
selenium選擇元素的方法有很多:
有時候,我們需要查找多個元素。在上述例子中,我們就查找了所有的評論。因此,也有對應(yīng)的元素選擇方法,就是在上述的element后加上s,變成elements。
其中xpath和css_selector是比較好的方法,一方面比較清晰,另一方面相對其他方法定位元素比較準(zhǔn)確。
除此之外,我們還可以使用selenium操作元素方法實現(xiàn)自動操作網(wǎng)頁。常見的操作元素方法如下:
– clear 清除元素的內(nèi)容
– send_keys 模擬按鍵輸入
– click 點擊元素
– submit 提交表單
由于篇幅有限,有興趣的讀者,可以到selenium的官方文檔查看:
python網(wǎng)絡(luò)爬蟲:Selenium
獲取頁面每個Cookies值,用法如下
driver.add_cookie(cookie_dict)
一個瀏覽器肯定會有很多窗口,所以我們肯定要有方法來實現(xiàn)窗口的切換。切換窗口的方法如下:
imgs = driver.find_elements_by_xpath("http://img")
for img in imgs:
driver.execute_script('$(arguments[0]).fadeOut()',img)
driver.execute_script('window.scrollTo(0,document.body.scrollHeight)')
driver.execute_script('alert("This is a alert")')
driver.quit()
從零開始學(xué)python爬蟲(八):selenium提取數(shù)據(jù)和其他使用方法
知識點:
知識點:了解 driver對象的常用屬性和方法
注意:最新版本的selenium已經(jīng)取消了這種格式,取而代之的是:
你要先導(dǎo)入:
然后再:
知識點:掌握 driver對象定位標(biāo)簽元素獲取標(biāo)簽對象的方法
代碼實現(xiàn),如下,獲取騰訊新聞首頁的新聞標(biāo)簽的內(nèi)容。
知識點:掌握 元素對象的操作方法
參考代碼示例:
知識點:掌握 selenium控制標(biāo)簽頁的切換
知識點:掌握 selenium控制frame標(biāo)簽的切換
知識點:掌握 利用selenium獲取cookie的方法
知識點:掌握 selenium控制瀏覽器執(zhí)行js代碼的方法
知識點:掌握 手動實現(xiàn)頁面等待
知識點:掌握 selenium開啟無界面模式
知識點:了解 selenium使用代理ip
知識點:了解 selenium替換user-agent
關(guān)于selenium爬取網(wǎng)頁和selenium爬取網(wǎng)頁數(shù)據(jù)的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
掃描二維碼推送至手機訪問。
版權(quán)聲明:本文由飛速云SEO網(wǎng)絡(luò)優(yōu)化推廣發(fā)布,如需轉(zhuǎn)載請注明出處。