美文网首页大数据 爬虫Python AI Sql
微博任意关键词爬虫——使用selenium模拟浏览器

微博任意关键词爬虫——使用selenium模拟浏览器

作者: 老白和他的爬虫 | 来源:发表于2019-04-03 14:42 被阅读2次

    使用selenium,我们很快就可以做到这一点——“在浏览器上能看到什么,我们就能采集到什么数据”,selenium可以用来模拟浏览器的行为,让代码自动操控你的浏览器,抓取数据

    欢迎关注公众号:老白和他的爬虫

    1.初识selenium

    简单通过一些基础操作来熟悉一下selenium,在此之前你需要下载一个谷歌驱动,我帮你下载好了,公众号回复“20190403”获取驱动及今日份代码。

    打开浏览器,并打开指定网址

    from selenium import webdriver
    
    driver = webdriver.Chrome('/Users/chenjianyao/Desktop/python/weibo_keyword/chromedriver') #存放驱动的位置
    driver.set_window_size(1400, 800) #指定打开浏览器的大小
    driver.get("https://www.baidu.com") #输入你要打开的网址
    

    通过检查发现,输入框的id是kw


    image.png

    所以我们可以通过这个id像浏览器输入文字,我们尝试百度下胡歌

    search = "胡歌"
    elem = driver.find_element_by_xpath("//*[@id='kw']");
    elem.send_keys(search)
    

    同样我们得到“百度一下”这个按钮的id,来点击它

    from selenium.webdriver.common.keys import Keys
    elem = driver.find_element_by_xpath("//*[@id='su']");
    elem.send_keys(Keys.ENTER)
    

    我们在爬取动态页面时,经常面临一个问题,就是滚动即显示,能懂我的意思吧,所以我们来模拟下滚动页面,接着上面的代码,我们定义滚动的函数

    from selenium import webdriver
    from selenium.webdriver.common.keys import Keys
    import time
    def Transfer_Clicks(browser):
        try:
            browser.execute_script("window.scrollBy(0,document.body.scrollHeight)", "")
        except:
            pass
        return "Transfer successfully \n"
    if __name__ == '__main__':
        driver = webdriver.Chrome('/Users/chenjianyao/Desktop/python/weibo_keyword/chromedriver')
        driver.set_window_size(1400, 800)
        driver.get("https://www.baidu.com")
        search = "胡歌"
        elem = driver.find_element_by_xpath("//*[@id='kw']");
        elem.send_keys(search)
        elem = driver.find_element_by_xpath("//*[@id='su']");
        elem.send_keys(Keys.ENTER)
        n=0
        while True:
            n = n + 1
            Transfer_Clicks(driver)
            time.sleep(1)
            print("成功滚动第%d次" % n)
            if  n > 5:        
                break
    

    2.任意关键词爬取微博

    上面带着你熟悉了一下selenium如何使用,下面就是使用selenium来写的微博关键词爬虫,也是我这几天的劳动成果,我自己试了下,效果还可以,我先直接上代码,你有需要的话直接拿去使用。

    import time
    import xlrd
    import xlwt
    from xlutils.copy import copy
    from selenium import webdriver
    from selenium.webdriver.common.keys import Keys
    
    # 定义一个滚动函数
    def Transfer_Clicks(browser):
        try:
            browser.execute_script("window.scrollBy(0,document.body.scrollHeight)", "")
        except:
            pass
        return "Transfer successfully \n"
    
    def isPresent():
        temp =1
        try: 
            elems = driver.find_elements_by_css_selector('div.line-around.layout-box.mod-pagination > a:nth-child(2) > div > select > option')
        except:
            temp =0
        return temp
    
    
    def write_excel_xls(path, sheet_name, value):
        index = len(value)  # 获取需要写入数据的行数
        workbook = xlwt.Workbook()  # 新建一个工作簿
        sheet = workbook.add_sheet(sheet_name)  # 在工作簿中新建一个表格
        for i in range(0, index):
            for j in range(0, len(value[i])):
                sheet.write(i, j, value[i][j])  # 像表格中写入数据(对应的行和列)
        workbook.save(path)  # 保存工作簿
        print("xls格式表格写入数据成功!")
     
     
    def write_excel_xls_append(path, value):
        index = len(value)  # 获取需要写入数据的行数
        workbook = xlrd.open_workbook(path)  # 打开工作簿
        sheets = workbook.sheet_names()  # 获取工作簿中的所有表格
        worksheet = workbook.sheet_by_name(sheets[0])  # 获取工作簿中所有表格中的的第一个表格
        rows_old = worksheet.nrows  # 获取表格中已存在的数据的行数
        new_workbook = copy(workbook)  # 将xlrd对象拷贝转化为xlwt对象
        new_worksheet = new_workbook.get_sheet(0)  # 获取转化后工作簿中的第一个表格
        for i in range(0, index):
            for j in range(0, len(value[i])):
                new_worksheet.write(i+rows_old, j, value[i][j])  # 追加写入数据,注意是从i+rows_old行开始写入
        new_workbook.save(path)  # 保存工作簿
        print("xls格式表格【追加】写入数据成功!")
     
     
    def read_excel_xls(path):
        workbook = xlrd.open_workbook(path)  # 打开工作簿
        sheets = workbook.sheet_names()  # 获取工作簿中的所有表格
        worksheet = workbook.sheet_by_name(sheets[0])  # 获取工作簿中所有表格中的的第一个表格
        for i in range(0, worksheet.nrows):
            for j in range(0, worksheet.ncols):
                print(worksheet.cell_value(i, j), "\t", end="")  # 逐行逐列读取数据
            print()
    def spider(username,password,driver,book_name_xls,sheet_name_xls,keywords,maxWeibo):
             
        driver = webdriver.Chrome('/Users/chenjianyao/Desktop/python/weibo_keyword/chromedriver')
        driver.set_window_size(1400, 800)
        driver.get("https://passport.weibo.cn/signin/login?entry=mweibo&res=wel&wm=3349&r=https%3A%2F%2Fm.weibo.cn%2F")
        #cookie1 = driver.get_cookies()
        #print (cookie1)
        time.sleep(2)
        elem = driver.find_element_by_xpath("//*[@id='loginName']");
        elem.send_keys(username)
        elem = driver.find_element_by_xpath("//*[@id='loginPassword']");
        elem.send_keys(password)
        elem = driver.find_element_by_xpath("//*[@id='loginAction']");
        elem.send_keys(Keys.ENTER)
        #cookie2 = driver.get_cookies()
        #print(cookie2)
        #获取信息
        while 1:  # 循环条件为1必定成立
            result = isPresent()
            print ('判断页面1成功 0失败  结果是=%d' % result )
            if result == 1:
                elems = driver.find_elements_by_css_selector('div.line-around.layout-box.mod-pagination > a:nth-child(2) > div > select > option')
                #return elems #如果封装函数,返回页面
                break
            else:
                print ('页面还没加载出来呢')
                time.sleep(20)
        time.sleep(2)
        elem = driver.find_element_by_xpath("//*[@class='m-text-cut']").click();
        time.sleep(2)
        elem = driver.find_element_by_xpath("//*[@type='search']");
        elem.send_keys(keywords)
        elem.send_keys(Keys.ENTER) 
        #handleScroll() 
        time.sleep(3)
        before = 0 
        after = 0
        n = 0 
        while True:
            before = after
            Transfer_Clicks(driver)
            time.sleep(2)
            elems = driver.find_elements_by_css_selector('div.card.m-panel.card9')
            print("当前包含微博最大数量:%d,n当前的值为::%d, n值到30说明已无法解析出新的微博" % (len(elems),n))
            after = len(elems)
            if after > before:
                n = 0
            if after == before:        
                n = n + 1
            if n == 30:
                print("当前关键词最大微博数为:%d" % after)
                break
            if len(elems)>maxWeibo:
                break
        
        value_title = [["rid", "用户名称", "微博等级", "微博内容", "微博转发量","微博评论量","微博点赞","发布时间","搜索关键词"],]
        write_excel_xls(book_name_xls, sheet_name_xls, value_title)
        rid = 0
        for elem in elems:
            rid = rid + 1
            #用户名
            weibo_username = elem.find_elements_by_css_selector('h3.m-text-cut')[0].text
            weibo_userlevel = "普通用户"
            #微博等级
            try: 
                weibo_userlevel_color_class = elem.find_elements_by_css_selector("i.m-icon")[0].get_attribute("class").replace("m-icon ","")
                if weibo_userlevel_color_class == "m-icon-yellowv":
                    weibo_userlevel = "黄v"
                if weibo_userlevel_color_class == "m-icon-bluev":
                    weibo_userlevel = "蓝v"
                if weibo_userlevel_color_class == "m-icon-goldv-static":
                    weibo_userlevel = "金v"
                if weibo_userlevel_color_class == "m-icon-club":
                    weibo_userlevel = "微博达人"     
            except:
                weibo_userlevel = "普通用户"
            #微博内容
            #分为有全文和无全文
            weibo_content = elem.find_elements_by_css_selector('div.weibo-text')[0].text
            shares = elem.find_elements_by_css_selector('i.m-font.m-font-forward + h4')[0].text
            comments = elem.find_elements_by_css_selector('i.m-font.m-font-comment + h4')[0].text
            likes = elem.find_elements_by_css_selector('i.m-icon.m-icon-like + h4')[0].text
            #发布时间
            weibo_time = elem.find_elements_by_css_selector('span.time')[0].text
            print("用户名:"+ weibo_username + "|"
                  "微博等级:"+ weibo_userlevel + "|"
                  "微博内容:"+ weibo_content + "|"
                  "转发:"+ shares + "|"
                  "评论数:"+ comments + "|"
                  "点赞数:"+ likes + "|"
                  "发布时间:"+ weibo_time + "|")
            value1 = [[rid, weibo_username, weibo_userlevel,weibo_content, shares,comments,likes,weibo_time,keywords],]
            write_excel_xls_append(book_name_xls, value1)
    
    if __name__ == '__main__':
        username = "" #你的微博登录名
        password = "" #你的密码
        driver = webdriver.Chrome('/Users/chenjianyao/Desktop/python/weibo_keyword/chromedriver')#你的chromedriver的地址
        book_name_xls = "/Users/chenjianyao/Desktop/weibo.xls" #填写你想存放excel的路径,没有文件会自动创建
        sheet_name_xls = '微博数据' #sheet表名
        maxWeibo = 10000 #设置最多多少条微博,如果未达到最大微博数量可以爬取当前已解析的微博数量
        keywords = "#NBA#" #输入你想要的关键字,建议有超话的话加上##,如果结果较少,不加#
        spider(username,password,driver,book_name_xls,sheet_name_xls,keywords,maxWeibo)
     
    

    今天就不详细讲解这个爬虫的编写过程了,后面我会写一篇文章来讲解编写过程,我先告诉你怎么使用。

        username = "" #你的微博登录名
        password = "" #你的密码
        driver = webdriver.Chrome('/Users/Desktop/python/weibo_keyword/chromedriver')#你的chromedriver的地址
    

    username和password就是你的微博账号和密码,driver = webdriver.Chrome()填写的是你电脑上谷歌浏览器驱动的地址,也就是在后台回复“20190403”得到的

        book_name_xls = "/Users/Desktop/weibo.xls" #填写你想存放excel的路径,没有文件会自动创建
        sheet_name_xls = '微博数据' #sheet表名
        maxWeibo = 10000 #设置最多多少条微博,如果未达到最大微博数量可以爬取当前已解析的微博数量
        keywords = "#胡歌#" #输入你想要的关键字,建议有超话的话加上##,如果结果较少,不加#
    

    book_name_xls存放保存数据的excel表格,这个只要路径正确即使没有对应文件也会自动创建的,sheet_name_xls创建sheet表格名称,maxWeibo填写你的最大爬取微博数量,但是有可能爬不到你想要的数量,爬到浏览器再也解析不出来新的微博信息它就停止了,keywords就是你想爬取的关键词信息,你可以选择把它设置为话题,例如“#胡歌#”,也可以就是正常的“胡歌”,这个你可以自己定,但是一般话题来讲微博数量多一点。

    今天分享的这个爬虫也有写的不好的地方,欢迎你在后台留言,我会及时改进的,后面会针对这个版本再进行,尽量让它智能化。还有你在运行的过程中,要保证网速一定要好,在浏览器运行的时候,尽量不要再用浏览器做其他的事了。

    我自己运行这个爬虫后的结果


    image.png

    最后,关注一波吧,后面还会有更多的爬虫分享,不要错过哦

    image.png

    相关文章

      网友评论

        本文标题:微博任意关键词爬虫——使用selenium模拟浏览器

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