摘要:使用Selenium爬取淘寶商品繞過登錄頁面)用Selenium來模擬瀏覽器操作,抓取淘寶商品信息,并將結果保存到MongoDB。1.準備工作本文以Chrome為例來講解Selenium的用法。在開始
使用Selenium爬取淘寶商品(繞過登錄頁面)用Selenium來模擬瀏覽器操作,電腦電腦抓取淘寶商品信息,版登寶網版登并將結果保存到MongoDB。錄入錄淘錄入1.準備工作本文以Chrome為例來講解Selenium的口手口用法。在開始之前
使用Selenium爬取淘寶商品(繞過登錄頁面)
用Selenium來模擬瀏覽器操作,機登抓取淘寶商品信息,電腦電腦并將結果保存到MongoDB。版登寶網版登
1.準備工作
本文以Chrome為例來講解Selenium的錄入錄淘錄入用法。在開始之前,口手口請確保已經正確安裝好了Chrome瀏覽器并配置好了ChromeDriver;另外,機登還需要正確安裝Python的電腦電腦Selenium庫。
2.接口分析
首先,版登寶網版登我們來打開淘寶的錄入錄淘錄入接口,觀察一下它的口手口ajax請求。
打開淘寶頁面,機登搜索商品,比如ipad,此時打開開發(fā)者工具,查看Ajax請求,我們可以發(fā)現(xiàn),根本沒有Ajax請求,如圖
不過沒有關系,我們可以直接用Selenium來模擬瀏覽器,只要在瀏覽器里能看到的,都可以爬取。這也是我們選擇使用Selenium的原因。
3.頁面分析
我們的目標是爬取商品信息。如圖是一個商品條目,其中包含商品的基本信息,包括商品圖片、名稱、價格、購買人數(shù)、店鋪名稱和店鋪所在地,我們要做的就是將這些信息都抓取下來。
抓取入口就是淘寶的搜索頁面,這個鏈接可以通過直接構造參數(shù)訪問。例如,如果搜ipad,就可以直接訪問https://s.taobao.com/search?q=ipad,呈現(xiàn)的就是第一頁的搜索結果,如圖所示
葡萄汁送服降壓藥效果好!用葡萄汁代替白開水送服降壓藥,能使血壓降得平穩(wěn),且不會出現(xiàn)血壓忽高忽低的現(xiàn)象。
在頁面下方,有一個分頁導航,其中既包括前5頁的鏈接,也包括下一個的鏈接,同時還有一個輸入任意頁碼跳轉的鏈接,如圖
這里商品搜索的結果一般最大都是100頁,要獲取每一頁的內容,只需要將頁碼從1到100順序遍歷即可,頁碼數(shù)是確定的。所以,直接在頁面跳轉文本框中輸入要跳轉的頁碼,然后點擊確定按鈕即可跳轉到頁碼對應的頁面。
這里不直接點擊下一頁的原因是:一旦爬取過程中出現(xiàn)異常退出,比如到50頁退出了,此時點擊下一頁時,就無法快速切換到對應的后續(xù)頁面了。此外,在爬取過程中,也需要記錄當前的頁碼數(shù),而且點擊下一頁之后頁面加載失敗,還需要做異常檢測,檢測當前頁面是加載到了第幾頁。整個流程比較復雜,所以我們這里直接用跳轉的方式來爬取頁面。
當我們成功的加載出某一頁商品列表時,利用Selenium即可獲取頁面源代碼,然后再用相應的解析庫解析即可。這里我們選用pyquery解析。下面我們用代碼實現(xiàn)整個抓取過程。
4.獲取商品列表
首先,需要構造一個抓取的URL:https://s.taobao.com/search?q=ipad。這個URL非常簡潔,參數(shù)q就是要搜索的關鍵字。只要改變這個參數(shù),即可獲取不同的商品列表。這里我們將商品的關鍵字定義成一個變量,然后構造出這樣的一個URL。
然后就需要用Selenium進行抓取了。我們實現(xiàn)了如下抓取列表頁的方法:
fromseleniumimportwebdriverfromselenium.common.exceptionsimportTimeoutExceptionfromselenium.webdriver.common.byimportByfromselenium.webdriver.supportimportexpected_conditionsasECfromselenium.webdriver.support.waitimportWebDriverWaitfromurllib.parseimportquoteimporttimebrowser = webdriver.Chrome()wait = WebDriverWait(browser,10)KEYWORD =ipaddefindex_page(page):""" 抓取索引頁 :param page: 頁碼 """print(正在爬取第,page,頁)try: url =https://s.taobao.com/search?q=+quote(KEYWORD) browser.get(url)ifpage>1: input = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,mainsrp-pager div.form > input))) submit = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,mainsrp-pager div.form > span.btn.J_Submit))) input.clear() input.send_keys(page) submit.click() wait.until(EC.text_to_be_present_in_element((By.CSS_SELECTOR,mainsrp-pager li.item.active > span),str(page))) wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,.m-itemlist .items .item))) get_products()exceptTimeoutException: index_page(page)
這里首先構造了一個WebDriver對象,使用的瀏覽器是Chrome,然后指定一個關鍵詞,如ipad,接著定義了index_age()方法,用于抓取商品列表頁。
在該方法里,我們首先訪問了搜索商品的鏈接,然后判斷了當前的頁碼,如果大于1,就進行跳頁操作,否則等待頁面加載完成。
等待加載時,我們使用了WebDriverWait對象,它可以指定等待條件,同時指定一個最長等待時間,這里指定為10s。如果在這個時間內成功匹配了等待條件,也就是說頁面元素成功加載出來了,就立即返回相應結果并繼續(xù)向下執(zhí)行,否則到了最大等待時間還沒有加載出來時,就直接拋出超時異常。
比如,我們最終要等待商品信息加載出來,就指定了presnece_of_element_located這個條件,然后傳入了.m-itemlist .items .item這個選擇器,而這個選擇器對應的頁面內容就是每個商品的信息塊,可以在網頁中查看。如果加載成功,就會執(zhí)行后續(xù)的get_products()方法,提取商品信息。
關于翻頁操作,這里首先獲取頁碼輸入框,賦值為input,然后獲取確定按鈕,賦值為submit,分別是圖中的兩個元素。
首先,我們清空了輸入框,此時調用clear()方法即可。隨后,調用send_keys()方法將頁碼填充到輸入框中,然后點擊確定按鈕即可
那么,怎么樣知道有沒有跳轉到對應的頁碼呢?我們可以注意到,成功跳轉到某一頁后,頁碼都會高亮顯示,如圖
我們只需要判斷當前高亮的頁碼數(shù)是當前的頁碼數(shù)即可,所以這里使用了另一個等待條件text_to_be_present_in_element,它會等待指定的文本出現(xiàn)在某一個節(jié)點里面時即返回成功。這里我們將高亮的頁碼節(jié)點對應的CSS選擇器和當前要跳轉的頁碼通過參數(shù)傳遞給這個等待條件,這樣它就會檢測當前高亮的頁碼節(jié)點是不是我們傳過來的頁碼數(shù),如果是,就證明頁面成功跳轉到了這一頁,頁面跳轉成功。
這樣剛才實現(xiàn)的index_page()方法就可以傳入對應的頁碼,待加載出對應頁碼的商品列表后,再去調用get_products()方法進行頁面解析。
5.解析商品列表
接下來,我們就可以實現(xiàn)get_products()方法來解析商品列表了。這里我們直接獲取頁面源代碼,然后用pyquery進行解析,實現(xiàn)如下:
frompyqueryimportPyQueryaspqdefget_products():""" 提取商品數(shù)據(jù) """html = browser.page_source doc = pq(html) items = doc(mainsrp-itemlist .items .item).items()foriteminitems: product = {image:item.find(.pic .img).attr(data-src),price:item.find(.price).text(),deal:item.find(.deal-cnt).text(),title:item.find(.title).text(),shop:item.find(.shop).text(),location:item.find(.location).text()} print(product) save_to_mongo(product)
首先,調用page_source屬性獲取頁碼的源代碼,然后構造了PyQuery對象,提取了商品列表,此時使用的CSS選擇器是mainsrp-itemlist .items .item,它會匹配整個頁面的每個商品。它的匹配結果是多個,所以這里我們又對它進行了一次遍歷,用for循環(huán)將每個結果分別進行解析,每次循環(huán)把它賦值為item變量,每個item變量都是一個PyQuery對象,然后再調用它的find()方法,傳入CSS選擇器,就可以獲取單個商品的特定內容。
比如查看一下商品源碼
可以發(fā)現(xiàn),它是一個img節(jié)點,包含id、class、data-src、alt和src屬性,這里之所以可以看到這樣圖片,是因為它的src屬性被賦值為圖片的URL。把它的src屬性提取出來,就可以獲取商品的完整圖片了。不過我們還注意data-src屬性,它的圖片內容也是圖片的URL,觀察后發(fā)現(xiàn)此URL是圖片的完整大圖,而src是壓縮后的小圖,所以這里抓取data-src屬性來作為商品的圖片。
因此,我們需要先利用find()方法找到圖片的這個節(jié)點,然后再調用attr()方法獲取商品的data-src屬性,這樣就成功提取了商品的鏈接。然后用同樣的方法提取商品的價格、成交量、名稱、店鋪所在地等信息,接著將所有提取結果賦值為一個字典product,然后調用save_mongo()將其保存到MongoDB即可。
蒸東西時,蒸鍋水不要放得太多,一般以蒸好后鍋內剩半碗水為宜,這樣做,可最大程度節(jié)約煤氣。
6.保存到MongoDB
接下來,我們將商品信息保存到MongoDB,代碼如下:
importpymongoMONGO_URL =localhostMONGO_DB =taobaoMONGO_COLLECTION =productsclient = pymongo.MongoClient(MONGO_URL)db = client[MONGO_DB]defsave_to_mongo(result):""" 保存結果到MongoDB """try:ifdb[MONGO_COLLECTION].insert(result): print(存儲到MongoDB成功)exceptException: print(存儲到MongoDB失敗)
這里首先創(chuàng)建了一個MongoDB的連接對象,然后指定了數(shù)據(jù)庫,隨后指定了Collection的名稱,接著調用insert()方法將數(shù)據(jù)庫插入到MongoDB。此處的result的變量就是在get_products()方法里傳來的product,包含單個商品的信息。
7.遍歷每頁
剛才我們所定義的get_index()方法需要接收參數(shù)page,page代碼頁碼。這里我們實現(xiàn)頁碼遍歷即可,代碼如下:
MAX_PAGE =10defmain():""" 遍歷 :return: """foriinrange(1,MAX_PAGE+1): index_page(i) time.sleep(10)main()
最后調用main()方法即可運行。
8.異常處理(繞過登錄反爬機制)
當寫到這里,如果運行程序會發(fā)現(xiàn),程序在彈出瀏覽器窗口后,會出現(xiàn)登陸頁面,但是當你嘗試輸入賬戶密碼時,滑塊的驗證始終失效。并且頁面還會不斷刷新。如圖
針對這種情況,博主找到了兩種解決方案
方法一:修改ChromeDriver.exe
之所以出現(xiàn)這種情況,是因為在淘寶的登錄頁面,有這樣一個js,它會判斷你是通過驅動打開的瀏覽器還是其他情況,如果是驅動打開那么這個判斷為真就會出現(xiàn)這種情況,如圖,為判斷的js
我們在控制臺運行一下這個腳本window.navigator.webdriver
可以看到,判斷為真,說明瀏覽器知道我們使用的是驅動。
那該如何解決呢?
首先,使用nodepad++或者記事本打開chrome,查找$cdc,找到這串代碼后,將其用等長的字符串替代即可,例如把最后的l改成a。
然后把部分代碼改為如下模式,將瀏覽器設置為開發(fā)者模式:
option= webdriver.ChromeOptions()開發(fā)者模式的開關,設置一下,打開瀏覽器就不會識別為自動化測試工具了option.add_experimental_option(excludeSwitches, [enable-automation])driver = webdriver.Chrome(chrome_options=option)
如果這種方法不能奏效,請看第二種方法
方法二:將用戶信息的配置文件在代碼中加載
首先,在Chrome中輸入chrome://version/查看信息。如圖,這是我們用戶信息。
然后在代碼中,加載瀏覽器配置
chrome_option = webdriver.ChromeOptions()p=rC:\Users\趙磊\AppData\Local\Google\Chrome\User Datachrome_option.add_experimental_option(excludeSwitches, [enable-automation]) 以開發(fā)者模式chrome_option.add_argument(--user-data-dir=+p)browser = webdriver.Chrome(options=chrome_option)wait = WebDriverWait(browser,10)
這樣在爬取時就不會出現(xiàn)登錄頁面了。
9.運行
此時運行代碼,會發(fā)現(xiàn)彈出一個Chrome瀏覽器,然后會訪問淘寶頁面,接著控制臺輸出如下
可以發(fā)現(xiàn),這些商品信息的結果都是字典形式,它們倍存儲到MongoDB里面,再看一下MongoDB中的結果
說明信息保存到MongoDB中,爬取成功。
使用Selenium自動秒搶淘寶商品
selenium有多種編程語言的客戶端驅動,編寫自動化腳本語法簡潔,其中python的selenium庫便非常的受歡迎。
你可以使用selenium做web測試或者爬蟲,自動搶票、自動下單也可以用selenium來做。
演示自動打開淘寶網:
使用selenium搶購商品
- 導入selenium相關模塊
導入庫from seleniumimportwebdriverimportdatetimeimporttime
- 打開chrome瀏覽器
記錄時間now= datetime.datetime.now().strftime(%Y-%m-%d %H:%M:%S.%f)打開chromebrowser= webdriver.Chrome()
- 登錄淘寶
登錄deflogin():打開淘寶首頁,通過掃碼登錄browser.get("https://www.taobao.com/") time.sleep(3)打開登錄界面find_login = browser.find_element_by_link_text("親,請登錄")iffind_login: find_login.click() print("請掃碼登錄") time.sleep(10) login()
- 選擇購物車列表
選擇購物車列表defpicking(method):是否全選購物車ifmethod ==0:whileTrue:try:ifbrowser.find_element_by_id("J_SelectAll1"): browser.find_element_by_id("J_SelectAll1").click() print(全選購物車成功)breakexcept: print(f"找不到購買按鈕")else: print(f"請手動勾選需要購買的商品") time.sleep(1)
- 點擊結算按鈕
點擊結算按鈕defsettlement():whileTrue:try:ifbrowser.find_element_by_id(J_SelectedItemsCount).text >=1: browser.find_element_by_link_text("結 算").click() print(f"結算成功,準備提交訂單")breakexcept:pass
- 點擊提交訂單按鈕
點擊提交訂單按鈕defsubmitting():whileTrue:try:ifbrowser.find_element_by_link_text(提交訂單): browser.find_element_by_link_text(提交訂單).click() print(f"搶購成功,請盡快付款")breakexcept: print(f"再次嘗試提交訂單")
- 開始執(zhí)行搶購
defrun(times):打開購物車列表頁面print(正在搶購!) browser.get("https://cart.taobao.com/cart.htm") time.sleep(3)whileTrue: now = datetime.datetime.now().strftime(%Y-%m-%d %H:%M:%S.%f)對比時間,時間到的話就點擊結算ifnow > times:全選購物車picking(0)點擊結算按鈕settlement()提交訂單submitting() print(now)break
希望本文對你有所幫助~~如果對軟件測試、接口測試、自動化測試、性能測試、面試經驗交流感興趣可以私聊我或關注公眾號特斯汀軟件測試。免費領取最新軟件測試大廠面試資料和Python自動化、接口、框架搭建學習資料!技術大牛解惑答疑,同行一起交流。
飯后茴香:飯后嚼5~10粒茴香并咽下,可以防止口臭、清新口氣。茴香中的油還能幫助消化,去除消化道臭味。
免責聲明:本站所有信息均搜集自互聯(lián)網,并不代表本站觀點,本站不對其真實合法性負責。如有信息侵犯了您的權益,請告知,本站將立刻處理。聯(lián)系QQ:1640731186
燕云十六聲不見山隱藏寶箱2025-10-12 20:14
微軟電腦管家 官網2025-10-12 20:06
惠普最新款筆記本電腦臺式電腦牌子排名2025-10-12 19:52
平板電腦有必要買嗎2025-10-12 19:29
太平洋水務五集團領導與河南省南陽市職教園區(qū)黨工委副書記、管委會主任會談2025-10-12 19:05
qq電腦管家中國十大電腦排行榜2025-10-12 18:32