用selenium爬取淘宝商品

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']

每次测试都需要拿手机扫描二维码登陆,并且一直爬取第一页,无法进入下一页。

原文地址:https://www.cnblogs.com/chengchengaqin/p/9798957.html