使用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
最后,关注一波吧,后面还会有更多的爬虫分享,不要错过哦
网友评论