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()