欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

淘宝商品页爬取

程序员文章站 2022-04-26 15:41:09
...

之前的脚本很基础,都是针对于静态网页的爬取。

本文将以淘宝为例,运用selenium+chrome(headless)模拟浏览器,解决JS渲染问题,爬取商品信息并存储至MongoDB库中。(最新版selenium中已无法使用phatomjs,所以使用chrome的无头模式替代之。)

IDE推荐使用Pycharm,安装教程Pycharm

安装MongoDB,安装教程MongDB 。

安装ROBOMongo。

使用模块:selenium、chromedriver、re、pyquery、pymongo

思路:模拟浏览器操作,抓取渲染后的网页数据,并存储至数据库中。

关于selenium的教程网上很多,帮助文档http://selenium-python.readthedocs.io/

            淘宝商品页爬取

from pyquery import PyQuery as pq
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import re
import pymongo
#MongoDB配置
client = pymongo.MongoClient()
db = client['TAOBAO']
TAOBAO = db['JIXIANG']
#selenium配置
opt = webdriver.ChromeOptions()
opt.set_headless()
browser = webdriver.Chrome(options = opt)
url = 'https://www.taobao.com/'
wait = WebDriverWait(browser, 10)

#获得商品搜索页第一页
def search_item(kyword):
    browser.get(url)
    #搜索输入框并等待加载成功
    search_input = wait.until(
        EC.presence_of_element_located((By.CSS_SELECTOR, "#q"))
    )
    #搜索按钮并等待可成功点击
    search_submit = wait.until(
        EC.element_to_be_clickable((By.CSS_SELECTOR, "#J_TSearchForm > div.search-button > button"))
    )
    #传入搜索关键词
    search_input.send_keys(kyword)
    #点击搜索按钮
    search_submit.click()
    #返回总页数
    totalpage = browser.find_element_by_xpath('//*[@id="mainsrp-pager"]/div/div/div/div[1]')
    #解析器
    paraser()
    return totalpage.text

 #翻页
def next_page(num):
    #翻页输入框并等待加载成功
    nextpage_input = wait.until(
        EC.presence_of_element_located((By.CSS_SELECTOR, "#mainsrp-pager > div > div > div > div.form > input"))
    )
    #翻页按钮并等待加载成功
    nextpage_submit = wait.until(
        EC.element_to_be_clickable((By.CSS_SELECTOR, "#mainsrp-pager > div > div > div > div.form > span.btn.J_Submit"))
    )
    #解析器
    paraser()
    #清空输入内容
    nextpage_input.clear()
    #传入翻页页数
    nextpage_input.send_keys(num)
    #点击翻页按钮
    nextpage_submit.click()
    #确认当前页数为输入翻页页数
    wait.until(
        EC.text_to_be_present_in_element((By.CSS_SELECTOR, "#mainsrp-pager > div > div > div > ul > li.item.active > span"
                                          ), str(num))
    )

#解析器
def paraser():
    #商品页内容加载完毕
    wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, '#mainsrp-itemlist .items .item')))
    html = browser.page_source
    #使用PyQuery清洗内容
    doc = pq(html)
    items = doc('#mainsrp-itemlist .items .item').items()
    for item in items:
        product = {
            'image':item.find('.pic .img').attr('src'),
            'price':item.find('.price').text().replace('\n',''),
            'deal':item.find('.deal-cnt').text()[:-3],
            'title':item.find('.title').text().replace('\n',''),
            'shop':item.find('.location').text()
        }
        print(product)
        # 保存器
        saver(product)

# 保存器
def saver(result):
    # 保存至MongoDB数据库
    if TAOBAO.insert(result):
        print('SUCCESS', result)

def main():
    input('输入商品名称:')
    totalpage = search_item()
    totalpage = int(re.compile('(\d+)').search(totalpage).group(1))
    for i in range(2,totalpage):
        next_page(i)

if __name__  == '__main__':
    main()