selenium爬取網(wǎng)頁(yè)(selenium爬取網(wǎng)頁(yè)數(shù)據(jù))
本篇文章給大家談?wù)剆elenium爬取網(wǎng)頁(yè),以及selenium爬取網(wǎng)頁(yè)數(shù)據(jù)對(duì)應(yīng)的知識(shí)點(diǎn),希望對(duì)各位有所幫助,不要忘了收藏本站喔。
本文目錄一覽:
- 1、python下 selenium與chrome結(jié)合進(jìn)行網(wǎng)頁(yè)爬取,怎么設(shè)置代理IP
- 2、從零開(kāi)始學(xué)Python-使用Selenium抓取動(dòng)態(tài)網(wǎng)頁(yè)數(shù)據(jù)
- 3、selenium通過(guò)人機(jī)驗(yàn)證爬蟲(chóng)
- 4、二.動(dòng)態(tài)網(wǎng)頁(yè)抓取
- 5、python網(wǎng)絡(luò)爬蟲(chóng):Selenium
- 6、從零開(kāi)始學(xué)python爬蟲(chóng)(八):selenium提取數(shù)據(jù)和其他使用方法
python下 selenium與chrome結(jié)合進(jìn)行網(wǎng)頁(yè)爬取,怎么設(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連接測(cè)試,用來(lái)檢測(cè)proxy ip,port 是否可以正常連接
'''
print '正在測(cè)試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
從零開(kāi)始學(xué)Python-使用Selenium抓取動(dòng)態(tài)網(wǎng)頁(yè)數(shù)據(jù)
AJAX(Asynchronouse JavaScript And XML:異步JavaScript和XML)通過(guò)在后臺(tái)與服務(wù)器進(jìn)行少量數(shù)據(jù)交換,Ajax 可以使網(wǎng)頁(yè)實(shí)現(xiàn)異步更新,這意味著可以在不重新加載整個(gè)網(wǎng)頁(yè)的情況下,對(duì)網(wǎng)頁(yè)的某部分進(jìn)行局部更新。傳統(tǒng)的網(wǎng)頁(yè)(不使用Ajax)如果需要更新內(nèi)容,必須重載整個(gè)網(wǎng)頁(yè)頁(yè)面。
因?yàn)閭鹘y(tǒng)的網(wǎng)頁(yè)在傳輸數(shù)據(jù)格式方面,使用的是 XML 語(yǔ)法,因此叫做 AJAX ,其實(shí)現(xiàn)在數(shù)據(jù)交互基本上都是使用 JSON 。使用AJAX加載的數(shù)據(jù),即使使用了JS將數(shù)據(jù)渲染到了瀏覽器中,在 右鍵-查看網(wǎng)頁(yè)源代碼 還是不能看到通過(guò)ajax加載的數(shù)據(jù),只能看到使用這個(gè)url加載的html代碼。
法1:直接分析ajax調(diào)用的接口。然后通過(guò)代碼請(qǐng)求這個(gè)接口。
法2:使用Selenium+chromedriver模擬瀏覽器行為獲取數(shù)據(jù)。
Selenium 相當(dāng)于是一個(gè)機(jī)器人??梢阅M人類在瀏覽器上的一些行為,自動(dòng)處理瀏覽器上的一些行為,比如點(diǎn)擊,填充數(shù)據(jù),刪除cookie等。 chromedriver 是一個(gè)驅(qū)動(dòng) Chrome 瀏覽器的驅(qū)動(dòng)程序,使用他才可以驅(qū)動(dòng)瀏覽器。當(dāng)然針對(duì)不同的瀏覽器有不同的driver。以下列出了不同瀏覽器及其對(duì)應(yīng)的driver:
現(xiàn)在以一個(gè)簡(jiǎn)單的獲取百度首頁(yè)的例子來(lái)講下 Selenium 和 chromedriver 如何快速入門:
參考:Selenium的使用
直接直接分析ajax調(diào)用的接口爬取
selenium結(jié)合lxml爬取
selenium通過(guò)人機(jī)驗(yàn)證爬蟲(chóng)
之前在學(xué)校曾經(jīng)用過(guò)request+xpath的方法做過(guò)一些爬蟲(chóng)腳本來(lái)玩,從ios正式轉(zhuǎn)前端之后,出于興趣,我對(duì)爬蟲(chóng)和反爬蟲(chóng)又做了一些了解,然后發(fā)現(xiàn)了selenium這個(gè)神器。selenium原本是一款測(cè)試工具,但由于他可以較好的模擬瀏覽器的各種操作,完全無(wú)視對(duì)于user-agent的限制,所以現(xiàn)在被更多的用于爬蟲(chóng)腳本中。這里記錄一下借助selenium庫(kù)進(jìn)行爬蟲(chóng)時(shí)碰到的一些問(wèn)題以及解決方法。(拒絕惡意爬蟲(chóng)從我做起)
selenium的安裝不多說(shuō), pip install selenium就行。不過(guò)要注意自己的python版本,要是3.x才行。用它打開(kāi)瀏覽器,然后通過(guò)dom操作獲取需要的dom節(jié)點(diǎn)。
如果需要登錄的,也可以事先將賬號(hào)密碼寫(xiě)好,然后用send_keys方法進(jìn)行自動(dòng)輸入。
然后需要什么就直接通過(guò)dom方法來(lái)獲取。不過(guò)現(xiàn)在很多網(wǎng)站的url有防爬處理,使用了不規(guī)律的url,無(wú)法像豆瓣排行榜那樣直接遍歷。但這個(gè)不難,用selenium就是要模擬人的操作的,真人操作的時(shí)候也不會(huì)直接輸url來(lái)一頁(yè)一頁(yè)看,比如在線閱讀的網(wǎng)站,一般都會(huì)有個(gè)目錄頁(yè)。先爬取目錄頁(yè)面的信息,先將正文url列表保存下來(lái),然后再遍歷列表就行。
這里有個(gè)sleep,目的是是確保目錄頁(yè)能完全加載完。當(dāng)然這個(gè)方法有點(diǎn)蠢,后面我使用了不同的方法來(lái)做頁(yè)面加載完成的判斷。
頁(yè)面加載完成需要時(shí)間,一定要等頁(yè)面加載好了才能獲取頁(yè)面元素。而直接設(shè)置一個(gè)固定的sleep顯然是效率極低且容易出錯(cuò)的。這里有幾種不同的方法來(lái)自動(dòng)判斷頁(yè)面加載的情況。
監(jiān)視我最終需要的元素有沒(méi)有加載完成,加載完成了就開(kāi)始后續(xù)操作。比如我要的dom節(jié)點(diǎn)有一個(gè)類名為'page-content',并且在整個(gè)頁(yè)面中一共有兩處,而我需要的是第二處。那就可以監(jiān)視這個(gè)節(jié)點(diǎn)的加載情況。
這里設(shè)置了0.5秒的刷新周期,當(dāng)然可以設(shè)置的更短,然后設(shè)置了10秒的timeout,超時(shí)自動(dòng)打開(kāi)下一章。
這就很簡(jiǎn)單了,就一句話,最多等10秒,進(jìn)行下一步。要是提前加載完就提前進(jìn)行。這個(gè)方便是方便,但是不好用,他會(huì)等頁(yè)面完全加載完才進(jìn)行下一步,而事實(shí)上我只需要等正文加載完就行,所以效率上要差一點(diǎn)。
顯性等待的好處就是可以在我需要的元素加載完的時(shí)候就進(jìn)入下一步,獲取元素內(nèi)容,但是也有不好的地方,那就是還不夠靈活。顯性等待在超時(shí)的時(shí)候會(huì)拋出TimeoutException異常,在暴露的接口中沒(méi)有給我定義異常處理的地方,這也是我選擇自己實(shí)現(xiàn)一遍等待機(jī)制的原因,這樣我可以對(duì)超時(shí)的異常進(jìn)行處理。
很多時(shí)候,我們會(huì)發(fā)現(xiàn),在登錄賬號(hào)時(shí),系統(tǒng)會(huì)要我們輸入驗(yàn)證碼。如果想要讓腳本自動(dòng)識(shí)別驗(yàn)證碼,可能就涉及到圖像識(shí)別技術(shù),還有一些第三方的服務(wù)可以使用,也是可行的。
但有的時(shí)候,網(wǎng)站會(huì)使用更為復(fù)雜的人機(jī)驗(yàn)證。比如這樣的:
二.動(dòng)態(tài)網(wǎng)頁(yè)抓取
因此,我們?nèi)绻褂?AJAX 加載的動(dòng)態(tài)網(wǎng)頁(yè),怎么爬取里面動(dòng)態(tài)加載的內(nèi)容呢?有兩種方法:
方法1操作步驟:
步驟:
selenium選擇元素的方法有很多:
有時(shí)候,我們需要查找多個(gè)元素。在上述例子中,我們就查找了所有的評(píng)論。因此,也有對(duì)應(yīng)的元素選擇方法,就是在上述的element后加上s,變成elements。
其中xpath和css_selector是比較好的方法,一方面比較清晰,另一方面相對(duì)其他方法定位元素比較準(zhǔn)確。
除此之外,我們還可以使用selenium操作元素方法實(shí)現(xiàn)自動(dòng)操作網(wǎng)頁(yè)。常見(jiàn)的操作元素方法如下:
– clear 清除元素的內(nèi)容
– send_keys 模擬按鍵輸入
– click 點(diǎn)擊元素
– submit 提交表單
由于篇幅有限,有興趣的讀者,可以到selenium的官方文檔查看:
python網(wǎng)絡(luò)爬蟲(chóng):Selenium
獲取頁(yè)面每個(gè)Cookies值,用法如下
driver.add_cookie(cookie_dict)
一個(gè)瀏覽器肯定會(huì)有很多窗口,所以我們肯定要有方法來(lái)實(shí)現(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()
從零開(kāi)始學(xué)python爬蟲(chóng)(八):selenium提取數(shù)據(jù)和其他使用方法
知識(shí)點(diǎn):
知識(shí)點(diǎn):了解 driver對(duì)象的常用屬性和方法
注意:最新版本的selenium已經(jīng)取消了這種格式,取而代之的是:
你要先導(dǎo)入:
然后再:
知識(shí)點(diǎn):掌握 driver對(duì)象定位標(biāo)簽元素獲取標(biāo)簽對(duì)象的方法
代碼實(shí)現(xiàn),如下,獲取騰訊新聞首頁(yè)的新聞標(biāo)簽的內(nèi)容。
知識(shí)點(diǎn):掌握 元素對(duì)象的操作方法
參考代碼示例:
知識(shí)點(diǎn):掌握 selenium控制標(biāo)簽頁(yè)的切換
知識(shí)點(diǎn):掌握 selenium控制frame標(biāo)簽的切換
知識(shí)點(diǎn):掌握 利用selenium獲取cookie的方法
知識(shí)點(diǎn):掌握 selenium控制瀏覽器執(zhí)行js代碼的方法
知識(shí)點(diǎn):掌握 手動(dòng)實(shí)現(xiàn)頁(yè)面等待
知識(shí)點(diǎn):掌握 selenium開(kāi)啟無(wú)界面模式
知識(shí)點(diǎn):了解 selenium使用代理ip
知識(shí)點(diǎn):了解 selenium替換user-agent
關(guān)于selenium爬取網(wǎng)頁(yè)和selenium爬取網(wǎng)頁(yè)數(shù)據(jù)的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
掃描二維碼推送至手機(jī)訪問(wèn)。
版權(quán)聲明:本文由飛速云SEO網(wǎng)絡(luò)優(yōu)化推廣發(fā)布,如需轉(zhuǎn)載請(qǐng)注明出處。