python实战

发布时间:2019-09-11 07:44:35编辑:auto阅读(1588)

    这个实战内容包含,selenium、pyquery、re、pymongo
    pymongo安装去这里:https://blog.51cto.com/13155409/2125020
    实战抓取淘宝美食信息并且存入MongoDB数据库中

    实现源码如下:

    import pymongo
    from selenium import webdriver
    import re
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    from pyquery import PyQuery as pq
    
    browser = webdriver.Chrome()         #导入浏览器驱动对象
    wait = WebDriverWait(browser, 10)    #设置浏览器等待时间
    
    client = pymongo.MongoClient('192.168.10.15')   #创建一个客户端对象
    db = client['taobao']   #设置数据库名,会自动建立
    
    def search():
            '''
            函数主要功能是:通过webdriver.Chrome打开淘宝网页,并对“美食”这个关键词进行搜索。
            :return: 返回网页的响应码
            '''
            browser.get('https://www.taobao.com')
            input = wait.until(
                    EC.presence_of_element_located((By.CSS_SELECTOR,'#q'))
            )
            submit =wait.until(
                    EC.element_to_be_clickable((By.CSS_SELECTOR, '#J_TSearchForm > div.search-button > button'))
            )
            input.send_keys('美食')   #输入搜索的关键词
            submit.click()
            return browser.page_source
    
    def trun_page(page):
            '''
            该函数的功能是:实现翻页
            :param page: 通过search页面搜索到的内容页数,返回到主函数,然后通过主函数传递到此处
            :return: 已经获得了第一页的内容了,第二页开始就从这里开始反复调用
            '''
            index = 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'))
            )
            index.clear()   #清除输入框的内容
            index.send_keys(page)   #输入page页码
            submit.click()   #点击跳转的按钮
            get_products(browser.page_source)
    
    def get_products(html):
            wait.until(
                    EC.presence_of_element_located((By.CSS_SELECTOR,'#mainsrp-itemlist .items .item'))
                                 )
            html = pq(html)    #使用pyquery解析html代码
            doc = html('#mainsrp-itemlist .items .item').items()  #通过item产生一个generator类型,使用for循环遍历
            for item in doc:
                    product={
                            "picture": item.find('.pic .img').attr('src'),
                            'name': item.find('.row.title').text().replace('\n',''),
                            'price':item.find('.price').text().replace('\n',''),
                            'deal':item.find('.deal-cnt').text()[:-3],
                            'location':item.find('.location').text()
                    }
                    print(product)
                    #save_to_mongodb(product)
            return(html)
    
    def save_to_mongodb(result):
            '''
            这个函数主要用于把每页的信息写入到MongoDB数据库中
            '''
            try:
                    if db['product'].insert(result):   #创建一个product的集合,类似于mysql中的表,然后插入数据
                                    print('存储到MongoDB成功')
            except Exception:
                    print('存储到MongoDB出错')
    
    def main():         #定义主函数
            # 调用搜索函数 (对关键词搜索,本文中是以“美食”在淘宝搜索)
            html = search()
    
            # 调用该函用以获取单页的所有产品的信息
            html = get_products(html)
    
            #通过上面get_products()返回经过pyquery解析后的html代码,用于获取总页数
            total = html('.total').text()
            total = int(re.search('(\d+)',total).group(1))
            print(total)  #打印出总页数
    
            #对页数进行循环,这里是从 2 开始,因为前面已经获取一次了
            for page in range(2,total):
                    #下面函数主要用于网页翻页
                    trun_page(page)
    
    if __name__ == "__main__":
            main()

关键字