最近看到有兄弟们爬取魔方公寓受阻了,虽然能爬取房源信息但是爬取不到评论信息,而且接口是加密的, 用selenium的模拟滚动条滚动也不能让评论下翻,最后只能拿到十几条数据,读者最后试了几遍, 用了很多方法都没法实现,但是最后还是被小编攻破了, 一起来看一下吧!
首先我是按照常规写法, 模拟滚动条滚动,但是最后得到的却是主页面的滚动而评论页纹丝不动, 后来发现评论页原来整体是一个div标签,所以我们得换个思路了.
现在换个思路, 我们在点开全部评论的时候鼠标滑动评论是可以自动向下加载的,但是为什么到最后模拟滚动的时候不行呢,小编就想着是不是把鼠标移动到这个全部评论上就可以让评论向下加载呢, 于是我就模拟鼠标点击其中一个评论, 使得鼠标停放到评论上,然后
模拟滚动,本来信心满满的小编又受打击了.不过咱们继续
最后我要发大招了, 狠心钻研下我终于发现方法了, 还有selenium鼠标第三方库这种好东西呢, selenium鼠标操作有个移动鼠标的操作
move_by_offset(x,y) 移动到坐标为(x, y)的位置
但是仅仅移动到整个div更多评论上还不够, 滚动的其实还是整个window页面, 那我们就得再换换思路了, 其实仔细想想,我们在拉动评论下滚的时候到底是怎么向下滚动的呢? 最后我想到应该可以模拟鼠标中轴滚动,因为我们在翻页的时候就是用的鼠标滚动不是吗,于是我成功了!话不多说来看看结果:
那下面咱们就来分析一下代码:
import time 鼠标操作需要导入win32api和win32con 两个库 import win32api, win32con from win32api import GetSystemMetrics selenium模拟浏览器操作鼠标需要导入ActionChains方法 from selenium.webdriver.common.action_chains import ActionChains from selenium import webdriver from selenium.webdriver.chrome.options import Options from win32con import SM_CXSCREEN, SM_CYSCREEN 使用谷歌驱动 chrome_options = Options() 有界面谷歌浏览器 path = r'E:\爬虫\day06\day06全天\ziliao\chromedriver' driver = webdriver.Chrome(executable_path=path, chrome_options=chrome_options) 驱动地址按照自己的安装位置添加 url = 'https://www.52mf.com.cn/shopDetails/8069'
driver.get(url=url) 让界面滚动到最后更多评论信息界面 for i in range(3): driver.execute_script('window.scrollBy(0, 200)') time.sleep(0.2) 找到查看全部评论标签 all_pinglun = driver.find_element_by_xpath('//*[@id="anchor6"]/div[2]') 模拟点击 all_pinglun.click() time.sleep(1) ping_lun = driver.find_element_by_xpath('//div[@id="modal-root"]//ul/li[3]/p') 计算浏览器界面宽高 x = GetSystemMetrics(SM_CXSCREEN) y = GetSystemMetrics(SM_CYSCREEN) 得到中间值 print(x/2, y/2) 界面最大化 driver.maximize_window() 鼠标移动到正中心 ActionChains(driver).move_by_offset(x/2, y/2) time.sleep(1) for l in range(200): # driver.execute_script('window.scrollBy(0, 200)') # time.sleep(0.2) 模拟鼠标中轴滚动 win32api.mouse_event(win32con.MOUSEEVENTF_WHEEL, 0, 0, -1000) time.sleep(0.2) 关闭模拟器 driver.close()
最后我们就得到我们想要的结果了,评论已经可以被操作下翻, 我们也可以拿到我们想要的动态加载的所有评论数据了,你也快试试吧!