zoukankan      html  css  js  c++  java
  • python3编写网络爬虫16-使用selenium 爬取淘宝商品信息

    一、使用selenium 模拟浏览器操作爬取淘宝商品信息

    之前我们已经成功尝试分析Ajax来抓取相关数据,但是并不是所有页面都可以通过分析Ajax来完成抓取。
    比如,淘宝,它的整个页面数据确实也是通过Ajax获取的,但是这些Ajax接口参数比较复杂,可能会包含加密密钥等,
    所以如果想自己构造Ajax参数,还是比较困难的。
    对于这种页面,最方便快捷的抓取方法就是通过Selenium

    目标:利用Selenium抓取淘宝商品并用pyquery解析得到商品的图片、名称、价格、购买人数、店铺名称和店铺所在地信息


    完整代码

    #-*-coding:utf-8-*-
    
    #抓取淘宝商品信息
    
    from selenium import webdriver
    from selenium.common.exceptions import TimeoutException
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.support.wait import WebDriverWait
    from urllib.parse import quote
    
    from pyquery import PyQuery as pq
    import pymongo
    import time
    
    browser = webdriver.Chrome()
    wait = WebDriverWait(browser,15)
    KEYWORD = 'iPad'
    
    #抓取索引页
    
    def index_page(page):
      print('正在爬取第',page,'')
    
      try:
        url = 'https://s.taobao.com/search?q='+ quote(KEYWORD)
        browser.get(url)
    
        if page > 1:
          input = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#mainsrp-pager div.form > input')))
          submit = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,'#mainsrp-pager div.form > span.btn.J_Submit')))
          input.clear()
          input.send_keys(page)
          submit.click()
        wait.until(EC.text_to_be_present_in_element((By.CSS_SELECTOR,'#mainsrp-pager li.item.active > span'),str(page)))
        wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'.m-itemlist .items .item')))
        get_products()
      except TimeoutException:
        index_page(page)
    
    #解析商品列表
    
     
    
    def get_products():
      html = browser.page_source
      doc = pq(html)
      items = doc('#mainsrp-itemlist .items .item').items()
    
      for item in items:
        product = {
          'image' : item.find('.pic .img').attr('data-src'),
          'price' : item.find('.price').text(),
          'deal' : item.find('.dral-cnt').text(),
          'title' : item.find('.title').text(),
          'shop' : item.find('.shop').text(),
          'location' : item.find('.localtion').text()
        }
        print(product)
        save_to_mongo(product)
    
    #保存到MongoDB
    
    MONGO_URL = 'localhost'
    MONGO_DB = 'taobao'
    MONGO_COLLECTION = 'products'
    client = pymongo.MongoClient(host=MONGO_URL,port=27017)
    db = client[MONGO_DB]
    def save_to_mongo(result):
      try:
        if db[MONGO_COLLECTION.insert(result)]:
        print('存储成功')
      except Exception:
        print('存储失败')
    
    #main函数
    
    MAX_PAGE = 5
    
    def main():
      url = 'https://s.taobao.com/search?q=' + quote(KEYWORD)
      browser.get(url)
      wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#J_QRCodeImg')))
      time.sleep(10)
      for i in range(1,MAX_PAGE+1):
        index_page(i)
    
    main()
  • 相关阅读:
    ant的安装和配置
    jmeter3.x的jtx文件解析
    爬虫:网页里元素的xpath结构,scrapy不一定就找的到
    如何实现新浪微博功能:关注某个的发布信息,自动点赞和转发
    性能测试各个指标的含义
    python模块相关
    curl的用法
    第十八章 Python批量管理主机(paramiko、fabric与pexpect)
    死锁产生的原因和解锁的方法
    读写分离死锁解决方案、事务发布死锁解决方案、发布订阅死锁解决方案
  • 原文地址:https://www.cnblogs.com/liuxiaosong/p/10365972.html
Copyright © 2011-2022 走看看