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

使用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

猜你喜欢

转载自blog.csdn.net/cjy1041403539/article/details/88996691