美文网首页我爱编程
国家博物馆评论selenium爬取ajax网页

国家博物馆评论selenium爬取ajax网页

作者: 海街diary | 来源:发表于2018-02-04 21:54 被阅读43次

    1.简介

    今天实验室给了任务,爬取蚂蜂窝上的中国国家博物馆的评论。一开始,我以为简单的request加bs4就给解决了。没想到request后结果如下:竟然没有内容。

    评论.png

    没想到request后结果如下:竟然没有内容!!!查了资料后,得知这是ajax网页,决定用selenium爬取。


    request获取结果.png

    2.Selenium介绍

    Selenium是一个自动化测试模块,我这里不多介绍,如有兴趣,可以参考别人的资料学习。

    在爬虫中,主要用到webdriver子模块来模拟浏览器活动,这样既可以获取内容,也具有一定的反反爬虫效果(对,就是这么绕口!)

    下面来简单看下selenium如何使用

    # 初始化
    driver = webdriver.Safari()
    # 请求网页
    driver.get(url)
    # 最大化浏览器窗口
    driver.maximize_window()
    # 查找元素
    button = driver.find_element_by_xpath("//a[@title='后一页']")
    

    对于查找元素,我这里使用的是x_path方法,driver提供有其他方法(请自行百度),如果你不熟悉xpath,可以参考菜鸟教程

    查找到我们想要的元素后,可以通过text方法拿到我们想要的内容。由于需要自动翻页,通过找到对应的元素,使用click方法即可。

    # 获取评论
    data = driver.find_elements_by_xpath("//p[@class='rev-txt']")
    # 下一页按钮
    button = driver.find_element_by_xpath("//a[@title='后一页']")
    # 点击
    button.click()
    

    爬取过程中,我发现爬到第12页后就给我ban了。(猜想是因为一直点翻页...,所以我就加了如下内容,模仿得像人一样)。

    # 获取网页顶部大标题
    head = driver.find_element_by_xpath("//h1")
    head.click()
    time.sleep(random.uniform(1, 1.5))
    

    3.全部代码

    代码如下,我把爬取到的数据写入到了txt文件中。

    from selenium import webdriver
    import time
    import random
    
    file = open('国家博物馆.txt', "w")
    url = "http://www.mafengwo.cn/poi/34665.html"
    # 初始化
    driver = webdriver.Safari()
    # 请求网页
    driver.get(url)
    # 最大化浏览器窗口
    driver.maximize_window()
    # 查找元素
    button = driver.find_element_by_xpath("//a[@title='后一页']")
    count = 1
    while True:
        print("*" * 100)
        print("第{}页".format(count))
        print("*" * 100, "\n")
        data = driver.find_elements_by_xpath("//p[@class='rev-txt']")
        for content in data:
            file.writelines(content.text.strip("\n").strip() + "\n")
            print(content.text)
        try:
            count += 1
            button = driver.find_element_by_xpath("//a[@title='后一页']")
            button.click()
            if count > 5 and random.uniform(0, 1) > 0.5:
                time.sleep(1)
                head = driver.find_element_by_xpath("//h1")
                head.click()
                time.sleep(random.uniform(1, 1.5))
            time.sleep(random.uniform(5, 9))
        except Exception as e:
            print("\n\n", e)
            print("结束!")
            break
    

    结果:如下。进一步的,你可以利用这些评论,制作词云来进行意见分析,改善相关服务!


    国家博物馆.txt

    相关文章

      网友评论

        本文标题:国家博物馆评论selenium爬取ajax网页

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