天貓商品數據爬蟲使用教程
- 下載chrome瀏覽器
- 查看chrome瀏覽器的版本號,下載對應版本號的chromedriver驅動
- pip安裝下列包
- pip install selenium
- pip install pyquery
- 登錄微博,並通過微博綁定淘寶賬號密碼
- 在main中填寫chromedriver的絕對路徑
- 在main中填寫微博賬號密碼
1 #改成你的chromedriver的完整路徑地址 2 chromedriver_path = "/Users/bird/Desktop/chromedriver.exe" 3 #改成你的微博賬號 4 weibo_username = "改成你的微博賬號" 5 #改成你的微博密碼 6 weibo_password = "改成你的微博密碼"
效果演示圖片
項目源碼
1 # -*- coding: utf-8 -*- 2 3 from selenium import webdriver 4 from selenium.webdriver.common.by import By 5 from selenium.webdriver.support.ui import WebDriverWait 6 from selenium.webdriver.support import expected_conditions as EC 7 from selenium.webdriver import ActionChains 8 from pyquery import PyQuery as pq 9 from time import sleep 10 11 12 #定義一個taobao類 13 class taobao_infos: 14 15 #對象初始化 16 def __init__(self): 17 url = 'https://login.taobao.com/member/login.jhtml' 18 self.url = url 19 20 options = webdriver.ChromeOptions() 21 options.add_experimental_option("prefs", {"profile.managed_default_content_settings.images": 2}) # 不加載圖片,加快訪問速度 22 options.add_experimental_option('excludeSwitches', ['enable-automation']) # 此步驟很重要,設置為開發者模式,防止被各大網站識別出來使用了Selenium 23 24 self.browser = webdriver.Chrome(executable_path=chromedriver_path, options=options) 25 self.wait = WebDriverWait(self.browser, 10) #超時時長為10s 26 27 28 #延時操作,並可選擇是否彈出窗口提示 29 def sleep_and_alert(self,sec,message,is_alert): 30 31 for second in range(sec): 32 if(is_alert): 33 alert = "alert(\"" + message + ":" + str(sec - second) + "秒\")" 34 self.browser.execute_script(alert) 35 al = self.browser.switch_to.alert 36 sleep(1) 37 al.accept() 38 else: 39 sleep(1) 40 41 42 #登錄淘寶 43 def login(self): 44 45 # 打開網頁 46 self.browser.get(self.url) 47 48 # 自適應等待,點擊密碼登錄選項 49 self.browser.implicitly_wait(30) #智能等待,直到網頁加載完畢,最長等待時間為30s 50 self.browser.find_element_by_xpath('//*[@class="forget-pwd J_Quick2Static"]').click() 51 52 # 自適應等待,點擊微博登錄宣傳 53 self.browser.implicitly_wait(30) 54 self.browser.find_element_by_xpath('//*[@class="weibo-login"]').click() 55 56 # 自適應等待,輸入微博賬號 57 self.browser.implicitly_wait(30) 58 self.browser.find_element_by_name('username').send_keys(weibo_username) 59 60 # 自適應等待,輸入微博密碼 61 self.browser.implicitly_wait(30) 62 self.browser.find_element_by_name('password').send_keys(weibo_password) 63 64 # 自適應等待,點擊確認登錄按鈕 65 self.browser.implicitly_wait(30) 66 self.browser.find_element_by_xpath('//*[@class="btn_tip"]/a/span').click() 67 68 # 直到獲取到淘寶會員昵稱才能確定是登錄成功 69 taobao_name = self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '.site-nav-bd > ul.site-nav-bd-l > li#J_SiteNavLogin > div.site-nav-menu-hd > div.site-nav-user > a.site-nav-login-info-nick '))) 70 # 輸出淘寶昵稱 71 print(taobao_name.text) 72 73 74 75 76 # 獲取天貓商品總共的頁數 77 def search_toal_page(self): 78 79 # 等待本頁面全部天貓商品數據加載完畢 80 good_total = self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '#J_ItemList > div.product > div.product-iWrap'))) 81 82 #獲取天貓商品總共頁數 83 number_total = self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '.ui-page > div.ui-page-wrap > b.ui-page-skip > form'))) 84 page_total = number_total.text.replace("共","").replace("頁,到第頁 確定","").replace(",","") 85 86 return page_total 87 88 89 # 翻頁操作 90 def next_page(self, page_number): 91 # 等待該頁面input輸入框加載完畢 92 input = self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '.ui-page > div.ui-page-wrap > b.ui-page-skip > form > input.ui-page-skipTo'))) 93 94 # 等待該頁面的確定按鈕加載完畢 95 submit = self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '.ui-page > div.ui-page-wrap > b.ui-page-skip > form > button.ui-btn-s'))) 96 97 # 清除里面的數字 98 input.clear() 99 100 # 重新輸入數字 101 input.send_keys(page_number) 102 103 # 強制延遲1秒,防止被識別成機器人 104 sleep(1) 105 106 # 點擊確定按鈕 107 submit.click() 108 109 110 # 模擬向下滑動瀏覽 111 def swipe_down(self,second): 112 for i in range(int(second/0.1)): 113 js = "var q=document.documentElement.scrollTop=" + str(300+200*i) 114 self.browser.execute_script(js) 115 sleep(0.1) 116 js = "var q=document.documentElement.scrollTop=100000" 117 self.browser.execute_script(js) 118 sleep(0.2) 119 120 121 # 爬取天貓商品數據 122 def crawl_good_data(self): 123 124 # 對天貓商品數據進行爬蟲 125 self.browser.get("https://list.tmall.com/search_product.htm?q=羽毛球") 126 err1 = self.browser.find_element_by_xpath("//*[@id='content']/div/div[2]").text 127 err1 = err1[:5] 128 if(err1 == "喵~沒找到"): 129 print("找不到您要的") 130 return 131 try: 132 self.browser.find_element_by_xpath("//*[@id='J_ComboRec']/div[1]") 133 err2 = self.browser.find_element_by_xpath("//*[@id='J_ComboRec']/div[1]").text 134 #print(err2) 135 136 err2 = err2[:5] 137 138 if(err2 == "我們還為您"): 139 print("您要查詢的商品書目太少了") 140 return 141 except: 142 print("可以爬取這些信息") 143 # 獲取天貓商品總共的頁數 144 page_total = self.search_toal_page() 145 print("總共頁數" + page_total) 146 147 # 遍歷所有頁數 148 for page in range(2,int(page_total)): 149 150 # 等待該頁面全部商品數據加載完畢 151 good_total = self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '#J_ItemList > div.product > div.product-iWrap'))) 152 153 # 等待該頁面input輸入框加載完畢 154 input = self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '.ui-page > div.ui-page-wrap > b.ui-page-skip > form > input.ui-page-skipTo'))) 155 156 # 獲取當前頁 157 now_page = input.get_attribute('value') 158 print("當前頁數" + now_page + ",總共頁數" + page_total) 159 160 # 獲取本頁面源代碼 161 html = self.browser.page_source 162 163 # pq模塊解析網頁源代碼 164 doc = pq(html) 165 166 # 存儲天貓商品數據 167 good_items = doc('#J_ItemList .product').items() 168 169 # 遍歷該頁的所有商品 170 for item in good_items: 171 good_title = item.find('.productTitle').text().replace('\n',"").replace('\r',"") 172 good_status = item.find('.productStatus').text().replace(" ","").replace("筆","").replace('\n',"").replace('\r',"") 173 good_price = item.find('.productPrice').text().replace("¥", "").replace(" ", "").replace('\n', "").replace('\r', "") 174 good_url = item.find('.productImg').attr('href') 175 print(good_title + " " + good_status + " " + good_price + " " + good_url + '\n') 176 177 178 # 精髓之處,大部分人被檢測為機器人就是因為進一步模擬人工操作 179 # 模擬人工向下瀏覽商品,即進行模擬下滑操作,防止被識別出是機器人 180 self.swipe_down(2) 181 182 # 翻頁,下一頁 183 self.next_page(page) 184 185 # 等待滑動驗證碼出現,超時時間為5秒,每0.5秒檢查一次 186 # 大部分情況不會出現滑動驗證碼,所以如果有需要可以注釋掉下面的代碼 187 # sleep(5) 188 WebDriverWait(self.browser, 5, 0.5).until(EC.presence_of_element_located((By.ID, "nc_1_n1z"))) #等待滑動拖動控件出現 189 try: 190 swipe_button = self.browser.find_element_by_id('nc_1_n1z') #獲取滑動拖動控件 191 192 #模擬拽托 193 action = ActionChains(self.browser) # 實例化一個action對象 194 action.click_and_hold(swipe_button).perform() # perform()用來執行ActionChains中存儲的行為 195 action.reset_actions() 196 action.move_by_offset(580, 0).perform() # 移動滑塊 197 198 except Exception as e: 199 print ('get button failed: ', e) 200 201 202 if __name__ == "__main__": 203 204 # 使用之前請先查看當前目錄下的使用說明文件README.MD 205 # 使用之前請先查看當前目錄下的使用說明文件README.MD 206 # 使用之前請先查看當前目錄下的使用說明文件README.MD 207 208 chromedriver_path = "/Users/bird/Desktop/chromedriver.exe" #改成你的chromedriver的完整路徑地址 209 weibo_username = "改成你的微博賬號" #改成你的微博賬號 210 weibo_password = "改成你的微博密碼" #改成你的微博密碼 211 212 a = taobao_infos() 213 a.login() #登錄 214 a.crawl_good_data() #爬取天貓商品數據
平台網站經常變動,可以做參考
很多初學者,對Python的概念都是模糊不清的,Python能做什么,學的時候,該按照什么線路去學習,學完往哪方面發展,想深入了解,詳情可以點擊有道雲筆記鏈接了解:http://note.youdao.com/noteshare?id=7df52a4961924a8d98d3bc774cbfe54d