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

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

程序员文章站 2022-05-09 21:13:44
...
#导入获取浏览器驱动的模块
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)