使用selenium抓取淘寶的商品信息實(shí)例
淘寶的頁面大量使用了js加載數(shù)據(jù),所以采用selenium來進(jìn)行爬取更為簡(jiǎn)單,selenum作為一個(gè)測(cè)試工具,主要配合無窗口瀏覽器phantomjs來使用。
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()語句是selenum里面的顯示等待,wait是一個(gè)WebDriverWait對(duì)象,它設(shè)置了等待時(shí)間,如果頁面在等待時(shí)間內(nèi)
沒有在 DOM中找到元素,將繼續(xù)等待,超出設(shè)定時(shí)間后則拋出找不到元素的異常,也可以說程序每隔xx秒看一眼,如果條件
成立了,則執(zhí)行下一步,否則繼續(xù)等待,直到超過設(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è)無界面的瀏覽器
browser = webdriver.PhantomJS(
service_args=[
'--load-images=false',
'--disk-cache=true'])
# 10s無響應(yīng)就down掉
wait = WebDriverWait(browser, 10)
#雖然無界面但是必須要定義窗口
browser.set_window_size(1400, 900)
def search():
'''
此函數(shù)的作用為完成首頁點(diǎn)擊搜索的功能,替換標(biāo)簽可用于其他網(wǎng)頁使用
:return:
'''
print('正在搜索')
try:
#訪問頁面
browser.get('https://www.taobao.com')
# 選擇到淘寶首頁的輸入框
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作為寫到input的內(nèi)容
input.send_keys('面條')
#執(zhí)行點(diǎn)擊搜索的操作
submit.click()
#查看到當(dāng)前的頁碼一共是多少頁
total = wait.until(EC.presence_of_element_located(
(By.CSS_SELECTOR, '#mainsrp-pager > div > div > div > div.total')))
#獲取所有的商品
get_products()
#返回總頁數(shù)
return total.text
except TimeoutException:
return search()
def next_page(page_number):
'''
翻頁函數(shù),
:param page_number:
:return:
'''
print('正在翻頁', page_number)
try:
#這個(gè)是我們跳轉(zhuǎn)頁的輸入框
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)前頁是不是我們要現(xiàn)實(shí)的頁
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)入翻頁的函數(shù)
except TimeoutException:
next_page(page_number)
def get_products():
'''
搜到頁面信息在此函數(shù)在爬取我們需要的信息
:return:
'''
#每一個(gè)商品標(biāo)簽,這里是加載出來以后才會(huì)拿網(wǎng)頁源代碼
wait.until(EC.presence_of_element_located(
(By.CSS_SELECTOR, '#mainsrp-itemlist .items .item')))
#這里拿到的是整個(gè)網(wǎng)頁源代碼
html = browser.page_source
#pq解析網(wǎng)頁源代碼
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類型剛才找到的總頁數(shù)標(biāo)簽,作為跳出循環(huán)的條件
total = int(re.compile('(\d+)').search(total).group(1))
#只要后面還有就繼續(xù)爬,繼續(xù)翻頁
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爬蟲使用Selenium模擬瀏覽器行為
- Python爬蟲使用Selenium+PhantomJS抓取Ajax和動(dòng)態(tài)HTML內(nèi)容
- selenium+python設(shè)置爬蟲代理IP的方法
- python爬蟲系列Selenium定向爬取虎撲籃球圖片詳解
- python利用selenium進(jìn)行瀏覽器爬蟲
- python3通過selenium爬蟲獲取到dj商品的實(shí)例代碼
- C#使用Selenium+PhantomJS抓取數(shù)據(jù)
- 學(xué)習(xí)Python selenium自動(dòng)化網(wǎng)頁抓取器
- Python selenium抓取微博內(nèi)容的示例代碼
- 利用selenium爬蟲抓取數(shù)據(jù)的基礎(chǔ)教程
相關(guān)文章
JS實(shí)現(xiàn)仿FLASH效果的豎排導(dǎo)航代碼
這篇文章主要介紹了JS實(shí)現(xiàn)仿FLASH效果的豎排導(dǎo)航代碼,涉及JavaScript基于定時(shí)函數(shù)動(dòng)態(tài)設(shè)置頁面元素樣式的技巧,具有FLASH變換效果,需要的朋友可以參考下2015-09-09
利用Promise自定義一個(gè)GET請(qǐng)求的函數(shù)示例代碼
這篇文章主要給大家介紹了關(guān)于如何利用Promise自定義一個(gè)GET請(qǐng)求的函數(shù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Promise具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03
JavaScript保存并運(yùn)算頁面中數(shù)字類型變量的寫法
這篇文章主要介紹了JavaScript保存并運(yùn)算頁面中數(shù)字類型變量的寫法,當(dāng)你在頁面中需要不停運(yùn)算一個(gè)數(shù)字變量時(shí)非常有用,普通的寫法不能正常運(yùn)算,使用本文方法就可以,需要的朋友可以參考下2015-07-07
解析javascript 實(shí)用函數(shù)的使用詳解
本篇文章對(duì)javascript中的一些實(shí)用函數(shù)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
php結(jié)合js實(shí)現(xiàn)多條件組合查詢
這篇文章主要為大家詳細(xì)介紹了php結(jié)合js實(shí)現(xiàn)多條件組合查詢,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-05-05
直接拿來用的頁面跳轉(zhuǎn)進(jìn)度條JS實(shí)現(xiàn)
這篇文章主要為大家分享了一款直接拿來用的頁面跳轉(zhuǎn)進(jìn)度條,由javascript實(shí)現(xiàn),可以直接跳轉(zhuǎn)到相應(yīng)頁面,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-01-01
讓mayfish支持mysqli數(shù)據(jù)庫驅(qū)動(dòng)的實(shí)現(xiàn)方法
mysql 是非持繼連接函數(shù)而 mysqli 是永遠(yuǎn)連接函數(shù)。也就是說 mysql 每次鏈接都會(huì)打開一個(gè)連接的進(jìn)程而 mysqli 多次運(yùn)行 mysqli 將使用同一連接進(jìn)程,從而減少了服務(wù)器的開銷。2010-05-05
微信小程序?qū)崿F(xiàn)多宮格抽獎(jiǎng)活動(dòng)
這篇文章主要為大家詳細(xì)介紹了微信小程序?qū)崿F(xiàn)多宮格抽獎(jiǎng)功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-11-11

