使用selenium抓取淘寶的商品信息實(shí)例
淘寶的頁(yè)面大量使用了js加載數(shù)據(jù),所以采用selenium來(lái)進(jìn)行爬取更為簡(jiǎn)單,selenum作為一個(gè)測(cè)試工具,主要配合無(wú)窗口瀏覽器phantomjs來(lái)使用。
import re
from selenium import webdriver
from selenium.common.exceptions import TimeoutException
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
'''
wait.until()語(yǔ)句是selenum里面的顯示等待,wait是一個(gè)WebDriverWait對(duì)象,它設(shè)置了等待時(shí)間,如果頁(yè)面在等待時(shí)間內(nèi)
沒(méi)有在 DOM中找到元素,將繼續(xù)等待,超出設(shè)定時(shí)間后則拋出找不到元素的異常,也可以說(shuō)程序每隔xx秒看一眼,如果條件
成立了,則執(zhí)行下一步,否則繼續(xù)等待,直到超過(guò)設(shè)置的最長(zhǎng)時(shí)間,然后拋出TimeoutException
1.presence_of_element_located 元素加載出,傳入定位元組,如(By.ID, 'p')
2.element_to_be_clickable 元素可點(diǎn)擊
3.text_to_be_present_in_element 某個(gè)元素文本包含某文字
'''
# 定義一個(gè)無(wú)界面的瀏覽器
browser = webdriver.PhantomJS(
service_args=[
'--load-images=false',
'--disk-cache=true'])
# 10s無(wú)響應(yīng)就down掉
wait = WebDriverWait(browser, 10)
#雖然無(wú)界面但是必須要定義窗口
browser.set_window_size(1400, 900)
def search():
'''
此函數(shù)的作用為完成首頁(yè)點(diǎn)擊搜索的功能,替換標(biāo)簽可用于其他網(wǎng)頁(yè)使用
:return:
'''
print('正在搜索')
try:
#訪(fǎng)問(wèn)頁(yè)面
browser.get('https://www.taobao.com')
# 選擇到淘寶首頁(yè)的輸入框
input = wait.until(
EC.presence_of_element_located((By.CSS_SELECTOR, '#q'))
)
#搜索的那個(gè)按鈕
submit = wait.until(EC.element_to_be_clickable(
(By.CSS_SELECTOR, '#J_TSearchForm > div.search-button > button')))
#send_key作為寫(xiě)到input的內(nèi)容
input.send_keys('面條')
#執(zhí)行點(diǎn)擊搜索的操作
submit.click()
#查看到當(dāng)前的頁(yè)碼一共是多少頁(yè)
total = wait.until(EC.presence_of_element_located(
(By.CSS_SELECTOR, '#mainsrp-pager > div > div > div > div.total')))
#獲取所有的商品
get_products()
#返回總頁(yè)數(shù)
return total.text
except TimeoutException:
return search()
def next_page(page_number):
'''
翻頁(yè)函數(shù),
:param page_number:
:return:
'''
print('正在翻頁(yè)', page_number)
try:
#這個(gè)是我們跳轉(zhuǎn)頁(yè)的輸入框
input = wait.until(EC.presence_of_element_located(
(By.CSS_SELECTOR, '#mainsrp-pager > div > div > div > div.form > input')))
#跳轉(zhuǎn)時(shí)的確定按鈕
submit = wait.until(
EC.element_to_be_clickable(
(By.CSS_SELECTOR,
'#mainsrp-pager > div > div > div > div.form > span.J_Submit')))
#清除里面的數(shù)字
input.clear()
#重新輸入數(shù)字
input.send_keys(page_number)
#選擇并點(diǎn)擊
submit.click()
#判斷當(dāng)前頁(yè)是不是我們要現(xiàn)實(shí)的頁(yè)
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)))
#調(diào)用函數(shù)獲取商品信息
get_products()
#捕捉超時(shí),重新進(jìn)入翻頁(yè)的函數(shù)
except TimeoutException:
next_page(page_number)
def get_products():
'''
搜到頁(yè)面信息在此函數(shù)在爬取我們需要的信息
:return:
'''
#每一個(gè)商品標(biāo)簽,這里是加載出來(lái)以后才會(huì)拿網(wǎng)頁(yè)源代碼
wait.until(EC.presence_of_element_located(
(By.CSS_SELECTOR, '#mainsrp-itemlist .items .item')))
#這里拿到的是整個(gè)網(wǎng)頁(yè)源代碼
html = browser.page_source
#pq解析網(wǎng)頁(yè)源代碼
doc = pq(html)
items = doc('#mainsrp-itemlist .items .item').items()
for item in items:
# print(item)
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():
try:
#第一步搜索
total = search()
#int類(lèi)型剛才找到的總頁(yè)數(shù)標(biāo)簽,作為跳出循環(huán)的條件
total = int(re.compile('(\d+)').search(total).group(1))
#只要后面還有就繼續(xù)爬,繼續(xù)翻頁(yè)
for i in range(2, total + 1):
next_page(i)
except Exception:
print('出錯(cuò)啦')
finally:
#關(guān)閉瀏覽器
browser.close()
if __name__ == '__main__':
main()
以上這篇使用selenium抓取淘寶的商品信息實(shí)例就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- 淺談python爬蟲(chóng)使用Selenium模擬瀏覽器行為
- Python爬蟲(chóng)使用Selenium+PhantomJS抓取Ajax和動(dòng)態(tài)HTML內(nèi)容
- selenium+python設(shè)置爬蟲(chóng)代理IP的方法
- python爬蟲(chóng)系列Selenium定向爬取虎撲籃球圖片詳解
- python利用selenium進(jìn)行瀏覽器爬蟲(chóng)
- python3通過(guò)selenium爬蟲(chóng)獲取到dj商品的實(shí)例代碼
- C#使用Selenium+PhantomJS抓取數(shù)據(jù)
- 學(xué)習(xí)Python selenium自動(dòng)化網(wǎng)頁(yè)抓取器
- Python selenium抓取微博內(nèi)容的示例代碼
- 利用selenium爬蟲(chóng)抓取數(shù)據(jù)的基礎(chǔ)教程
相關(guān)文章
解決layui中onchange失效以及form動(dòng)態(tài)渲染失效的問(wèn)題
今天小編就為大家分享一篇解決layui中onchange失效以及form動(dòng)態(tài)渲染失效的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-09-09
JavaScript去掉數(shù)組重復(fù)項(xiàng)的方法分析【測(cè)試可用】
這篇文章主要介紹了JavaScript去掉數(shù)組重復(fù)項(xiàng)的方法,結(jié)合實(shí)例形式分析了javascript使用object特性實(shí)現(xiàn)數(shù)組去除重復(fù)項(xiàng)功能的相關(guān)操作技巧,需要的朋友可以參考下2018-07-07
微信小程序用戶(hù)位置權(quán)限的獲取方法(拒絕后提醒)
這篇文章主要介紹了微信小程序用戶(hù)位置權(quán)限的獲取方法(拒絕后提醒),文中給大家介紹了微信小程序獲取用戶(hù)當(dāng)前位置的三個(gè)方式,授權(quán)方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-11-11
javascript 常用驗(yàn)證函數(shù)總結(jié)
隨著做項(xiàng)目數(shù)量的越來(lái)越越多,其中用到j(luò)s的地方很多相同,這里自己整理了一些常用表單驗(yàn)證的js方法,雖然和其他js驗(yàn)證框架有一定的差距,但是畢竟是自己總結(jié)的一些東西,在此與紀(jì)錄分享一下。2016-06-06
ES6基礎(chǔ)之?dāng)?shù)組和對(duì)象的拓展實(shí)例詳解
這篇文章主要介紹了ES6基礎(chǔ)之?dāng)?shù)組和對(duì)象的拓展,結(jié)合實(shí)例形式詳細(xì)分析了ES6數(shù)組和對(duì)象拓展運(yùn)算符、拓展方法的使用及相關(guān)操作技巧,需要的朋友可以參考下2019-08-08
js實(shí)現(xiàn)不提示直接關(guān)閉網(wǎng)頁(yè)窗口
本文主要介紹了js實(shí)現(xiàn)不提示直接關(guān)閉網(wǎng)頁(yè)窗口的方法。具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧2017-03-03
ES6中Proxy與Reflect實(shí)現(xiàn)重載(overload)的方法
這篇文章主要介紹了ES6中Proxy與Reflect實(shí)現(xiàn)重載(overload)的方法,分析了重載的原理及使用Proxy和Reflect來(lái)實(shí)現(xiàn)重載的操作步驟與相關(guān)技巧,需要的朋友可以參考下2017-03-03
js自定義鼠標(biāo)右鍵的實(shí)現(xiàn)原理及源碼
這篇文章主要介紹了js自定義鼠標(biāo)右鍵的實(shí)現(xiàn)原理及源碼,需要的朋友可以參考下2014-06-06
javascript中的document.open()方法使用介紹
document.open()方法打開(kāi)一個(gè)新的文檔并用document.write()方法編寫(xiě)文檔的內(nèi)容,下面有個(gè)不錯(cuò)的示例,大家可以感受下2013-10-10

