欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

python selenium学习之新浪微博

程序员文章站 2023-12-22 10:40:34
...

python selenium学习之新浪微博

运用知识点

  1. 模拟登录
  2. 模拟鼠标事件
  3. 获取页面节点,解析

开始模拟登录:
第一步:实例化selenium对象

from selenium import webdriver
from selenium.webdriver import ChromeOptions

option = ChromeOptions()
option.add_experimental_option('excludeSwitches', ['enable-automation']) #规避检测
bro = webdriver.Chrome(options=option)

第二步:定位到账号密码和登录按钮,并输入账号密码点击登录按钮
利用谷歌浏览器F12开发者工具,很容易定位到
python selenium学习之新浪微博
同理定位到密码和登录标签,然后输入账号密码并点击登录按钮

bro.get('https://weibo.com/')
bro.maximize_window()
sleep(1)
bro.find_element_by_id('loginname').send_keys('XXXXXX')#账号
sleep(1)
bro.find_element_by_xpath('//*[@id="pl_login_form"]/div/div[3]/div[2]/div/input').send_keys('XXXXX')#密码
sleep(0.5)
bro.find_element_by_xpath('//*[@id="pl_login_form"]/div/div[3]/div[6]/a').click()#登录

第三步:
打开新浪微博准备登录,发现不管密码正不正确都会跳转到手机扫码登录的页面
python selenium学习之新浪微博
这里有很多方法可是太复杂,我们直接让程序在这里停几秒,拿出手机扫码就行这样最简单(扫码之后让页面刷新一下)

sleep(10)
bro.refresh() #刷新页面

到这里就登录成功了
第四步:定位到搜索框直接搜索要找的博主名
python selenium学习之新浪微博

#这个搜索框里本来是有内容的所以要先点击一下
bro.find_element_by_xpath('//*[@id="plc_top"]/div/div/div[2]/input').click()
bro.find_element_by_xpath('//*[@id="plc_top"]/div/div/div[2]/input').send_keys('XXXXX')# 博主名
bro.find_element_by_xpath('//*[@id="plc_top"]/div/div/div[2]/input').send_keys(Keys.ENTER)# 输入回车

会来到这个页面
python selenium学习之新浪微博
同样定位到昵称的链接点击一下就行了,但是这里它就会新开一个窗口,所以要切换窗口视角到窗口

bro.find_element_by_xpath('//*[@id="pl_feedlist_index"]/div[1]/div[1]/div/div[1]/a').click()
bro.switch_to.window(bro.window_handles[-1])#切换窗口视角

定位到他主页的“他的相册”并点击就可以来到照片墙了,这里默认只显示一点点,需要模拟鼠标拖动往下的动作,拿到所有图片。
分析页面找到图片链接都在这里,可以用它的class属性定位到
python selenium学习之新浪微博

# 定位到他主页的“他的相册”并点击
bro.find_element_by_xpath('//*[@id="Pl_Official_Nav__2"]/div/div/table//tr/td[2]/a').click()
sleep(3)
for i in range(120):  #模拟鼠标拖动往下的动作
    sleep(0.5)
    bro.execute_script('window.scrollBy(0,300)', '')#模拟鼠标拖动往下的动作
sleep(1)
srcs = bro.find_elements_by_class_name('photo_pict') #等待加载完毕 拿到所有图片链接的节点列表

遍历节点列表拿到所有的图片链接

for src in srcs:
    gugu = src.get_attribute('src'

这里拿到的图片链接都是小图:https://wxt.sinaimg.cn/thumb300/a89b2d04gy1gl5a9m8bblj20go0go3yv.jpg?tags=%5B%5D
随便点开照片墙的一张图片等到大图,右键点击复制图片地址:https://wx1.sinaimg.cn/mw1024/a89b2d04gy1gl5a9m8bblj20go0go3yv.jpg
对比发现只有”thumb300“ 和”mw1024“不同,对链接中的thumb300经行替换就行了

gugugu = gugu.replace('thumb300', 'mw1024')

第五步:设置保存路径,requests.get().content拿到二进制数据并保存就ok了
整体代码:

j = 1 #计数
for src in srcs:
    gugu = src.get_attribute('src') #拿到图片链接
    gugugu = gugu.replace('thumb300', 'mw1024') #替换链接中的字符,得到大图链接
    name = gugugu.split('/')[-1][13:20] # 随便起个图片名
    path = './微博图片/' + name + '.jpg' #保存路径, 保存到当前目录下的微博图片文件夹中
    re = requests.get(url=gugugu, headers=headers).content #拿到图片二进制数据
    with open(path,'wb')as fp: # 持久化存储
        fp.write(re)
    print('保存成功{}张'.format(str(j)))
    j += 1 #记录一共搞到了多少照片

print('全部完成')

这就全部完成了。视频什么的也是一样的,在第四步的时候找到视频对应的节点点击,然后模拟鼠标下拉加载出所有视频后分析视频链接的节点,拿到节点里面的链接用requests.get().content拿到数据并保存就行了。

注意所有定位节点操作之前要么time.sleep()几秒,要么用显示等待,不然会出现定位不到节点的情况

(没错用的是王大娘的微博作实例)

上一篇:

下一篇: