• 一、 网页分析
    • 1、登录状态维持
    • 2、关注列表获取
    • 3、下拉刷新
    • 4、关注目标用户的过程分析
  • 二、完整代码
  • 三、效果展示
  • 四、拓展
  • 五、总结

​ 想要了解一个人,可以从ta的微博开始下手,微博的关注列表可以很好地看出一个人的兴趣。实验计划获取目标微博账号的关注列表并实现批量关注。

一、 网页分析

​ 为减少网页反爬策略对实验产生影响,选取手机端网页进行分析(m.weibo.com)。下面根据关注的三个步骤进行分析。

打不开手机端网页的情况:
输入网址后按F12打开开发者工具,在依次点击下方两个位置选择手机模式后即可正常浏览。

查看网页源代码,发现关注列表等信息明显是用js渲染出来的,很难通过requests直接获取,因此选择Selenium库作为爬取工具。

1、登录状态维持

​ 在进行一切操作之前需要登录自己的账号,而登录过程包含各种验证手段,不方便处理。因此在爬取页面前手动登录账号,并在chrome-开发者工具-Application-cookies中获取相应的cookie。在访问时,手动添加cookie可以保持登录的状态。

2、关注列表获取

​ 分别找到三个用户的关注列表,对url进行分析。

​ 发现有差异的部分仅为“followers_-_”之后,“_-_1042015”之前的部分(经验证知该值为微博用户号),postman检验知“_-_1042015”及其之后的参数均可去除。

由此得到了url格式:

url = 'https://m.weibo.cn/p/index?containerid=231051_-_followers_-_{}'.format(targetid)
# targetid 为目标账户的id

3、下拉刷新

​ 页面每次向下滚动时会产生新的用户。为保证不会因操作频率过快而被目标网站检验,每次下拉都需要设置一定时间间隔。

4、关注目标用户的过程分析

​ 右键点击关注按钮,即可在开发者工具中查看按钮在html中的位置。

​ 我们很快地找到按钮的位置,每一个class=“card m-panel card28 m-avatar-box”的div下“class="m-font m-font-follow"的i元素,据此可以很快使用xpath定位。但Selenium的click函数默认不支持对i元素的点击,采用execute_script函数执行js脚本可以绕过这个限制。

follow_button = browser.find_element_by_xpath('.//i[@class="m-font m-font-follow"]')
browser.execute_script("arguments[0].click();", follow_button)
time.sleep(random.uniform(0,1))

​ 与下拉一样,为防止被目标网站屏蔽,每次点击设置一定时间间隔。

二、完整代码

注:
运行前提前安装Selenium库,以及相应的webdriver。
pip install selenium
根据自己的chrome版本下载chromediver并添加至环境变量。

