美文网首页潘森sibadapython爬虫实战数据分析
Python爬虫学习(十三)使用selenium爬取淘宝商品

Python爬虫学习(十三)使用selenium爬取淘宝商品

作者: 弃用中 | 来源:发表于2017-09-20 14:49 被阅读1556次

    在上文我们学习了一些selenium的知识,本节将使用selenium爬取淘宝商品——美食。

    效果大概就是这样:


    运行中
    目标

    打开:https://www.taobao.com,在输入框输入美食搜索后,将搜索到的美食信息,比如说名称,单价,地址,购买人数等信息爬取下来,并保存到MongoDB中。

    分析

    搜索关键字美食之后,如图



    有100页的内容,我们得抓取每一页的信息。观察其URL变化,好像没有发现什么规律。所以,不能按照之前的简单改变URL的方法爬取。

    那怎么办呢?
    这时,我们可以使用之前学过的selenium的知识,操作浏览器,让其不停的翻页,然后针对每一页,抓取信息。

    实践

    首先,对于美食而言,具有100个页面,但对于其他一些商品,可不一定。
    所以,我们得获取到共有多少页这个信息。

    def search_keyword(keyword="美食"):
        try:
            chrome.get('https://www.taobao.com/')
            inputbox = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#q')))
            button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,'#J_TSearchForm > div.search-button > button')))
            inputbox.clear()
            inputbox.send_keys(keyword)
            button.click()
    
            totalPages = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '#mainsrp-pager > div > div > div > div.total'))).text
            totalPages = re.search('(\d+)', totalPages).group(1)
            return totalPages
    
        except TimeoutException:
            return search_keyword(keyword)
    

    测试一下效果:



    正确得到了结果。

    接下来,我们想让浏览器自动翻页。大致思路如下:



    如图,每个页面都有一个输入页数的输入框,以及一个确定按钮,我们只需获取输入框元素,传递页数,点击确定按钮即可,而这一切,都可以用selenium实现。值得注意的是,每次一跳转到相应的页面时,有一个表项颜色不一样,如下图:



    表示处在哪个页面,如果这个表项与我们传递的页数一致的话,说明已经跳转成功了,下面附上代码:
    def next_page(page_number):
        try:
            inputbox = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '#mainsrp-pager > div > div > div > div.form > input')))
            button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '#mainsrp-pager > div > div > div > div.form > span.btn.J_Submit')))
            inputbox.clear()
            inputbox.send_keys(page_number)
            button.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)))
        except TimeoutException:
            next_page(page_number)
    

    测试一下:


    自动调转

    成功了!

    接下来,就是抓取页面所需的商品信息了,我们依旧使用BeautifulSoup。

    def parse_page():
        wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '#mainsrp-itemlist .items')))
        html = chrome.page_source
        soup = BeautifulSoup(html, 'lxml')
        items = soup.select('#mainsrp-itemlist .items .item')
        for item in items:
            product = {
                'name':item.select('.title')[0].get_text().strip(),
                'price':item.select('.g_price-highlight > strong')[0].get_text(),
                'deal-cnt':item.select('.deal-cnt')[0].get_text(),
                'shop':item.select('.shop')[0].get_text().strip(),
                'location':item.select('.location')[0].get_text()
            }
            print(product)
    

    运行一下,结果如图:


    商品信息

    最后,把product存入MongoDB即可:

    def save_to_DB(item):
        if (collection.insert(item)):
            print('保存成功!')
        else:
            print("保存失败!")
    

    整体运行一下代码:


    运行中

    查看MongoDB,内容已就位!


    MongoDB内容

    全部代码在:https://github.com/viljw/PythonSpider/blob/master/taobao.py

    以上。


    相关文章

      网友评论

      本文标题:Python爬虫学习(十三)使用selenium爬取淘宝商品

      本文链接:https://www.haomeiwen.com/subject/jcinsxtx.html