zoukankan      html  css  js  c++  java
  • Python爬虫学习教程:天猫商品数据爬虫

    天猫商品数据爬虫使用教程

    • 下载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('
    ',"").replace('
    ',"")
    172                 good_status = item.find('.productStatus').text().replace(" ","").replace("","").replace('
    ',"").replace('
    ',"")
    173                 good_price = item.find('.productPrice').text().replace("¥", "").replace(" ", "").replace('
    ', "").replace('
    ', "")
    174                 good_url = item.find('.productImg').attr('href')
    175                 print(good_title + "   " + good_status + "   " + good_price + "   " + good_url + '
    ')
    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

  • 相关阅读:
    【Java并发】并发笔记(一)
    【深入Java基础】排序算法(一)
    QDU-GZS and String
    牛客网36-A,B题解
    QDU-GZS与素数大法(素数筛法)
    csdn自动展开+去广告+净化剪切板+免登陆(如有侵权,立即删博)
    QDU第一届程序设计大赛——E到I题解法(非官方题解)
    Codeforces Round #529 -C- Powers Of Two(二进制拆分)
    CodeForces
    分配物资(模拟)
  • 原文地址:https://www.cnblogs.com/ITbiancheng/p/12100564.html
Copyright © 2011-2022 走看看