淘宝的请求页面是非常复杂的,含有各种请求参数或加密参数,如果直接请求或是分析Ajax将会非常繁琐。Selenium是一个自动化测试工具,它可以驱动浏览器去完成各种操作,比如模拟点击、输入、下拉等各种功能,这样我们就只需要关心操作而不需要关心后台的具体请求过程。本文使用Selenium+Chrome/PhantomJS对淘宝美食信息进行抓取,并存储到MongoDB,使用的解析库是PyQuery。
(1)目标站点分析
首先我们分析一下淘宝站点,打开https://www.taobao.com/,在搜索框输入关键词“美食”,接着进行元素审查,分析原始请求的Response。可以看到,返回结果里有很多js,一些导航内容和css,没有任何的商品信息,其它的请求也比较复杂,包含了很多参数,原始请求的参数也比较多,并且一些参数我们很难直接看出来它的作用:
面对一个如此复杂的局面,我们很难通过分析Ajax请求得到想要的信息,所以选用Selenium实现。
(2)流程框架
1.搜索关键字
利用Selenium驱动浏览器搜索关键字,得到查询后的商品列表。
2.分析页码并翻页
得到商品页码数,模拟翻页,得到后续页面的商品列表。
3.分析提取商品内容
利用PyQuery分析源码,解析得到商品列表。
4.存储到MongoDB
将商品列表信息存储到数据库MongoDB。
(3)爬虫代码
# TB_meishi.py
import re
from selenium import webdriver
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
from pyquery import PyQuery as pq
from TB_meishi_config import *
import pymongo
client = pymongo.MongoClient(MONGO_URL, connect=False)
db = client[MONGO_DB]
browser = webdriver.Chrome()
wait = WebDriverWait(browser, 10)
def search():
try:
browser.get('https://www.taobao.com')
input = wait.until(
EC.presence_of_element_located((By.CSS_SELECTOR, "#q")) # 等待元素出现,CSS选择器
)
submit = wait.until(
EC.element_to_be_cli