selenium 爬取
接下来就是通过 selenium 进行一些模拟行为的操作了, 这部分代码比较简单, 编写的时候参考一下注释即可.
- # 实例化一个启动参数对象
- chrome_options = Options()
- # 添加启动参数
- chrome_options.add_argument('--proxy-server=127.0.0.1:8080')
- # 将参数对象传入 Chrome, 则启动了一个设置了窗口大小的 Chrome
- driver = webdriver.Chrome(chrome_options=chrome_options)
关键函数
- def move_to_gap(tracks):
- driver.get("https://passport.zcool.com.cn/regPhone.do?appId=1006&cback=https://my.zcool.com.cn/focus/activity")
- # 找到滑块 span
- need_move_span = driver.find_element_by_xpath('//*[@id="nc_1_n1t"]/span')
- # 模拟按住鼠标左键
- ActionChains(driver).click_and_hold(need_move_span).perform()
- for x in tracks: # 模拟人的拖动轨迹
- print(x)
- ActionChains(driver).move_by_offset(xoffset=x,yoffset=random.randint(1,3)).perform()
- time.sleep(1)
- ActionChains(driver).release().perform() # 释放左键
注意看到上述代码中有何核心的点 --- 拖拽距离的 列表 tracks
- if __name__ == '__main__':
- move_to_gap(get_track(295))
这个地方可以借鉴网上的方案即可
- def get_track(distance):
- '''
- 拿到移动轨迹, 模仿人的滑动行为, 先匀加速后匀减速
- 匀变速运动基本公式:
- 1v=v0+at
- 2s=v0t+(1/2)at2
- 3v2-v02=2as
- :param distance: 需要移动的距离
- :return: 存放每 0.2 秒移动的距离
- '''
- # 初速度
- v=0
- # 单位时间为 0.2s 来统计轨迹, 轨迹即 0.2 内的位移
- t=0.1
- # 位移 / 轨迹列表, 列表内的一个元素代表 0.2s 的位移
- tracks=[]
- # 当前的位移
- current=0
- # 到达 mid 值开始减速
- mid=distance * 4/5
- distance += 10 # 先滑过一点, 最后再反着滑动回来
- while current < distance:
- if current < mid:
- # 加速度越小, 单位时间的位移越小, 模拟的轨迹就越多越详细
- a = 2 # 加速运动
- else:
- a = -3 # 减速运动
- # 初速度
- v0 = v
- # 0.2 秒时间内的位移
- s = v0*t+0.5*a*(t**2)
- # 当前的位置
- current += s
- # 添加到轨迹列表
- tracks.append(round(s))
- # 速度已经达到 v, 该速度作为下次的初速度
- v= v0+a*t
- # 反着滑动到大概准确位置
- for i in range(3):
- tracks.append(-2)
- for i in range(4):
- tracks.append(-1)
- return tracks
代码注释已经添加好, 可以自行查阅, 临摹一下即可明白
最后开始进行尝试, 实测中, 发现可以自动拖动, 但是, 出现一个问题是最后被识别为机器, 这个地方, 我进行了多次的修改与调整, 最终从代码层面发现实现确实有些复杂, 所以改变策略, 找一下 chromedriver.exe 是否有修改过的版本, 中间去除了 selenium 的一些关键字, 运气不错, 被我找到了.
目前只有 windows10 版本和 linux16.04 版本
下载之后, 替换你的 chromedriver.exe
来源: https://www.2cto.com/kf/201904/802527.html