• 利用selenium爬取淘宝美食内容


    1、启动pycharm

    首先咱们新建一个项目名字大家可以自己设定

    接着新建一个spider.p文件

    #author: "xian"
    #date: 2018/5/4
    import re #导入re库
    from selenium import webdriver #导入selenium库
    from selenium.common.exceptions import TimeoutException #导入超时异常处理模块
    from selenium.webdriver.common.by import By #查找元素
    from selenium.webdriver.support.ui import WebDriverWait #等待页面加载
    from selenium.webdriver.support import expected_conditions as EC #预定义条件供WebDriverWait调用
    from pyquery import PyQuery as pq #导入pyquery解析网页源代码
    import pymongo #导入pymongo库用于操作mongddb数据库
    
    MONGO_URL = 'localhost' #指定本机的mongodb数据库
    MONGO_DB = 'taobao' #指定数据库名称为taobao
    MONGO_TABLE = 'meishi'  #指定存储表名称为meishi
    
    client = pymongo.MongoClient(MONGO_URL) #创建一个连接
    db = client[MONGO_DB] #访问一个名为taobao的数据库并赋值给本地变量db
    
    browser = webdriver.Chrome() #驱动Chrome浏览器
    wait = WebDriverWait(browser,10)#设置等待时间为10s并赋值给wait变量
    
    #定义一个搜索函数search
    def search():
        #异常处理模块 try ... except...
        try:
            browser.get('https://www.taobao.com') #请求淘宝首页
            #显示选择具体见官网:http://selenium-python-zh.readthedocs.io/en/latest/waits.html#id2
            # 以下用CSS选择器设定等待条件
            input = wait.until(
                EC.presence_of_element_located((By.CSS_SELECTOR, '#q')) #EC.*** ,***为加载条件 具体小伙伴们参见官方文档即可
            )
            submit = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,'#J_TSearchForm > div.search-button > button')))
            #用CSS选择器(打开chrome找到输入框右键审查元素右击copy css selector 复制即可 )
            #设定Action Chains即动作链
            input.send_keys('美食') #相当于输入关键字:美食
            submit.click() #相当于模拟点击动作
            total = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#mainsrp-pager > div > div > div > div.total'))) #加载全部页面
            get_products() #执行具体商品解析函数
            return total.text #获取文本内容
        except TimeoutException: #引入timeout异常
            return search() #如果超时将再请求一次
    
    #执行翻页操作函数
    def next_page(page_number):
        try:
            input = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '#mainsrp-pager > div > div > div > div.form > input')))
            submit = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '#mainsrp-pager > div > div > div > div.form > span.btn.J_Submit')))
            input.clear() #清空框中内容,方便重新填入 (比如你先填了2 就翻到第二页,现在我当然先清空内容,再填入3才能进入第3页)
            input.send_keys(page_number)
            submit.click()
            wait.until(EC.text_to_be_present_in_element((By.CSS_SELECTOR,'#mainsrp-pager > div > div > div > ul > li.item.active > span'),str(page_number)))
            get_products()
        except TimeoutException:
            next_page(page_number)
    
    #商品详情解析函数
    def get_products():
        wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#mainsrp-itemlist .items .item')))
        html = browser.page_source
        doc = pq(html)
        items = doc('#mainsrp-itemlist .items .item').items() #参见官网http://pyquery.readthedocs.io/en/latest/api.html
        for item in items:
            #以下使用pyquery选择器选择元素
            product = {
                'image':item.find('.pic .img').attr('src'),
                'price':item.find('.price').text().replace('
    ',''),
                'deal':item.find('.deal-cnt').text()[:-3],
                'title':item.find('.title').text().replace('
    ',''),
                'shop':item.find('.shop').text(),
                'location':item.find('.location').text(),
            }
            print(product)
            save_to_mongo(product)
    #存储到mongodb数据库
    def save_to_mongo(result):
        try:
            if db[MONGO_TABLE].insert(result):
                print('存储到mongodb成功!',result)
        except Exception:
            print('存储到mongodb失败!',result)
    
    
    #主函数
    def main():
        total = search() #打印结果为:共100页
        total = int(re.compile('(d+)').search(total).group(1)) #使用正则表达式抽取其中的数字100 int()将字符串转为整数
        for i in range(2,total + 1):
            next_page(i)
        browser.close()
    
    #该函数的作为为只在当前py执行,方便调试
    if __name__ == '__main__':
        main()

    
    

    运行结果:

    小伙伴们可是将其中的美食字样该为其他想要获取的淘宝商品数据尝试运行下,是不是挺有意思的,哈哈!


  • 相关阅读:
    rip协议
    IP地址的计算以及子网掩码的计算
    jQuery知识点
    JavaScript 语言编程学习路线
    JS中AJAX知识
    .以及JDK1.5ConcurrentHashMap新特性
    Java程序执行顺序
    观察者设计模式
    Servlet中Filter的学习
    JDBC和连接池知识点
  • 原文地址:https://www.cnblogs.com/518894-lu/p/8993068.html
Copyright © 2020-2023  润新知