使用selenium抓取淘寶的商品信息實例
淘寶的頁面大量使用了js加載數(shù)據(jù),所以采用selenium來進行爬取更為簡單,selenum作為一個測試工具,主要配合無窗口瀏覽器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是一個WebDriverWait對象,它設(shè)置了等待時間,如果頁面在等待時間內(nèi)
沒有在 DOM中找到元素,將繼續(xù)等待,超出設(shè)定時間后則拋出找不到元素的異常,也可以說程序每隔xx秒看一眼,如果條件
成立了,則執(zhí)行下一步,否則繼續(xù)等待,直到超過設(shè)置的最長時間,然后拋出TimeoutException
1.presence_of_element_located 元素加載出,傳入定位元組,如(By.ID, 'p')
2.element_to_be_clickable 元素可點擊
3.text_to_be_present_in_element 某個元素文本包含某文字
'''
# 定義一個無界面的瀏覽器
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ù)的作用為完成首頁點擊搜索的功能,替換標(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'))
)
#搜索的那個按鈕
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í)行點擊搜索的操作
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:
#這個是我們跳轉(zhuǎn)頁的輸入框
input = wait.until(EC.presence_of_element_located(
(By.CSS_SELECTOR, '#mainsrp-pager > div > div > div > div.form > input')))
#跳轉(zhuǎn)時的確定按鈕
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)
#選擇并點擊
submit.click()
#判斷當(dāng)前頁是不是我們要現(xiàn)實的頁
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ù)
except TimeoutException:
next_page(page_number)
def get_products():
'''
搜到頁面信息在此函數(shù)在爬取我們需要的信息
:return:
'''
#每一個商品標(biāo)簽,這里是加載出來以后才會拿網(wǎng)頁源代碼
wait.until(EC.presence_of_element_located(
(By.CSS_SELECTOR, '#mainsrp-itemlist .items .item')))
#這里拿到的是整個網(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('出錯啦')
finally:
#關(guān)閉瀏覽器
browser.close()
if __name__ == '__main__':
main()
以上這篇使用selenium抓取淘寶的商品信息實例就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
- 淺談python爬蟲使用Selenium模擬瀏覽器行為
- Python爬蟲使用Selenium+PhantomJS抓取Ajax和動態(tài)HTML內(nèi)容
- selenium+python設(shè)置爬蟲代理IP的方法
- python爬蟲系列Selenium定向爬取虎撲籃球圖片詳解
- python利用selenium進行瀏覽器爬蟲
- python3通過selenium爬蟲獲取到dj商品的實例代碼
- C#使用Selenium+PhantomJS抓取數(shù)據(jù)
- 學(xué)習(xí)Python selenium自動化網(wǎng)頁抓取器
- Python selenium抓取微博內(nèi)容的示例代碼
- 利用selenium爬蟲抓取數(shù)據(jù)的基礎(chǔ)教程
相關(guān)文章
解決layui中onchange失效以及form動態(tài)渲染失效的問題
今天小編就為大家分享一篇解決layui中onchange失效以及form動態(tài)渲染失效的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-09-09
JavaScript去掉數(shù)組重復(fù)項的方法分析【測試可用】
這篇文章主要介紹了JavaScript去掉數(shù)組重復(fù)項的方法,結(jié)合實例形式分析了javascript使用object特性實現(xiàn)數(shù)組去除重復(fù)項功能的相關(guān)操作技巧,需要的朋友可以參考下2018-07-07
ES6基礎(chǔ)之?dāng)?shù)組和對象的拓展實例詳解
這篇文章主要介紹了ES6基礎(chǔ)之?dāng)?shù)組和對象的拓展,結(jié)合實例形式詳細(xì)分析了ES6數(shù)組和對象拓展運算符、拓展方法的使用及相關(guān)操作技巧,需要的朋友可以參考下2019-08-08
js實現(xiàn)不提示直接關(guān)閉網(wǎng)頁窗口
本文主要介紹了js實現(xiàn)不提示直接關(guān)閉網(wǎng)頁窗口的方法。具有很好的參考價值,下面跟著小編一起來看下吧2017-03-03
ES6中Proxy與Reflect實現(xiàn)重載(overload)的方法
這篇文章主要介紹了ES6中Proxy與Reflect實現(xiàn)重載(overload)的方法,分析了重載的原理及使用Proxy和Reflect來實現(xiàn)重載的操作步驟與相關(guān)技巧,需要的朋友可以參考下2017-03-03
javascript中的document.open()方法使用介紹
document.open()方法打開一個新的文檔并用document.write()方法編寫文檔的內(nèi)容,下面有個不錯的示例,大家可以感受下2013-10-10

