使用python利器selenium工具模拟浏览器运行并爬取淘宝商品信息

#导入获取浏览器驱动的模块
from selenium import webdriver
#用于获取网页元素
from selenium.webdriver.common.by import By

#webdriver.wait库负责循环等待网页加载的时间
from selenium.webdriver.support.ui import WebDriverWait

#expected_conditions类负责等待网页加载的条件
from selenium.webdriver.support import expected_conditions as Ec

#导入超时的模块
from selenium.common.exceptions import TimeoutException

#分析网页
from bs4 import BeautifulSoup

#使用nosql数据库mongodb存取数据
import  pymongo
#获得谷歌浏览器的网站驱动
driver=webdriver.Chrome()
wait=WebDriverWait(driver,10)
list=[]

#商品搜索
def search(shop=None):
    print('开始搜索商品....')
    driver.get('http://www.taobao.com')
    try:
        #找到淘宝主页中的搜索框
        input=wait.until(
            Ec.presence_of_element_located((By.CSS_SELECTOR,'#q'))
        )
        #向搜索框中放入要查找的商品名称
        input.send_keys(shop)

        #找到淘宝主页中的搜索提交按钮
        submit=wait.until(
            Ec.element_to_be_clickable((By.CSS_SELECTOR,'div[class="search-button"]>button[class="btn-search tb-bg"]' ))
        )
        #点击按钮提交搜索
        submit.click()
        #调用下一个函数采集商品详细信息
        get_response()
        #如果超时,重新查找
    except TimeoutException:
        return search(shop)

#提取商品信息
def get_response():
    print('已经找到该商品')
    # wait.until(
    #
    #     Ec.presence_of_all_elements_located((By.CSS_SELECTOR,'#mainsrp-itemlist .items .item'))
    # )
    #获取跳转成功后的网页源代码
    html=driver.page_source
    #用bs4解析网页
    soup=BeautifulSoup(html,'lxml')
    #获取商品信息所在的div
    items=soup.find('div',class_='m-itemlist').find_all('div',class_='item')
    #遍历所有商品,获取详细信息
    for item in items:
        product={
            'image':item.find('a').find('img')['src'].strip(),
            'price':item.find('div',class_='price g_price g_price-highlight' ).text.strip(),
            'number':item.find('div',class_='deal-cnt').text[:-3].strip(),
            'title':item.find('div',class_='row row-2 title').text.strip(),
            'location':item.find('div',class_='location').text.strip()
        }
        print(product)
        list.append(product)
#分页功能
def next_page(page):
    print('当前是第{}'.format(page),'页')
    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()#清除输入框中到的内容
        input.send_keys(page)#输入框中放入内容
        submit.click()
        wait.until(
            #判断某个元素中的text是否包含了预期的字符串,也就是页数
            Ec.text_to_be_present_in_element((By.CSS_SELECTOR,'#mainsrp-pager > div > div > div > ul > li.item.active > span'),str(page))
        )
        get_response()
    except TimeoutException:
        return next_page(page)

# 存入到mongodb数据库中
def save_into_mongo(list):
    #创建数据库连接
    client=pymongo.MongoClient('localhost')
    #创建数据库
    db=client['taobao']
    #创建数据表
    content=db['info']
    #数据插入到数据表中
    content.insert(list)
if __name__=='__main__':
    shop=input('输入名字:')
    search(shop)
    for i in range(2,5):
        next_page(i)
    # save_into_mongo(list)

猜你喜欢

转载自blog.csdn.net/just_so_so_fnc/article/details/77915811