前言
本篇文章主要讲述通过python+ selenium实现对博客的刷量来提高自己文章的知名度!! 作为Python初学者,本文章纯属学习+娱乐!!!
一、刷取博客浏览量的姿势
1.通过requests模块刷取
优点: 速度快,每天可以刷1W或者10W + 缺点: 需要不断寻找代理IP,容易被封! ****** 目前代理IP,很难找到,即便是有也不会太稳定!!
2.通过selenium模块刷取
优点: 不需要代理IP,不会出现封号 缺点: 速度很慢,一天也就几百个 ****** 但是贵在持之以恒,不间断运行,极少成多!!
二、selenium刷博客的原理
1.刷取的原理
- 经过不断研究发现,从文章主界面点击一篇博客进入,然后在关闭,返回文章主界面,浏览量+1
- 但是当你马上再次点击进入后,在返回,浏览量不会增加。除非你间隔一段时间,再次点击进入,再次返回,浏览量才会再次+1
- 时间间隔大概是50秒,也就是说,第一次点击以后,要等大概50秒以后,才能点击第二次,增加浏览量,正是基于这种原因导致不能多刷
2.代码实现的思路
- 用户只需要提供文章界面的主链接
- 通过文章的主链接获取里面所有博客数量
- 从第一篇文章开始点击,进入后文章后,等待1秒,立刻关闭
- 关闭第一篇文章以后,马上打开第二篇文章,等待1秒,关闭
- 以此类推,直到最后一篇文章
- 最后一篇文章关闭以后,在返回第一篇,重新开始
- 如此反复循环实现刷取你所有博客的浏览量
三、代码实现
1.正常模式下代码实现
from selenium import webdriver
import time
class CSDN_shuake(object):
def __init__(self, url):
# 创建浏览器
self.driver = webdriver.Chrome()
self.url = url
# 打开博客地址
self.driver.get(url)
# 窗口最大化
self.driver.maximize_window()
# 记录当前是刷的第几篇博客
self.number_content = 0
# 获取到当前主地址下文章的总数
self.lists = self.driver.find_elements_by_xpath('//*[@id="articleMeList-blog"]/div[2]/div')
# 寻找文章,默认从第0个开始点击
def update_content(self, index=0):
print('输出当前点击的文章索引index=', index)
# 定位到列表
lists = self.driver.find_elements_by_xpath('//*[@id="articleMeList-blog"]/div[2]/div')
# 通过给定的index,取出对应的文章
list_item = lists[index]
list_title = list_item.find_element_by_xpath('./h4/a')
# 滚动到指定元素
js4 = "arguments[0].scrollIntoView();"
self.driver.execute_script(js4, list_title)
# 等待1秒,然后点击
self.driver.execute_script("arguments[0].click();", list_title)
# 切换标签
self.changeBiaoQian()
# 切换标签
def changeBiaoQian(self):
# 获取所有句柄
handles = self.driver.window_handles
# 切换句柄
self.driver.switch_to.window(handles[1])
# 当前界面的标题输出
print(self.driver.title)
# 休眠2秒
time.sleep(2)
# 关闭当前打开的界面
self.driver.close()
try:
# 无限循环
while True:
# 回到最开始的标签
self.driver.switch_to.window(handles[0])
# 刷新一次
self.driver.refresh()
# 等待2秒
time.sleep(2)
self.number_content += 1
if self.number_content == len(self.lists):
self.number_content = 0
# 再次重新打开
self.update_content(self.number_content)
except Exception as result:
print("有异常结束", result)
self.driver.quit()
# 程序运行
def run(self):
self.update_content()
# 运行入口
if __name__ == '__main__':
# 地址只需要换成自己的即可
csdn = CSDN_shuake('https://blog.csdn.net/wds326598')
csdn.run()
至此,你可以直接运行,就会看到效果!!! 但是,这样你也就是玩玩,并不能实现一天24小时刷量!!! 要想真正24小时不停的刷,还得放到自己服务器上(阿里云服务器买个最低配的,几十元,1年)
2. Liunx服务器安装无头模式Chrome
具体安装参考: https://blog.csdn.net/frank_good/article/details/103028069
再次需要注意一点,在安装chromedriver的时候,需要注意版本chrome的版本必须与chromedriver的版本匹配,选择liunx,要不然会报错的
3.可以在liunx运行的部署的代码
# coding:utf-8
import sys
reload(sys)
sys.setdefaultencoding("utf-8")
import time
from selenium.webdriver import Chrome
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
import os
# chromedriver的路径,根据自己的路径写
DRIVER_PATH = '/usr/local/bin/chromedriver'
class CSDN_shuake(object):
def __init__(self, url):
options = Options()
options.add_argument('--no-sandbox')
options.add_argument('--headless') # 无头参数
options.add_argument('--disable-gpu')
desired_capabilities = DesiredCapabilities.CHROME
desired_capabilities["pageLoadStrategy"] = "eager"
# 创建浏览器
self.driver = Chrome(executable_path=DRIVER_PATH, options=options, desired_capabilities=desired_capabilities)
self.url = url
# 打开博客地址
self.driver.get(url)
# 窗口最大化
self.driver.maximize_window()
self.number_content = 0
self.lists = self.driver.find_elements_by_xpath('//*[@id="articleMeList-blog"]/div[2]/div')
# 寻找文章
def update_content(self, index=0):
print('输出index=', index)
# 定位到列表
lists = self.driver.find_elements_by_xpath('//*[@id="articleMeList-blog"]/div[2]/div')
# 通过给定的index,取出对应的值
list_item = lists[index]
list_title = list_item.find_element_by_xpath('./h4/a')
# 滚动到指定元素
js4 = "arguments[0].scrollIntoView();"
self.driver.execute_script(js4, list_title)
# 等待1秒
self.driver.execute_script("arguments[0].click();", list_title)
try:
self.changeBiaoQian()
except Exception as result:
print('click is error', result)
self.driver.quit()
# 切换标签
def changeBiaoQian(self):
# 获取所有句柄
handles = self.driver.window_handles
# 切换句柄
self.driver.switch_to.window(handles[1])
# 关闭打开的界面
print(self.driver.title)
time.sleep(1)
self.driver.close()
try:
# 无限循环
while True:
# 回到最开始的标签
self.driver.switch_to.window(handles[0])
# 刷新一次
self.driver.refresh()
# 等待1秒
time.sleep(1)
self.number_content += 1
if self.number_content == len(self.lists):
self.number_content = 0
# 再次重新打开
self.update_content(self.number_content)
break
except Exception as result:
print("有异常结束", result)
try:
f = open('test.txt', 'w')
except:
pass
else:
dates = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))
strs = dates + 'id=' + str(os.getpid())
f.write(strs)
finally:
f.close()
self.driver.quit()
# 结束当前进程
os.kill(os.getpid(), 9)
def run(self):
self.update_content()
if __name__ == '__main__':
csdn = CSDN_shuake('https://blog.csdn.net/wds326598')
csdn.run()
代码中有几个需要注意点:
- DRIVER_PATH :写自己chromedriver的路径
- 由于代码执行是无限执行打开-关闭,打开-关闭操作,到最末尾了,又重新从0开始执行,形成了一个死递归
而递归都有一个最大递归深度1000,超过以后代码就会抛出异常!! - 要解决这个问题,就需要捕获异常,当捕获到异常以后,程序就会结束运行,然后我会把当前异常的时间,和进程ID,写入到一个test.txt文件中
- 另写一个脚本文件去定时监测这个test.txt文件,当发现这个test.txt有数据了,说明你程序已经抛出过异常结束了,然后我们要做的就是重新启动!
- 这样就可以无限制,一天24小时刷所有博客了
四、运行成功的效果图
总结
一句话,刷量是可耻的行为!!! 本文章主要是学习selenium的使用
|