有待修改

https://blog.csdn.net/baidu_22713341/article/details/48678961    Beautifulsoup()

# MONGO_URL = 'localhost'
# MONGO_DB = 'taobao'
# MONGO_TABLE = 'clothing'
SEARCH_WORD = '大衣'  #搜索关键词
MONGO_URL = 'localhost'  # 指定本机的mongodb数据库
MONGO_DB = 'taobao'  # 指定数据库名称为taobao
MONGO_TABLE = 'meishi'  # 指定存储表名称为meishi
# author: "xian"
# date: 2018/5/4
import re  # 导入re库
from selenium import webdriver  # 导入selenium库
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  # 预定义条件供WebDriverWait调用
from pyquery import PyQuery as pq  # 导入pyquery解析网页源代码
import pymongo  # 导入pymongo库用于操作mongddb数据库
from Seleniumtaobao.config import *


client = pymongo.MongoClient(MONGO_URL)  # 创建一个连接
db = client[MONGO_DB]  # 访问一个名为taobao的数据库并赋值给本地变量db

browser = webdriver.Chrome()  # 驱动Chrome浏览器
wait = WebDriverWait(browser, 10)  # 设置等待时间为10s并赋值给wait变量


# 定义一个搜索函数search
def search():
    # 异常处理模块 try ... except...
    try:
        browser.get('https://www.taobao.com')  # 请求淘宝首页
        # 显示选择具体见官网:http://selenium-python-zh.readthedocs.io/en/latest/waits.html#id2
        # 以下用CSS选择器设定等待条件
        input = wait.until(
            EC.presence_of_element_located((By.CSS_SELECTOR, '#q'))  # EC.*** ,***为加载条件 具体小伙伴们参见官方文档即可
        )
        submit = wait.until(
            EC.element_to_be_clickable((By.CSS_SELECTOR, '#J_TSearchForm > div.search-button > button')))
        # 用CSS选择器(打开chrome找到输入框右键审查元素右击copy css selector 复制即可 )
        # 设定Action Chains即动作链
        input.send_keys('SEARCH_WORD')  # 相当于输入关键字:美食
        submit.click()  # 相当于模拟点击动作
        total = wait.until(
            EC.presence_of_element_located((By.CSS_SELECTOR, '#mainsrp-pager > div > div > div > div.total')))  # 加载全部页面
        get_products()  # 执行具体商品解析函数
        return total.text  # 获取文本内容
    except TimeoutException:  # 引入timeout异常
        return search()  # 如果超时将再请求一次


# 执行翻页操作函数
def next_page(page_number):
    try:
        input = wait.until(
            EC.presence_of_element_located((By.CSS_SELECTOR, '#mainsrp-pager > div > div > div > div.form > input')))
        submit = wait.until(EC.element_to_be_clickable(
            (By.CSS_SELECTOR, '#mainsrp-pager > div > div > div > div.form > span.btn.J_Submit')))
        input.clear()  # 清空框中内容,方便重新填入 (比如你先填了2 就翻到第二页,现在我当然先清空内容,再填入3才能进入第3页)
        input.send_keys(page_number)
        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(page_number)))
        get_products()
    except TimeoutException:
        next_page(page_number)


# 商品详情解析函数
def get_products():
    wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '#mainsrp-itemlist .items .item')))
    html = browser.page_source
    doc = pq(html)
    items = doc('#mainsrp-itemlist .items .item').items()  # 参见官网http://pyquery.readthedocs.io/en/latest/api.html
    for item in items:
        # 以下使用pyquery选择器选择元素
        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('.shop').text(),
            'location': item.find('.location').text(),
        }
        print(product)
        save_to_mongo(product)


# 存储到mongodb数据库
def save_to_mongo(result):
    try:
        if db[MONGO_TABLE].insert(result):
            print('存储到mongodb成功!', result)
    except Exception:
        print('存储到mongodb失败!', result)


# 主函数
def main():
    total = search()  # 打印结果为:共100页
    total = int(re.compile('(\d+)').search(total).group(1))  # 使用正则表达式抽取其中的数字100 int()将字符串转为整数
    for i in range(2, total + 1):
        next_page(i)
    browser.close()


# 该函数的作为为只在当前py执行,方便调试
if __name__ == '__main__':
    main()

淘宝上的店铺分布主要集中在东部沿海区域。

猜你喜欢

转载自blog.csdn.net/OYY_90/article/details/83107063