利用Selenium模拟浏览器进行爬虫

上一篇我们是通过手工的方式去获得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()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值