整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          python爬取并分析淘寶商品信息

          python爬取并分析淘寶商品信息

          ython爬取并分析淘寶商品信息

          • 背景介紹
          • 一、模擬登陸
          • 二、爬取商品信息
          • 1. 定義相關參數2. 分析并定義正則3. 數據爬取
          • 三、簡單數據分析
          • 1.導入庫2.中文顯示3.讀取數據4.分析價格分布5.分析銷售地分布6.詞云分析
          • 寫在最后

          私信小編01即可獲取大量Python學習資料

          Tip:本文僅供學習與交流,切勿用于非法用途!!!

          背景介紹

          有個同學問我:“XXX,有沒有辦法搜集一下淘寶的商品信息啊,我想要做個統計”。于是乎,閑來無事的我,又開始琢磨起這事…


          俗話說,實踐出真知~
          小的在這給大家安利一套《2020最新企業Pyhon項目實戰》視頻教程,點擊此處即可獲取,希望大家一起進步哦。

          一、模擬登陸

          興致勃勃的我,沖進淘寶就準備一頓亂搜:


          在搜索欄里填好關鍵詞:“顯卡”,小手輕快敲擊著回車鍵(小樣~看我的)
          心情愉悅的我等待著返回滿滿的商品信息,結果苦苦的等待換了的卻是302,于是我意外地來到了登陸界面。


          情況基本就是這么個情況了…
          然后我查了一下,隨著淘寶反爬手段的不斷加強,很多小伙伴應該已經發現,淘寶搜索功能是需要
          用戶登陸的!

          關于淘寶模擬登陸,有大大已經利用requests成功模擬登陸(感興趣的小伙伴請往這邊>>>requests登陸淘寶<<<)
          這個方法得先分析淘寶登陸的各種請求,并模擬生成相應的參數,相對來說有一定的難度。于是我決定換一種思路,通過
          selenium+二維碼的方式:

          # 打開圖片
          def Openimg(img_location):
              img=Image.open(img_location)
              img.show()
          
          # 登陸獲取cookies
          def Login():  
              driver=webdriver.PhantomJS() 
              driver.get('https://login.taobao.com/member/login.jhtml')
              try:
                  driver.find_element_by_xpath('//*[@id="login"]/div[1]/i').click()
              except:
                  pass
              time.sleep(3)
              # 執行JS獲得canvas的二維碼
              JS='return document.getElementsByTagName("canvas")[0].toDataURL("image/png");'
              im_info=driver.execute_script(JS) # 執行JS獲取圖片信息
              im_base64=im_info.split(',')[1]  #拿到base64編碼的圖片信息
              im_bytes=base64.b64decode(im_base64)  #轉為bytes類型
              time.sleep(2)
              with open('./login.png','wb') as f:
                  f.write(im_bytes)
                  f.close()
              t=threading.Thread(target=Openimg,args=('./login.png',))
              t.start()
              print("Logining...Please sweep the code!\n")
              while(True):
                  c=driver.get_cookies()
                  if len(c) > 20:   #登陸成功獲取到cookies
                      cookies={}
                      for i in range(len(c)):
                          cookies[c[i]['name']]=c[i]['value']
                      driver.close()
                      print("Login in successfully!\n")
                      return cookies
                  time.sleep(1)
          

          通過webdriver打開淘寶登陸界面,把二維碼下載到本地并打開等待用戶掃碼(相應的元素大家通過瀏覽器的F12元素分析很容易就能找出)。待掃碼成功后,將webdriver里的cookies轉為DICT形式,并返回。(這里是為了后續requests爬取信息的時候使用)

          二、爬取商品信息

          當我拿到cookies之后,便能對商品信息進行爬取了。
          (小樣 ~我來啦)

          1. 定義相關參數

          定義相應的請求地址,請求頭等等:

          # 定義參數
          headers={'Host':'s.taobao.com',
                     'User-Agent':'Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:63.0) Gecko/20100101 Firefox/63.0',
                     'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
                     'Accept-Language':'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
                     'Accept-Encoding':'gzip, deflate, br',
                     'Connection':'keep-alive'}
          list_url='http://s.taobao.com/search?q=%(key)s&ie=utf8&s=%(page)d'
          12345678

          2. 分析并定義正則

          當請求得到HTML頁面后,想要得到我們想要的數據就必須得對其進行提取,這里我選擇了正則的方式。通過查看頁面源碼:


          偷懶的我上面只標志了兩個數據,不過其他
          是類似的,于是得到以下正則:

          # 正則模式
          p_title='"raw_title":"(.*?)"'       #標題
          p_location='"item_loc":"(.*?)"'    #銷售地
          p_sale='"view_sales":"(.*?)人付款"' #銷售量
          p_comment='"comment_count":"(.*?)"'#評論數
          p_price='"view_price":"(.*?)"'     #銷售價格
          p_nid='"nid":"(.*?)"'              #商品唯一ID
          p_img='"pic_url":"(.*?)"'          #圖片URL
          12345678

          (ps.聰明的小伙伴應該已經發現了,其實商品信息是被保存在了g_page_config變量里面,所以我們也可以先提取這個變量(一個字典),然后再讀取數據,也可!)

          3. 數據爬取

          完事具備,只欠東風。于是,東風來了:

          # 數據爬取
          key=input('請輸入關鍵字:') # 商品的關鍵詞
          N=20 # 爬取的頁數 
          data=[]
          cookies=Login()
          for i in range(N):
              try:
                  page=i*44
                  url=list_url%{'key':key,'page':page}
                  res=requests.get(url,headers=headers,cookies=cookies)
                  html=res.text
                  title=re.findall(p_title,html)
                  location=re.findall(p_location,html)
                  sale=re.findall(p_sale,html)
                  comment=re.findall(p_comment,html)
                  price=re.findall(p_price,html)
                  nid=re.findall(p_nid,html)
                  img=re.findall(p_img,html)
                  for j in range(len(title)):
                      data.append([title[j],location[j],sale[j],comment[j],price[j],nid[j],img[j]])
                  print('-------Page%s complete!--------\n\n'%(i+1))
                  time.sleep(3)
              except:
                  pass
          data=pd.DataFrame(data,columns=['title','location','sale','comment','price','nid','img'])
          data.to_csv('%s.csv'%key,encoding='utf-8',index=False)
          

          上面代碼爬取20也商品信息,并將其保存在本地的csv文件中,效果是這樣的:

          三、簡單數據分析

          有了數據,放著豈不是浪費,我可是社會主義好青年,怎能做這種事? 那么,就讓我們來簡單看看這些數據
          (當然,數據量小,僅供娛樂參考)

          1.導入庫

          # 導入相關庫
          import jieba
          import operator
          import pandas as pd
          from wordcloud import WordCloud
          from matplotlib import pyplot as plt
          

          相應庫的安裝方法(其實基本都能通過pip解決):

          • jieba
          • pandas
          • wordcloud
          • matplotlib

          2.中文顯示

          # matplotlib中文顯示
          plt.rcParams['font.family']=['sans-serif']
          plt.rcParams['font.sans-serif']=['SimHei']
          

          不設置可能出現中文亂碼等鬧心的情況哦~

          3.讀取數據

          # 讀取數據
          key='顯卡'
          data=pd.read_csv('%s.csv'%key,encoding='utf-8',engine='python')
          

          4.分析價格分布

          # 價格分布
          plt.figure(figsize=(16,9))
          plt.hist(data['price'],bins=20,alpha=0.6)
          plt.title('價格頻率分布直方圖')
          plt.xlabel('價格')
          plt.ylabel('頻數')
          plt.savefig('價格分布.png')
          

          價格頻率分布直方圖:

          5.分析銷售地分布

          # 銷售地分布
          group_data=list(data.groupby('location'))
          loc_num={}
          for i in range(len(group_data)):
              loc_num[group_data[i][0]]=len(group_data[i][1])
          plt.figure(figsize=(19,9))
          plt.title('銷售地')
          plt.scatter(list(loc_num.keys())[:20],list(loc_num.values())[:20],color='r')
          plt.plot(list(loc_num.keys())[:20],list(loc_num.values())[:20])
          plt.savefig('銷售地.png')
          sorted_loc_num=sorted(loc_num.items(), key=operator.itemgetter(1),reverse=True)#排序
          loc_num_10=sorted_loc_num[:10]  #取前10
          loc_10=[]
          num_10=[]
          for i in range(10):
              loc_10.append(loc_num_10[i][0])
              num_10.append(loc_num_10[i][1])
          plt.figure(figsize=(16,9))
          plt.title('銷售地TOP10')
          plt.bar(loc_10,num_10,facecolor='lightskyblue',edgecolor='white')
          plt.savefig('銷售地TOP10.png')
          

          銷售地分布:


          銷售地TOP10:

          6.詞云分析

          # 制作詞云
          content=''
          for i in range(len(data)):
              content +=data['title'][i]
          wl=jieba.cut(content,cut_all=True)
          wl_space_split=' '.join(wl)
          wc=WordCloud('simhei.ttf',
                         background_color='white', # 背景顏色
                         width=1000,
                         height=600,).generate(wl_space_split)
          wc.to_file('%s.png'%key)
          

          淘寶商品”顯卡“的詞云:

          寫在最后

          最后,要說點啥呢~

          . LYST.COM

          https://www.lyst.com/

          這個網站其實就是一個網購搜索引擎,通過爬蟲技術,搜羅了全球各大電商購物平臺的各種商品信息。你可以通過這個搜索引擎去找想要的潮流單品,不管是什么東西,它都能通過強大的篩選功能細致地給你羅列出來,包括顏色、尺碼、款式分類、是否打折等。而且會對比各個平臺,幫你比價,以最實惠的價格買到最棒的商品。


          所以購物前用這個網站搜一下就對了,基本上不會有買貴了的情況。


          當然有些例外的情況,比如有些品牌的貨品賣不出去,像日韓品牌CDG、三宅一生復線Homme Plisse、ADER等這些品牌就會私下給一些渠道商或者代購以7-8折的優惠去散貨。所以可能有時候在平臺上去比價購買,也許還沒有你在淘寶代購那里買的便宜。因為這些品牌在本國和國際市場的定價是不同的,這是由于國際貿易中不同國家的進口稅導致的。所以如果想真正的撿到便宜,自己還是平時要做足功課,了解你喜歡的品牌在本國和外國的售價。


          2. MagazineLib

          https://magazinelib.com/

          非常全的外刊搜索網站,并且提供免費的PDF下載。有著強大的篩選功能,分類細致,每一期都會羅列出來,基本上你可以挑到所有你喜歡的雜志。


          3. 123apps

          https://123apps.com/cn/

          這是一個提供在線音樂剪輯、視頻剪輯、音視頻格式轉換、合成音軌等功能。完全免費,使用方便,精簡小巧,可直接在瀏覽器上運行并完成操作。

          我體驗了一下里面的視頻剪輯功能,操作很簡單,視頻導入非常快,導出時可以選擇畫質。還可以裁剪視頻的所需區域,或更改邊框比例。目前最大支持上傳500M視頻文件。


          4. 在線詞云生成工具-微詞云

          https://www.weiciyun.com/

          這個網站提供了一款非常簡單實用的微詞云生成工具。只需簡單幾步,選擇合適的背景圖,編輯需要的詞匯,它就能自動幫你生成炫酷的詞云,讓人眼前一亮。

          除此之外,它還有強大的設計功能,每個字的字體、顏色、大小、分布等都可以進行設置。這比使用PS設計詞云Logo封面簡單太多。


          5. 米范-酷導航

          https://www.mifar.net/

          這是一個專門為新媒體和電商從業者設計的導航網站,目前導航共有 運營營銷、電子商務、數據信息、圖像影音、前端設計、網站建設和實用工具七個大分類,收錄了100+新媒體人必備工具,公眾號排版、無版權圖庫、裂變增長、社群運營、數據分析、創意H5、流量采買等等。

          如果你被排版編輯、編輯制作、數據收集和網站建設所困擾,翻翻米范或許可以獲得一絲靈感。


          6. 秘搭寫作貓

          https://xiezuocat.com/

          秘塔寫作貓是一個不可多得的 AI 智能寫作工具,它專注于中文寫作,功能非常強大,每個功能都可以幫助你更好的進行中文寫作。

          首先,它支持實時錯誤提示,你可以直接在網站里面進行寫作,網站會實時提示你的錯誤,包括:字詞錯誤、標點誤用、語序錯誤、語法問題、同義混淆,并且給出具體的修改建議。

          它的高級提示功能還包括:專有名詞大小寫檢查、詞語一致性檢查、成語搭配、量詞搭配、形近字、語法分析、情感分析、語序分析等。

          它支持全文改寫功能,這個功能可以幫助你一鍵修改文章的錯誤,讓你的文章瞬間變得高級自然,并且用下劃線展示了具體修改的地方。

          最后,網站并不是完全免費的,提供免費版、基礎版、高級版,免費版的功能和高級版其實差不多,免費版也足夠滿足日常使用需求,但是越高版本的單日處理字數、單篇處理字數、翻譯字數也會越高。

          7. 熊貓搜書

          https://ebook.huzerui.com/

          熊貓搜書是一個非常好用的電子書導航網站,一個網站相當于很多個網站。

          它聚合了多達 20 多個高質量電子書網站,并且每個網站的質量都是非常高,它的界面簡潔清新,你可以直接點擊左側切換網站。

          8. PPT超級市場

          http://ppt.sotary.com/web/wxapp/index.html

          PPT 超級市場是一個完全免費的 PPT 模板下載網站。里面每一個 PPT 模板的質量都是極高,并且非常精美。

          它的界面非常簡潔,沒有任何多余的東西,只有一個簡單的搜索框和部分推薦模板,你可以直接利用網站的搜索功能搜索你需要的 PPT 模板。

          搜索完畢,你就可以點擊下載按鈕直接下載 PPT 模板。

          9.全歷史

          https://www.allhistory.com/

          這個網站把每個國家的歷史用時間軸的形式串了起來。點擊一下朝代,就可以看到這個朝代的大事件和代表人物。

          除此之外,里面的AI關系圖譜功能提供了世界上各種人物、歷史、文化、商業、科學等關系樹狀圖。

          時間地圖功能還可以讓你選擇穿越回任意時代的疆域版圖,根據不同年份詳細標注了不一樣的人物和事件。

          F L O T ?

          END



          最后一個,忘記說了

          封面的Pornhub體LOGO生成網站

          由V2EX論壇KasuganoSoras制作

          Pornhub

          https://www.zerobbs.net/pornhub/

          YouTube

          https://www.zerobbs.net/youtube/


          如對本稿件有異議或投訴,請聯系flot_official@163.com

          用Selenium爬取淘寶商品(繞過登錄頁面)

          用Selenium來模擬瀏覽器操作,抓取淘寶商品信息,并將結果保存到MongoDB。

          1.準備工作

          本文以Chrome為例來講解Selenium的用法。在開始之前,請確保已經正確安裝好了Chrome瀏覽器并配置好了ChromeDriver;另外,還需要正確安裝Python的Selenium庫。

          2.接口分析

          首先,我們來打開淘寶的接口,觀察一下它的ajax請求。

          打開淘寶頁面,搜索商品,比如ipad,此時打開開發者工具,查看Ajax請求,我們可以發現,根本沒有Ajax請求,如圖

          不過沒有關系,我們可以直接用Selenium來模擬瀏覽器,只要在瀏覽器里能看到的,都可以爬取。這也是我們選擇使用Selenium的原因。

          3.頁面分析

          我們的目標是爬取商品信息。如圖是一個商品條目,其中包含商品的基本信息,包括商品圖片、名稱、價格、購買人數、店鋪名稱和店鋪所在地,我們要做的就是將這些信息都抓取下來。

          抓取入口就是淘寶的搜索頁面,這個鏈接可以通過直接構造參數訪問。例如,如果搜ipad,就可以直接訪問https://s.taobao.com/search?q=ipad,呈現的就是第一頁的搜索結果,如圖所示

          在頁面下方,有一個分頁導航,其中既包括前5頁的鏈接,也包括下一個的鏈接,同時還有一個輸入任意頁碼跳轉的鏈接,如圖

          這里商品搜索的結果一般最大都是100頁,要獲取每一頁的內容,只需要將頁碼從1到100順序遍歷即可,頁碼數是確定的。所以,直接在頁面跳轉文本框中輸入要跳轉的頁碼,然后點擊“確定”按鈕即可跳轉到頁碼對應的頁面。

          這里不直接點擊“下一頁”的原因是:一旦爬取過程中出現異常退出,比如到50頁退出了,此時點擊“下一頁”時,就無法快速切換到對應的后續頁面了。此外,在爬取過程中,也需要記錄當前的頁碼數,而且點擊“下一頁”之后頁面加載失敗,還需要做異常檢測,檢測當前頁面是加載到了第幾頁。整個流程比較復雜,所以我們這里直接用跳轉的方式來爬取頁面。

          當我們成功的加載出某一頁商品列表時,利用Selenium即可獲取頁面源代碼,然后再用相應的解析庫解析即可。這里我們選用pyquery解析。下面我們用代碼實現整個抓取過程。

          4.獲取商品列表

          首先,需要構造一個抓取的URL:https://s.taobao.com/search?q=ipad。這個URL非常簡潔,參數q就是要搜索的關鍵字。只要改變這個參數,即可獲取不同的商品列表。這里我們將商品的關鍵字定義成一個變量,然后構造出這樣的一個URL。

          然后就需要用Selenium進行抓取了。我們實現了如下抓取列表頁的方法:

          from selenium import webdriver
          from selenium.common.exceptions import TimeoutException
          from selenium.webdriver.common.by import By
          from selenium.webdriver.support import expected_conditions as EC
          from selenium.webdriver.support.wait import WebDriverWait
          from urllib.parse import quote
          import time
          browser=webdriver.Chrome()
          wait=WebDriverWait(browser,10)
          KEYWORD='ipad'
          def index_page(page):
              """
              抓取索引頁
              :param page: 頁碼
              """
              print('正在爬取第',page,'頁')
              try:
                  url='https://s.taobao.com/search?q='+quote(KEYWORD)
                  browser.get(url)
                  if page>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()
              except TimeoutException:
                  index_page(page)

          這里首先構造了一個WebDriver對象,使用的瀏覽器是Chrome,然后指定一個關鍵詞,如ipad,接著定義了index_age()方法,用于抓取商品列表頁。

          在該方法里,我們首先訪問了搜索商品的鏈接,然后判斷了當前的頁碼,如果大于1,就進行跳頁操作,否則等待頁面加載完成。

          等待加載時,我們使用了WebDriverWait對象,它可以指定等待條件,同時指定一個最長等待時間,這里指定為10s。如果在這個時間內成功匹配了等待條件,也就是說頁面元素成功加載出來了,就立即返回相應結果并繼續向下執行,否則到了最大等待時間還沒有加載出來時,就直接拋出超時異常。

          比如,我們最終要等待商品信息加載出來,就指定了presnece_of_element_located這個條件,然后傳入了.m-itemlist .items .item這個選擇器,而這個選擇器對應的頁面內容就是每個商品的信息塊,可以在網頁中查看。如果加載成功,就會執行后續的get_products()方法,提取商品信息。

          關于翻頁操作,這里首先獲取頁碼輸入框,賦值為input,然后獲取“確定”按鈕,賦值為submit,分別是圖中的兩個元素。

          首先,我們清空了輸入框,此時調用clear()方法即可。隨后,調用send_keys()方法將頁碼填充到輸入框中,然后點擊“確定按鈕即可”

          那么,怎么樣知道有沒有跳轉到對應的頁碼呢?我們可以注意到,成功跳轉到某一頁后,頁碼都會高亮顯示,如圖

          我們只需要判斷當前高亮的頁碼數是當前的頁碼數即可,所以這里使用了另一個等待條件text_to_be_present_in_element,它會等待指定的文本出現在某一個節點里面時即返回成功。這里我們將高亮的頁碼節點對應的CSS選擇器和當前要跳轉的頁碼通過參數傳遞給這個等待條件,這樣它就會檢測當前高亮的頁碼節點是不是我們傳過來的頁碼數,如果是,就證明頁面成功跳轉到了這一頁,頁面跳轉成功。

          這樣剛才實現的index_page()方法就可以傳入對應的頁碼,待加載出對應頁碼的商品列表后,再去調用get_products()方法進行頁面解析。

          5.解析商品列表

          接下來,我們就可以實現get_products()方法來解析商品列表了。這里我們直接獲取頁面源代碼,然后用pyquery進行解析,實現如下:

          from pyquery import PyQuery as pq
          def get_products():
              """
              提取商品數據
              """
              html=browser.page_source
              doc=pq(html)
              items=doc('#mainsrp-itemlist .items .item').items()
              for item in items:
                  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循環將每個結果分別進行解析,每次循環把它賦值為item變量,每個item變量都是一個PyQuery對象,然后再調用它的find()方法,傳入CSS選擇器,就可以獲取單個商品的特定內容。

          比如查看一下商品源碼

          可以發現,它是一個img節點,包含id、class、data-src、alt和src屬性,這里之所以可以看到這樣圖片,是因為它的src屬性被賦值為圖片的URL。把它的src屬性提取出來,就可以獲取商品的完整圖片了。不過我們還注意data-src屬性,它的圖片內容也是圖片的URL,觀察后發現此URL是圖片的完整大圖,而src是壓縮后的小圖,所以這里抓取data-src屬性來作為商品的圖片。

          因此,我們需要先利用find()方法找到圖片的這個節點,然后再調用attr()方法獲取商品的data-src屬性,這樣就成功提取了商品的鏈接。然后用同樣的方法提取商品的價格、成交量、名稱、店鋪所在地等信息,接著將所有提取結果賦值為一個字典product,然后調用save_mongo()將其保存到MongoDB即可。

          6.保存到MongoDB

          接下來,我們將商品信息保存到MongoDB,代碼如下:

          import pymongo
          MONGO_URL='localhost'
          MONGO_DB='taobao'
          MONGO_COLLECTION='products'
          client=pymongo.MongoClient(MONGO_URL)
          db=client[MONGO_DB]
          def save_to_mongo(result):
              """
              保存結果到MongoDB
              """
              try:
                  if db[MONGO_COLLECTION].insert(result):
                      print('存儲到MongoDB成功')
              except Exception:
                  print('存儲到MongoDB失敗')
          
          

          這里首先創建了一個MongoDB的連接對象,然后指定了數據庫,隨后指定了Collection的名稱,接著調用insert()方法將數據庫插入到MongoDB。此處的result的變量就是在get_products()方法里傳來的product,包含單個商品的信息。

          7.遍歷每頁

          剛才我們所定義的get_index()方法需要接收參數page,page代碼頁碼。這里我們實現頁碼遍歷即可,代碼如下:

          MAX_PAGE=10
          def main():
              """
              遍歷
              :return:
              """
              for i in range(1,MAX_PAGE+1):
                  index_page(i)
                  time.sleep(10)
          main()

          最后調用main()方法即可運行。

          8.異常處理(繞過登錄反爬機制)

          當寫到這里,如果運行程序會發現,程序在彈出瀏覽器窗口后,會出現登陸頁面,但是當你嘗試輸入賬戶密碼時,滑塊的驗證始終失效。并且頁面還會不斷刷新。如圖

          針對這種情況,博主找到了兩種解決方案

          方法一:修改ChromeDriver.exe

          之所以出現這種情況,是因為在淘寶的登錄頁面,有這樣一個js,它會判斷你是通過驅動打開的瀏覽器還是其他情況,如果是驅動打開那么這個判斷為真就會出現這種情況,如圖,為判斷的js

          我們在控制臺運行一下這個腳本window.navigator.webdriver

          可以看到,判斷為真,說明瀏覽器知道我們使用的是驅動。

          那該如何解決呢?

          首先,使用nodepad++或者記事本打開chrome,查找$cdc,找到這串代碼后,將其用等長的字符串替代即可,例如把最后的l改成a。

          然后把部分代碼改為如下模式,將瀏覽器設置為開發者模式:

          option=webdriver.ChromeOptions()
          #開發者模式的開關,設置一下,打開瀏覽器就不會識別為自動化測試工具了
          option.add_experimental_option('excludeSwitches', ['enable-automation'])
          driver=webdriver.Chrome(chrome_options=option)


          如果這種方法不能奏效,請看第二種方法

          方法二:將用戶信息的配置文件在代碼中加載

          首先,在Chrome中輸入chrome://version/查看信息。如圖,這是我們用戶信息。

          然后在代碼中,加載瀏覽器配置

          chrome_option=webdriver.ChromeOptions()
          p=r'C:\Users\趙磊\AppData\Local\Google\Chrome\User Data'
          #chrome_option.add_experimental_option('excludeSwitches', ['enable-automation'])  # 以開發者模式
          chrome_option.add_argument('--user-data-dir='+p)
          browser=webdriver.Chrome(options=chrome_option)
          wait=WebDriverWait(browser,10)

          這樣在爬取時就不會出現登錄頁面了。

          9.運行

          此時運行代碼,會發現彈出一個Chrome瀏覽器,然后會訪問淘寶頁面,接著控制臺輸出如下

          可以發現,這些商品信息的結果都是字典形式,它們倍存儲到MongoDB里面,再看一下MongoDB中的結果

          說明信息保存到MongoDB中,爬取成功。

          使用Selenium自動秒搶淘寶商品

          selenium有多種編程語言的客戶端驅動,編寫自動化腳本語法簡潔,其中python的selenium庫便非常的受歡迎。

          你可以使用selenium做web測試或者爬蟲,自動搶票、自動下單也可以用selenium來做。

          演示自動打開淘寶網:

          使用selenium搶購商品

          1. 導入selenium相關模塊
          # 導入庫
          from selenium import webdriver
          import datetime
          import time


          1. 打開chrome瀏覽器
          # 記錄時間
          now=datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')
          # 打開chrome 
          browser=webdriver.Chrome()


          1. 登錄淘寶
          # 登錄
          def login():
              # 打開淘寶首頁,通過掃碼登錄
              browser.get("https://www.taobao.com/")
              time.sleep(3)
              # 打開登錄界面
              find_login=browser.find_element_by_link_text("親,請登錄")
              if find_login:
                  find_login.click()
                  print("請掃碼登錄")
                  time.sleep(10)
                  
          login()


          1. 選擇購物車列表
          # 選擇購物車列表
          def picking(method):
              # 是否全選購物車
              if method==0:
                  while True:
                      try:
                          if browser.find_element_by_id("J_SelectAll1"):
                              browser.find_element_by_id("J_SelectAll1").click()
                              print('全選購物車成功')
                              break
                      except:
                          print(f"找不到購買按鈕")
              else:
                  print(f"請手動勾選需要購買的商品")
                  time.sleep(1)


          1. 點擊結算按鈕
          # 點擊結算按鈕
          def settlement():
              while True:
                  try:
                      if browser.find_element_by_id('J_SelectedItemsCount').text >='1':
                          browser.find_element_by_link_text("結 算").click()
                          print(f"結算成功,準備提交訂單")
                          break
                  except:
                      pass


          1. 點擊提交訂單按鈕
          # 點擊提交訂單按鈕
          def submitting():
              while True:
                  try:
                      if browser.find_element_by_link_text('提交訂單'):
                          browser.find_element_by_link_text('提交訂單').click()
                          print(f"搶購成功,請盡快付款")
                          break
                  except:
                      print(f"再次嘗試提交訂單")


          1. 開始執行搶購
          def run(times):
              # 打開購物車列表頁面
              print('正在搶購!')
              browser.get("https://cart.taobao.com/cart.htm")
              time.sleep(3)
              while True:
                  now=datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')
                  # 對比時間,時間到的話就點擊結算
                  if now > times:
                      # 全選購物車
                      picking(0)
                      # 點擊結算按鈕
                      settlement()
                      # 提交訂單
                      submitting()
                      print(now)
                      break

          希望本文對你有所幫助~~如果對軟件測試、接口測試、自動化測試、性能測試、面試經驗交流感興趣可以私聊我或關注公眾號“特斯汀軟件測試”。免費領取最新軟件測試大廠面試資料和Python自動化、接口、框架搭建學習資料!技術大牛解惑答疑,同行一起交流。


          主站蜘蛛池模板: 亚洲爆乳精品无码一区二区| 精品国产一区二区三区久久蜜臀| 美日韩一区二区三区| 波多野结衣一区二区| 国产传媒一区二区三区呀| 国产在线一区二区综合免费视频| 精品黑人一区二区三区| 人妻少妇精品一区二区三区| 免费看无码自慰一区二区| 免费无码一区二区三区| 精品免费久久久久国产一区| 无码人妻aⅴ一区二区三区有奶水| 中文字幕一区二区三| 精品乱码一区二区三区在线| 精品无码日韩一区二区三区不卡| 国产熟女一区二区三区四区五区| 精品理论片一区二区三区| 中文激情在线一区二区| 日韩在线不卡免费视频一区| 亚洲熟女少妇一区二区| 一区二区三区在线免费| 男人的天堂精品国产一区| 国语对白一区二区三区| 亚洲丶国产丶欧美一区二区三区| 亚洲丰满熟女一区二区v| 日本中文字幕一区二区有码在线| 国产福利电影一区二区三区久久老子无码午夜伦不 | 精品国产亚洲第一区二区三区| 人妻久久久一区二区三区| 国内偷窥一区二区三区视频| 国产精品被窝福利一区| 亚洲一区二区精品视频| 精品久久久久一区二区三区| 亚洲AⅤ无码一区二区三区在线| 日本精品视频一区二区| 日韩精品国产一区| 国产91精品一区| 亚洲片一区二区三区| 韩日午夜在线资源一区二区| 精品aⅴ一区二区三区| 国产激情视频一区二区三区|