天猫商品数据爬虫使用教程
- 下载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