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

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

  • 相关阅读:
    shell脚本判断语句和循环语句
    shell脚本基础
    Linux防火墙(Firewalls)
    RAID磁盘阵列
    LVM逻辑卷创建管理
    vue与django结合使用
    Python使用pyecharts绘制cpu使用量折线图
    Centos8 网络配置静态IP
    Html表格处理
    django的教程相关
  • 原文地址:https://www.cnblogs.com/chengchengaqin/p/9798957.html
Copyright © 2020-2023  润新知