1. 目标
利用 Selenium抓取淘宝商品并用 pyquery解析得到商品的图片 、名称 、 价格、购买人数、店铺名称和店铺所在地信息,并将其保存到 MongoDB。
2.准备工作
Chrome 浏览器并配置好了 ChromeDriver;另外,还需要正确安装 Python 的 Selenium库;最后,还对接了 PhantomJS和 Firefox,请确保安装好 PhantomJS和 Firefox并配置好了 GeckoDriver。
3.分析接口
无法直接发现Ajax接口的参数(_ksTS,rn)的规律,所以用selenium来模拟浏览器,不用关注这些接口函数。
4.页面分析:
包含商品的基本信息,包括商品图片、名称、 价格、购买人数、店铺名称和店铺所在地。
抓取入口就是淘宝的搜索’页面,这个链接可以通过直接构造参数访问。
有一个分页导航,其中既包括前 5页的链接 ,也包括下一页的链接 ,同时还有一个输入任意页码跳转的链接
taobao.py
1 from selenium import webdriver 2 from selenium.webdriver.support.wait import WebDriverWait 3 from selenium.webdriver.support import expected_conditions as EC 4 from urllib.parse import quote 5 from selenium.webdriver.common.by import By 6 from selenium.common.exceptions import TimeoutException 7 import pymongo 8 from pyquery import PyQuery as pq 9 from config import * 10 11 12 browser = webdriver.Firefox() 13 #browser = webdriver.PhantomJS(service_args=SERVICE_ARGS) 14 15 '''chrome_options = webdriver.ChromeOptions() 16 chrome_options.add_argument('--headless') 17 browser = webdriver.Chrome(chrome_options=chrome_options) 18 ''' 19 20 wait = WebDriverWait(browser, 10) 21 client = pymongo.MongoClient(MONGO_URL) 22 db = client[MONGO_DB] 23 24 ''' 25 MONGO_URL = 'localhost' 26 MONGO_DB = 'taobao' 27 MONGO_COLLECTION = 'products' 28 MAX_PAGE = 100 29 client = pymongo.MongoClient(MONGO_URL) 30 db = client[MONGO_DB] 31 32 KEYWORD = 'iPad' 33 ''' 34 def index_page(page): 35 ''' 36 抓取索引页 37 :param page: 38 :return: 39 ''' 40 print("正在爬取第 ", page, "页") 41 try: 42 url = 'https://s.taobao.com/search?q=' + quote(KEYWORD) 43 browser.get(url) 44 if page > 1:#判断页码 45 input = wait.until( 46 EC.presence_of_element_located((By.CSS_SELECTOR, '#mainsrp-pager div.form > input')) 47 ) 48 submit = wait.until( 49 EC.presence_of_element_located((By.CSS_SELECTOR, '#mainsrp-pager div.form > span.btn J_Submit')) 50 ) 51 input.clear() 52 input.send_keys(page) 53 submit.click() 54 wait.until( 55 EC.text_to_be_present_in_element((By.CSS_SELECTOR, '#mainsrp-pager li.item.active > span'), str(page)) 56 ) 57 wait.until( 58 EC.presence_of_element_located((By.CSS_SELECTOR, '.m-itemlist .items .item')) 59 #这个选择器对应的页面内容就是每个商品的信息块 60 ) 61 get_products() 62 except TimeoutException: 63 index_page(page) 64 65 def get_products(): 66 ''' 67 提取商品数据 68 :return: 69 ''' 70 html = browser.page_source#属性获取页码的源代码 71 doc = pq(html)#构造了 PyQuery解析对象 72 items = doc('#mainsrp-itemlist .items .item').items() 73 for item in items: 74 #每次循环把它赋值为item变量, 75 #每个item变量都是一个PyQuery对象 76 product = { 77 'image': item.find('.pic .img').attr('data-src'), 78 'price': item.find('.price').text(), 79 'deal': item.find('.deal-cnt').text(), 80 'title': item.find('.title').text(), 81 'shop': item.find('.shop').text(), 82 'location': item.find('.location').text() 83 } 84 print(product) 85 save_to_mongo(product) 86 87 def save_to_mongo(result): 88 ''' 89 保存至DB 90 :param result: 91 :return: 92 ''' 93 try: 94 if db[MONGO_COLLECTION].insert(result): 95 print('存储到MongoDB成功') 96 except Exception: 97 print('存储到MongoDB失败') 98 99 100 def main(): 101 """ 102 遍历每一页 103 """ 104 for i in range(1, MAX_PAGE + 1): 105 index_page(i) 106 browser.close() 107 108 if __name__ == '__main__': 109 main()
config.py
1 MONGO_URL = 'localhost' 2 MONGO_DB = 'taobao' 3 MONGO_COLLECTION = 'products' 4 5 KEYWORD = 'ipad' 6 7 MAX_PAGE = 100 8 9 SERVICE_ARGS = ['--load-images=false', '--disk-cache=true']
每次测试都需要拿手机扫描二维码登陆,并且一直爬取第一页,无法进入下一页。