上一篇我们是通过手工的方式去获得ajax请求的地址,优点是速度快,编码简单,但是问题是,很多时候我们是很难提取到真实地址的,并且也很难解析地址的规律。
这个时候,可以考虑使用使用一种模拟工具 selenium去代替人工的方式去模拟操纵浏览器。
这个库可以自动化地做一些东西,
如点击按钮、提交表单(填写账户密码、输入验证码等等)。
在这里,实际上就是让库模拟浏览器加载出页面的真实数据之后再进行爬取数据。
from selenium import webdriver
import time
url = "http://www.santostang.com/2018/07/04/hello-world/"
driver = webdriver.Chrome() # 需要的话,写上Firefox驱动地址
driver.get(url)
# 等一下,让浏览器把数据都请求好
time.sleep(3)
count = 0
def getCommentList():
global count
try:
commentList = driver.find_elements_by_css_selector('div.reply-content')
# print (commentList)
for comment in commentList:
content = comment.find_element_by_tag_name('p')
print(content.text)
count = count + 1
return commentList
except:
return None
def clickMoreButton() -> bool:
try:
moreButton = driver.find_element_by_css_selector('button.page-last-btn')
moreButton.click()
return True
except:
return False
def main():
while True:
# 请求一次即可
try:
driver.switch_to.frame(driver.find_element_by_css_selector("iframe[title='livere-comment']"))
except:
pass
# 轮询,直到超时或者拿到数据
commentList = getCommentList()
waitTime = 0
while commentList is None:
waitTime = waitTime + 2
if waitTime >= 10:
break
commentList = getCommentList()
if commentList is None:
break
else:
if clickMoreButton() is False:
break
# 必须要等待一下,整个过程是个异步的状态,你也不知道ajax的回调何时触发(当然了,既不能等的太短,也不能无限制地等下去)
time.sleep(2)
print("\n" * 3, "爬取结束\n", "共%d条评论" % (count))
if __name__ == '__main__':
main()