python爬虫使用selenium爬取热门微博数据
完整代码
from selenium.webdriver import Chrome
import time
import csv
f = open("./热门微博.csv",mode='w',newline='',encoding='utf-8')
writer_obj = csv.writer(f)
url = 'https://weibo.com/'
web = Chrome()
web.get(url)
time.sleep(10)
web.find_element_by_xpath('//*[@id="pl_login_form"]/div/div[1]/div/a[1]').click()
web.find_element_by_xpath('//*[@id="loginname"]').send_keys('login_name')#用户名
web.find_element_by_xpath('//*[@id="pl_login_form"]/div/div[3]/div[2]/div/input').send_keys('login_password')#密码
time.sleep(2)
web.find_element_by_xpath('//*[@id="pl_login_form"]/div/div[3]/div[6]/a').click()
#这里等待15秒是因为有时候登陆需要扫码,15秒的时间需要人工扫码登陆,否则会报错找不到element
time.sleep(15)
web.find_element_by_xpath('//*[@id="v6_pl_leftnav_group"]/div[2]/div[1]/div[5]/div[1]/a/span[2]').click()
count = 0 #记录爬取记录条数
for i in range(5):
time.sleep(3)
detail_list = web.find_elements_by_xpath('//*[@id="Pl_Core_NewMixFeed__3"]/div/div[2]/div')
#print(detail_list)
for div in detail_list[:8]:
text_info_list = []
user_name = div.find_element_by_xpath('./div[1]/div[@class="WB_detail"]/div[@class="WB_info"]/a[1]').text #用户名
#print(user_name)
release_time = div.find_element_by_xpath('./div[1]/div[@class="WB_detail"]/div[@class="WB_from S_txt2"]/a[1]').text #发布时间
#print(release_time)
text_detail = div.find_element_by_xpath('./div[1]/div[@class="WB_detail"]/div[@class="WB_text W_f14"]').text #文本内容
#print(text_detail)
tran_num = div.find_element_by_xpath('./div[2]/div/ul/li[2]/a/span/span/span/em[2]').text #转发数
#print(tran_num)
comment_num = div.find_element_by_xpath('./div[2]/div/ul/li[3]/a/span/span/span/em[2]').text #评论数
#print(comment_num)
up_num = div.find_element_by_xpath('./div[2]/div/ul/li[4]/a/span/span/span/em[2]').text #点赞数
#print(up_num)
text_info_list.append(user_name)
text_info_list.append(release_time)
text_info_list.append(text_detail)
text_info_list.append(tran_num)
text_info_list.append(comment_num)
text_info_list.append(up_num)
writer_obj.writerow(text_info_list)
count += len(detail_list)
web.refresh()
print("已抓取{0}条数据".format(count))
编写时遇到的几个问题
xpath定位问题:
每一条微博的文本,发布时间等信息,其复制xpath路径有可能是不同的,例如:
第一条微博的文本在
‘//*[@id="pl_login_form"]/div/div[3]/div[1]’
,
但是第二条微博的文本就可能在
‘//*[@id="pl_login_form"]/div/div[4]/div[2]
。
我们注意到其中div的顺序改变了,因此在定位过程中,xpath路径需要在默认的格式上加属性class定位才准确。否则会出现爬取了一条以后,第二条就报错的情况。
页面刷新问题:
每次页面刷新或者切换以后,需要等待几秒time.sleep(2)
。如果页面没有完全加载出来而去进行xpath定位,就会报找不到element的错误。
缺点及待改进地方:
缺陷1:
由于热门微博的加载模式是向下滚动,我使用的Chrom浏览器不知道为什么最终没有实现自动向下滚动这个功能,因此我是用的方法是:将已经加载出来的数据爬取,之后进行页面刷新web.refresh()
,每刷新一次,爬取10条数据。
缺陷2:
有部分微博的文本被折叠,需要展开全文,我通过点击展开全文实现了展开,但是并没有实现将展开后的文本爬取下来这一功能,目前还没有想到其他解决办法。
爬虫小白,希望对大家有所帮助,欢迎大家在评论区交流。