python+selenium爬虫,使用selenium爬取热门微博数据

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
有部分微博的文本被折叠,需要展开全文,我通过点击展开全文实现了展开,但是并没有实现将展开后的文本爬取下来这一功能,目前还没有想到其他解决办法。

爬虫小白,希望对大家有所帮助,欢迎大家在评论区交流。
python+selenium爬虫,使用selenium爬取热门微博数据_第1张图片

你可能感兴趣的:(爬虫,python,selenium,定位)