from selenium import webdriver
import random
import timetotal_num = 50
# 使用前手动获取cookies
cookies = [{"name": "_T_WM", "value": "85458941036"},{"name": "SUB", "value": "_2A25MpEV9DeRhGeFN6VAU9i7OwzSIHXVsZ2s1rDV6PUJbkdAKLXn9kW1NQEE7SA2lhJKFE8uT2XTdS1cBtmzNj532"},{"name": "WEIBOCN_FROM", "value": "1110006030"},{"name": "MLOGIN", "value": "1"},{"name": "XSRF-TOKEN", "value": "b96148"},{"name": "M_WEIBOCN_PARAMS", "value": "luicode%3D10000011%26lfid%3D231051_-_followers_-_1350995007_-_1042015%253AtagCategory_050%26fid%3D231051_-_followers_-_1350995007_-_1042015%253AtagCategory_050%26uicode%3D10000011"},#{"name": "loginScene", "value":"102003"}]
# div class="m-dialog"
# 滚动至最底端
def roll(driver):# 获取页面初始高度js = "return action=document.body.scrollHeight"height = driver.execute_script(js)# 将滚动条调整至页面底部driver.execute_script('window.scrollTo(0, document.body.scrollHeight)')# 初始时间t1 = int(time.time())# 循环标识status = True# 重试次数num = 0result = []while status:# 判断数量是否足够result = driver.find_elements_by_xpath('//i[@class="m-font m-font-follow"]')count = len(result)if count >= total_num:print("已达到预期数目.")status = False# 当前时间t2 = int(time.time())time.sleep(1)# 判断时间初始时间戳和当前时间戳相差是否大于5秒,小于5秒则下拉滚动条if t2 - t1 < 5:new_height = driver.execute_script(js)if new_height > height:time.sleep(random.uniform(1,2))driver.execute_script('window.scrollTo(0, document.body.scrollHeight)')# 重置初始页面高度height = new_height# 重置初始时间戳,重新计时t1 = int(time.time())elif num < 3:  # 当超过5秒页面高度仍然没有更新时,进入重试逻辑,重试3次,每次等待3秒time.sleep(3)num = num + 1else:  # 超时并超过重试次数,程序结束跳出循环,并认为页面已经加载完毕!print("滚动条已经处于页面最下方")status = False# 滚动条调整至页面顶部driver.execute_script('window.scrollTo(0, 0)')breakprint("共{}个用户可供关注。".format(count))def main():start = time.time()# 开发者模式options = webdriver.ChromeOptions()options.add_experimental_option('excludeSwitches', ['enable - automation'])# 启动浏览器browser = webdriver.Chrome()# 目标用户的idtargetid = 1827683445url = 'https://m.weibo.cn/p/index?containerid=231051_-_followers_-_{}'.format(targetid)browser.get(url)time.sleep(2)# 添加cookiefor cookie in cookies:browser.add_cookie(cookie)# 刷新状态browser.refresh()#  下滚并获取目标数量的用户roll(browser)# 查找用户所在divtargets = browser.find_elements_by_xpath('//div[@class="card m-panel card28 m-avatar-box"]')if len(targets) != 0:count = 0for target in targets:# 查找用户昵称name = target.find_elements_by_xpath('.//h3')[0].text# 查找关注按钮follow_button = target.find_elements_by_xpath('.//i[@class="m-font m-font-follow"]')if len(follow_button) != 0:follow_button = follow_button[0]# 检查是否有弹窗dialog = browser.find_elements_by_xpath('//div[@class="m-dialog"]')if len(dialog) == 0:print("Success: 成功关注 {}".format(name))# 保存至文件with open('followname_{}.txt'.format(targetid), 'a', encoding='utf-8') as f:f.write("%s\n" % name)# 点击关注browser.execute_script("arguments[0].click();", follow_button)time.sleep(random.uniform(0.6,1.5))count += 1else:print("Error: 关注失败.")breakif count == total_num:breakprint("共关注了{}个用户.".format(count))print("耗费时间:{}s".format(time.time()-start))time.sleep(10)if __name__ == '__main__':main()

三、效果展示

整体算是实现了基本的自动化功能,关注效率偏低。毕竟每次关注都会向目标网站发送请求,请求到达一定频率账号就会被封禁(我的账号昨天封了一整天。。。)。如果代理ip的话,由于每次发送关注请求的均为同一个账户,还是无法避免账户的封禁。

​ 运行中:

​ 关注前:

​ 关注后:

四、拓展

​ 另外还写了一个批量取消关注的程序,原理类似:

from selenium import webdriver
import random
import time# 使用前手动获取cookies
cookies = [{"name": "_T_WM", "value": "85458941036"},{"name": "SUB", "value": "_2A25MpEV9DeRhGeFN6VAU9i7OwzSIHXVsZ2s1rDV6PUJbkdAKLXn9kW1NQEE7SA2lhJKFE8uT2XTdS1cBtmzNj532"},{"name": "WEIBOCN_FROM", "value": "1110006030"},{"name": "MLOGIN", "value": "1"},{"name": "XSRF-TOKEN", "value": "b96148"},{"name": "M_WEIBOCN_PARAMS", "value": "luicode%3D10000011%26lfid%3D231051_-_followers_-_1827683445_-_1042015%253AtagCategory_050%26fid%3D231051_-_followers_-_1827683445_-_1042015%253AtagCategory_050%26uicode%3D10000011"}]# 滚动至最底端
def roll(driver):# 获取页面初始高度js = "return action=document.body.scrollHeight"height = driver.execute_script(js)# 将滚动条调整至页面底部driver.execute_script('window.scrollTo(0, document.body.scrollHeight)')time.sleep(5)# 定义初始时间戳(秒)t1 = int(time.time())# 定义循环标识,用于终止while循环status = True# 重试次数num = 0while status:# 获取当前时间戳(秒)t2 = int(time.time())# 判断时间初始时间戳和当前时间戳相差是否大于5秒,小于5秒则下拉滚动条if t2 - t1 < 5:new_height = driver.execute_script(js)if new_height > height:time.sleep(1)driver.execute_script('window.scrollTo(0, document.body.scrollHeight)')# 重置初始页面高度height = new_height# 重置初始时间戳,重新计时t1 = int(time.time())elif num < 3:  # 当超过5秒页面高度仍然没有更新时,进入重试逻辑,重试3次,每次等待3秒time.sleep(3)num = num + 1else:  # 超时并超过重试次数,程序结束跳出循环,并认为页面已经加载完毕!print("滚动条已经处于页面最下方!")status = False# 滚动条调整至页面顶部driver.execute_script('window.scrollTo(0, 0)')breakdef main():total = 20count = 0browser = webdriver.Chrome()browser.get('https://m.weibo.cn/p/index?containerid=231093_-_selffollowed')for cookie in cookies:browser.add_cookie(cookie)browser.refresh()roll(browser)follows = browser.find_elements_by_xpath("//i[@class=\'m-font m-font-followed\']")for follow in follows:# 取消关注follow.click()time.sleep(random.uniform(0.5, 1.0))# 确定按钮browser.find_element_by_xpath("//a[@class=\"m-btn m-btn-white m-btn-text-orange\"]").click()count += 1if count == total:breakprint("Done")time.sleep(10)if __name__ == '__main__':main()

五、总结

​ 1.Selenium实现所见即所得,可以有效实现对js渲染页面元素的爬取。

​ 2.一般的网站都需要登录,传入cookie可以保持登录状态。

​ 3.爬取过程中会遇到被目标网站封禁的情况,需要灵活调整等待时间以最大程度模拟人的行为。

​ 1.Selenium实现所见即所得,可以有效实现对js渲染页面元素的爬取。

​ 2.一般的网站都需要登录,传入cookie可以保持登录状态。

​ 3.爬取过程中会遇到被目标网站封禁的情况,需要灵活调整等待时间以最大程度模拟人的行为。

​ 4.目前实现效率不是很高,由于每次关注都会向目标网站发送请求,请求到达一定频率就会被封禁(大概关注30个用户就会被封禁了)。暂时没有找到合理的解决方法。求大佬提供思路。如果只是爬取信息的话被封禁的概率则要低一些。

python爬虫Selenium批量关注微博用户相关推荐

  1. Python爬虫-Selenium(1)

    Python爬虫-Selenium(1) @(博客)[python, 爬虫, selenium, Python] Python爬虫-Selenium(1) 前言 前期准备 基础使用 进阶使用 浏览器操 ...

  2. [Python爬虫] Selenium实现自动登录163邮箱和Locating Elements介绍

    前三篇文章介绍了安装过程和通过Selenium实现访问Firefox浏览器并自动搜索"Eastmount"关键字及截图的功能.而这篇文章主要简单介绍如何实现自动登录163邮箱,同时 ...

  3. Python爬虫 Selenium实现自动登录163邮箱和Locating Elements介绍

    Python爬虫视频教程零基础小白到scrapy爬虫高手-轻松入门 https://item.taobao.com/item.htm?spm=a1z38n.10677092.0.0.482434a6E ...

  4. Python 爬虫 Selenium 基本使用

    Python 爬虫 Selenium 基本使用 1. 基础知识 1.1 下载浏览器驱动 1.2 帮助文档 2. 浏览器操作 2.1 浏览器导航 2.2 窗口和选项卡 2.3 Frames and If ...

  5. [Python爬虫] Selenium实现自己主动登录163邮箱和Locating Elements介绍

            前三篇文章介绍了安装过程和通过Selenium实现訪问Firefox浏览器并自己主动搜索"Eastmount"keyword及截图的功能.而这篇文章主要简介怎样实现 ...

  6. Python爬虫获取简书的用户、文章、评论、图片等数据,并存入数据库

    Python爬虫获取简书的用户.文章.评论.图片等数据,并存入数据库 爬虫定义:网络爬虫(又称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维 ...

  7. python 爬虫+selenium 全自动化下载JS动态加载漫画

    ** python 爬虫+selenium 全自动化下载JS动态加载漫画 最近刚学的python,代码可能并不规范,希望大家见谅! 爬取之前,我们首先需要做一些准备工作,因为很多网站都有反爬检索,为了 ...

  8. Python爬虫——Selenium 简介和下载

    文章目录 Python爬虫--Selenium 简介和下载 1.Selenium 简介 2.Selenium 下载安装 3.Selenium 简单使用 Python爬虫--Selenium 简介和下载 ...

  9. [Python爬虫] Selenium获取百度百科旅游景点的InfoBox消息盒

    前面我讲述过如何通过BeautifulSoup获取维基百科的消息盒,同样可以通过Spider获取网站内容,最近学习了Selenium+Phantomjs后,准备利用它们获取百度百科的旅游景点消息盒(I ...

  10. [Python爬虫] Selenium+Phantomjs动态获取CSDN下载资源信息和评论

    前面几篇文章介绍了Selenium.PhantomJS的基础知识及安装过程,这篇文章是一篇应用.通过Selenium调用Phantomjs获取CSDN下载资源的信息,最重要的是动态获取资源的评论,它是 ...

最新文章

  1. 设计模式(十二):通过ATM取款机来认识“状态模式”(State Pattern)
  2. Intel Realsense D435 当usb显示为2.x时,是否能正常运行? 2.1 3.2
  3. Node系列——Node第三方模块使用总结
  4. amd服务器开启虚拟化,记一次 AMD 虚拟化 IOMMU 开启过程
  5. BZOJ.2816.[ZJOI2012]网络(LCT)
  6. ProGuard:类混淆,类的指定函数保留
  7. linux命令 视频教程,常用的linux命令视频教程
  8. 小程序图片src本地服务器路径,微信小程序 图片加载(本地,网路)实例详解...
  9. 《Java从入门到放弃》框架入门篇:在MyEclipse中配置Mybatis框架
  10. Maven项目引入JS,css等文件的问题
  11. jq怎么获取值与下拉框怎么获取值
  12. github上关于iOS的各种开源项目集合 (转载)
  13. unity 自动寻路
  14. 悟空问答 模板 html,WeCenter仿悟空问答模板
  15. 使用7z压缩工具批量压缩文件
  16. phpstudy一直自动停止启动_window10 phpstudy2018 mysql服务重启之后自动停止
  17. 三元锂电池 VS 磷酸铁锂电池
  18. 写给一个外汇女交易员的信(连载五)
  19. php实现教学卡片,如何实现卡片翻阅效果
  20. 相机与图像--小孔成像模型与坐标系--坐标系转换

热门文章

  1. Unity 粒子系统参数一
  2. ASP+VML制作统计图的源程序
  3. 韶大talk 评论热度抽取
  4. sap服务器之间文件复制,sap跨服务器客户端复制
  5. 完美解决Sudo doesn‘t work: “/etc/sudoers is owned by uid 1000, should be 0”
  6. (摘自CSDN的koy0755)一步一步实现数据库到类的自动化映射(二) 类层次的设计 类的实现...
  7. 如果“永远”只是一瞬间
  8. css5导弹,世界六大洲际导弹排行榜
  9. 通过京东白条了解资产证券化
  10. mysql 定时调用sp_使用shell脚本调用mysql数据库存储过程,并设置定时任务