使用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: #訪問(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作為寫到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類型剛才找到的總頁(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爬蟲使用Selenium模擬瀏覽器行為
- Python爬蟲使用Selenium+PhantomJS抓取Ajax和動(dòng)態(tài)HTML內(nèi)容
- selenium+python設(shè)置爬蟲代理IP的方法
- python爬蟲系列Selenium定向爬取虎撲籃球圖片詳解
- python利用selenium進(jìn)行瀏覽器爬蟲
- python3通過(guò)selenium爬蟲獲取到dj商品的實(shí)例代碼
- C#使用Selenium+PhantomJS抓取數(shù)據(jù)
- 學(xué)習(xí)Python selenium自動(dòng)化網(wǎng)頁(yè)抓取器
- Python selenium抓取微博內(nèi)容的示例代碼
- 利用selenium爬蟲抓取數(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-09JavaScript去掉數(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-07javascript 常用驗(yàn)證函數(shù)總結(jié)
隨著做項(xiàng)目數(shù)量的越來(lái)越越多,其中用到j(luò)s的地方很多相同,這里自己整理了一些常用表單驗(yàn)證的js方法,雖然和其他js驗(yàn)證框架有一定的差距,但是畢竟是自己總結(jié)的一些東西,在此與紀(jì)錄分享一下。2016-06-06ES6基礎(chǔ)之?dāng)?shù)組和對(duì)象的拓展實(shí)例詳解
這篇文章主要介紹了ES6基礎(chǔ)之?dāng)?shù)組和對(duì)象的拓展,結(jié)合實(shí)例形式詳細(xì)分析了ES6數(shù)組和對(duì)象拓展運(yùn)算符、拓展方法的使用及相關(guān)操作技巧,需要的朋友可以參考下2019-08-08js實(shí)現(xiàn)不提示直接關(guān)閉網(wǎng)頁(yè)窗口
本文主要介紹了js實(shí)現(xiàn)不提示直接關(guān)閉網(wǎng)頁(yè)窗口的方法。具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧2017-03-03ES6中Proxy與Reflect實(shí)現(xiàn)重載(overload)的方法
這篇文章主要介紹了ES6中Proxy與Reflect實(shí)現(xiàn)重載(overload)的方法,分析了重載的原理及使用Proxy和Reflect來(lái)實(shí)現(xiàn)重載的操作步驟與相關(guān)技巧,需要的朋友可以參考下2017-03-03js自定義鼠標(biāo)右鍵的實(shí)現(xiàn)原理及源碼
這篇文章主要介紹了js自定義鼠標(biāo)右鍵的實(shí)現(xiàn)原理及源碼,需要的朋友可以參考下2014-06-06javascript中的document.open()方法使用介紹
document.open()方法打開一個(gè)新的文檔并用document.write()方法編寫文檔的內(nèi)容,下面有個(gè)不錯(cuò)的示例,大家可以感受下2013-10-10