zoukankan      html  css  js  c++  java
  • 16-使用Selenium模拟浏览器抓取淘宝商品美食信息

    淘宝由于含有很多请求参数和加密参数,如果直接分析ajax会非常繁琐,selenium自动化测试工具可以驱动浏览器自动完成一些操作,如模拟点击、输入、下拉等,这样我们只需要关心操作而不需要关心后台发生了怎样的请求。PhantomJS是一个无界面的浏览器。

    爬取淘宝搜索关键词下的宝贝内容,爬取到MONGODB,使用的解析库是pyquery。

    步骤:

    搜索关键字:利用Selenium驱动浏览器搜索关键字,得到查询后的商品列表。

    分析页码并翻页:得到商品页码数,模拟翻页,得到后续页面的商品列表。

    分析提取商品内容:利用PyQuery分析源码,解析得到商品列表。

    存储到MongoDB:将商品列表信息存储到数据库MongoDB。

     spider.py

    '''selenium库的API:https://selenium-python.readthedocs.io/。需要实现的功能可以参考API实现。'''
    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    import re
    from pyquery import PyQuery
    #导入存储MONGODB数据库的配置信息
    from config import *
    import pymongo
    #定义一个mongodb客户端
    client = pymongo.MongoClient(MONGO_URL)
    #定义数据库
    db = client[MONGO_DB]

    # browser = webdriver.Chrome(executable_path="D:ASoftPythonchromedriverchromedriver.exe")
    #我们在通过Selenium运行自动化测试时,必须要启动浏览器,浏览器的启动与关闭必然会影响执行效率。
    #Chrome-headless 模式,Google 自己出的无头浏览器模式。
    #由于PhantomJS已经被新版本的selenium库弃用,所以使用Chrome-headless。
    from selenium.webdriver.chrome.options import Options
    chrome_options = Options()
    chrome_options.add_argument('--headless')
    chrome_options.add_argument('--disable-gpu')
    browser = webdriver.Chrome(executable_path='D:ASoftPythonchromedriverchromedriver.exe', chrome_options=chrome_options)

    wait = WebDriverWait(browser, 1000)
    def search():
    try:
    '''第一步:搜索关键字:利用Selenium驱动浏览器搜索关键字,得到查询后的商品列表。'''
    browser.get('https://www.taobao.com')
    #等待查询输入框加载出来
    input = wait.until(
    EC.presence_of_element_located((By.CSS_SELECTOR, "#q"))
    )
    #等待按钮可点击
    submit = wait.until(
    #EC是选择条件,这里按钮选择条件设置为可点击
    # 选中‘搜索’按钮的源码右键copy->copy seletor,得到‘搜索'按钮的CSS_SELECTOR。
    EC.element_to_be_clickable((By.CSS_SELECTOR, '.btn-search')) #此处用的火狐浏览器的,谷歌浏览器得到的CSS_SELECTOR不好使。
    )
    #参考API的send_keys方法发送关键词
    input.send_keys(KEYWORD)
    submit.click()
    '''第二步:分析页码并翻页:得到商品页码数,模拟翻页,得到后续页面的商品列表。'''
    #获取总的页码数
    total = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#mainsrp-pager > div > div > div > div.total')))
    #在页面加载出来之后调用get_products()获取商品详情信息
    get_products()
    return total.text
    except TimeoutError:
    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()
    input.send_keys(page_number)
    submit.click()
    #等待高亮的页码显示为page_number
    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()获取商品详情信息
    get_products()
    except TimeoutError:
    next_page(page_number)

    #得到每个商品的详细信息
    def get_products():
    '''第三步:分析提取商品内容:利用PyQuery分析源码,解析得到商品列表。'''
    #得到每个商品item
    wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#mainsrp-itemlist .items .item')))
    #得到网页的源代码
    html = browser.page_source
    #用PyQuery库解析网页源代码
    doc = PyQuery(html)
    #得到所有选择的内容
    items = doc('#mainsrp-itemlist .items .item').items()
    #遍历每个item,得到其中的信息
    for item in items:
    product = {
    #得到图片信息,得到它的src属性。源码中可能出现多类选择器http://www.w3school.com.cn/css/css_selector_class.asp,可以只选择一个类选择器。
    'image':item.find('.pic .img').attr('src'),
    'price':item.find('.price').text(),
    'deal':item.find('.deal-cnt').text()[:-3],
    'title':item.find('.title').text(),
    'shop':item.find('.shop').text(),
    'location':item.find('.location').text()
    }
    print(product)
    #存储到MONGODB
    save_to_mongo(product)

    def save_to_mongo(result):
    '''第四部:存储到MongoDB:将商品列表信息存储到数据库MongoDB。'''
    try:
    if db[MONGO_TABLE].insert(result):
    print('存储到MONGODB成功',result)
    except Exception:
    print('存储到MONGODB失败',result)

    def main():
    try:
    total = search()
    total = int(re.compile('(d+)').search(total).group(1))
    for i in range(2,total + 1):
    next_page(i)
    except Exception:
    print('出错了')
    finally:
    #关闭浏览器
    browser.close()

    if __name__ == '__main__':
    main()



    config.py
    MONGO_URL = 'localhost'
    MONGO_DB = 'taobao'
    MONGO_TABLE = 'product'

    KEYWORD = '美食'























  • 相关阅读:
    python自定义排序
    flex 布局
    display: table-cell; 元素上下左右居中,子元素无宽高
    transform 方法 上下左右元素居中 子元素无宽高
    flex 方法上下左右居中 子元素无宽高
    兼容-02
    兼容
    jS辨别访问浏览器判断是android还是ios系统
    选项卡
    返回顶部
  • 原文地址:https://www.cnblogs.com/wisir/p/10107729.html
Copyright © 2011-2022 走看看