Selenium爬取淘宝商品概要入mon

发布时间:2019-05-20 22:54:34编辑:auto阅读(2260)

    准备:

    1.安装Selenium:终端输入 pip install selenium

    2.安装下载Chromedriver:解压后放在…\Google\Chrome\Application\;如果是Mac,可放入/usr/locl/bin,并将此目录放入环境变量

    3.安装pyquery:终端输入 pip install pyquery

    4.安装pymongo:终端输入 pip install pymongo

    5.安装MongoDB的PyCharm插件:Preferences——Plugins——Mongo Plugin,安装完成后重启PyCharm可发现右侧有Mongo Explorer

    6.安装MongoDB,windows:参考小歪老师知乎专栏MongoDB及可视化工具的安装;mac:参考 Mac OSX 平台安装 MongoDB安装

    注:有时pip安装后,PyCharm中无法识别,首先确认编译器地址是否正确Preferences---Project interpreter;如果还不行,可在PyCharm下Preferences---Project interpreter重新添加包

    基于:python3.6

    遇到的坑:

    1.定位搜索框元素的时候,查找对象路径,在点完搜索按钮后的页面得到(正确应该在淘宝首页获取),结果运行的时候,怎么都获取不到这个对象;所以:获取元素的时候,一定要在正确的页面查找该元素位置

    2.翻页,10页以前的页码链接定位中规中矩,10页以后分奇偶,奇数用#mainsrp-pager > div > div > div > ul > li:nth-child(8) > a定位;偶数用#mainsrp-pager > div > div > div > ul > li:nth-child(9) > a定位,具体见源码

    以下是源码,参考了很多DC 学院《Python爬虫(入门+进阶)》1-7,1-8课程内容,这算不算硬广:p 

    #!/usr/bin/python
    # -*- coding:utf-8 -*-

    from selenium import webdriver
    from selenium.webdriver.support.wait import WebDriverWait
    from selenium.webdriver.support import expected_conditions as ec
    from selenium.webdriver.common.by import By
    from pyquery import PyQuery as pq
    import re
    import time
    from pymongo import MongoClient as mc

    driver = webdriver.Chrome() #打开Chrome浏览器
    wait = WebDriverWait(driver, 10)

    # 获取总页数
    def search():
    try:
    driver.get('https://www.taobao.com')
    # 获取搜索关键字输入框
    input = wait.until(ec.presence_of_element_located((By.CSS_SELECTOR, '#q')))
    # 获取搜索按钮
    search = wait.until(ec.element_to_be_clickable((By.CSS_SELECTOR, '#J_TSearchForm > div.search-button > button')),'not find element')
    # 输入关键字
    input.send_keys(u'鞋子')
    # 点搜索
    search.click()
    # 获取总页数
    page_total = wait.until(ec.presence_of_element_located((By.CSS_SELECTOR, '#mainsrp-pager > div > div > div > div.total')),'not find element')
    # 调用方法获取首页产品概要
    get_products()
    return page_total.text
    except Exception as ex:
    print(ex)

    # 翻页
    def page(pagenum):
    try:
    # 页数小于10,直接按页数定位
    if(pagenum < 10):
    css = '#mainsrp-pager > div > div > div > ul > li:nth-child({}) > a'.format(pagenum)
    else:
    # 页数大于10,如果是偶数,按nth-child(9)定位
    if (pagenum%2==0):
    css = '#mainsrp-pager > div > div > div > ul > li:nth-child(9) > a'
    # 页数大于10,如果是奇数,按nth-child(8)定位
    else:
    css = '#mainsrp-pager > div > div > div > ul > li:nth-child(8) > a'

    # 获取页码链接
    link = wait.until(ec.element_to_be_clickable((By.CSS_SELECTOR, css)), 'not find element')
    # 点击页码链接
    link.click()
    time.sleep(1)
    # 调用方法获取产品概要
    get_products()
    except Exception as ex:
    print(ex)

    # 获取每页产品概要数据
    def get_products():
    # 所有产品项位置
    pb = wait.until(ec.presence_of_element_located((By.CSS_SELECTOR, '#mainsrp-itemlist .items .item')),
    ' not find element')
    html = driver.page_source
    doc = pq(html)
    # 获取所有产品项数据
    items = doc('#mainsrp-itemlist .items .item').items()
    # 轮询每个产品
    for item in items:
    product = {
    # 产品图片链接
    'image': item.find('.pic .img').attr('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['title'])
    # 入MongoDB库
    client =mc()
    db = client.taobao
    set = db.xiezi
    set.insert(product)


    if __name__ == '__main__':
    # 获取总页数
    page_total = search()
    # 获取int 总页数
    pagenum = int(re.compile('(\d+)').search(page_total).group(1))
    # 轮询页码,获取产品概要;测试需要,只取15页
    for i in range(3, 15):
    print(str(i)+':')
    page(i)
    driver.quit()

     

关键字