Python:如何通过selenium模拟登陆知乎并爬取实时热榜排名?

        之前通过python爬取了知乎的一下话题下的图片、视频等等内容,但是这些都不需要登录知乎就可以得到,只需要简单的设置好爬虫的请求头,然后分析构造url就OK了,但是想要得到知乎首页的内容,不登录就获取是比较困难的(博主不会啊)

        博主我已经提前登录了知乎:

直接来爬取首页url 

import requests
from bs4 import BeautifulSoup

def getHtml(url):
    kv = {"user-agent":"Mozillar/5.0"}
    r = requests.get(url,headers = kv)
    html = r.text
    soup = BeautifulSoup(html,'html.parser')
    print(soup.prettify())
    
if __name__ == '__main__':
    url = "http://www.zhihu.com"
    getHtml(url)

 解析后的HTML和首页毛关系都没有(其实有一点没用的信息而已)

只好通过selenium来模拟登陆知乎后再获取这些内容了 ,博主使用的是谷歌浏览器,准备工作简单陈述一下:

①谷歌浏览器

②chromedriver(对应浏览器版本直接下载,不翻墙):chromedriver.storage.googleapis.com/index.html

③配置好path 

然后就可以通过selenium来模拟登陆了,下面就开始了哦

 经过博主测试,知乎手机号登录需要复杂的验证码(填写数字字母,点击倒立的字),好麻烦的,本着能够登录就可以的原则,我决定曲线救国。社交账号登录

经过测试,QQ登陆就可以避开验证码,真的好爽!!! 

import time
from bs4 import BeautifulSoup
from selenium import webdriver
start = time.time()
driver = webdriver.Chrome()
driver.get('https://www.zhihu.com/')
#点击登录按钮
'''逐层遍历也可以'''
#driver.find_element_by_xpath('//*[@id="root"]/div/main/div/div/div/div[2]/div[2]/span').click()
driver.find_element_by_xpath('//div[@class="SignContainer-switch"]/span').click()
#点击社交账号登录
#driver.find_element_by_xpath('//*[@id="root"]/div/main/div/div/div/div[2]/div[1]/form/div[5]/span[5]/button').click()
driver.find_element_by_xpath('//span[@class="Login-socialLogin"]/button').click()
#点击QQ登录
#driver.find_element_by_xpath('//*[@id="root"]/div/main/div/div/div/div[2]/div[1]/form/div[5]/span[5]/span/button[3]').click()
driver.find_element_by_xpath('//button[@class="Button Login-socialButton Button--plain"][3]').click()
#获得打开的两个窗口
handles = driver.window_handles
#选择第二个窗口(handles[1])
driver.switch_to.window(handles[1])
#强制休眠3秒,等待QQ登录弹框加载
time.sleep(3)
#QQ登录需要框架切换成ptlogin_iframe
driver.switch_to.frame('ptlogin_iframe')
#点击头像,如果你应经登录了QQ账号,直接点击头像就登陆了
'''
driver.find_element_by_id("nick_2350460034").click()
'''
#点击账号密码登录
driver.find_element_by_id("bottom_qlogin").click()
#找到输入框,并且填入QQ号
driver.find_element_by_id("u").send_keys("username")#填入自己QQ号
#找到输入框,并且输入QQ号密码
driver.find_element_by_id("p").send_keys("password")#填入自己密码
#点击登录
driver.find_element_by_id("login_button").click()
#切换到当前窗口
driver.switch_to.window(handles[0])
#强制休眠5秒,等待知乎网页加载
time.sleep(5)
#获取页面内容
html = driver.page_source
soup = BeautifulSoup(html,"html.parser")
print(soup.prettify())
end = time.time()
print(end-start)

输出的HTML中就能够看到熟悉的知乎首页内容了。

 至此,python通过selenium模拟登录知乎就结束了,下面通过模拟登陆后进行抓取时时热榜排名。直接通过正则匹配到就好了。

import time
import re
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

def getzhihuHot(url,username,password):
    #可以设置成chrome浏览器为无界面模式
    '''
    chrome_options=Options()
    chrome_options.add_argument('--headless')
    driver = webdriver.Chrome(chrome_options=chrome_options)
    '''
    driver = webdriver.Chrome()
    driver.get(url)
    #点击登录按钮
    driver.find_element_by_xpath('//div[@class="SignContainer-switch"]/span').click()
    #点击社交账号登录
    driver.find_element_by_xpath('//span[@class="Login-socialLogin"]/button').click()
    #点击QQ登录
    driver.find_element_by_xpath('//button[@class="Button Login-socialButton Button--plain"][3]').click()
    #获得打开的两个窗口
    handles = driver.window_handles
    #选择第二个窗口(handles[1])
    driver.switch_to.window(handles[1])
    #强制休眠3秒,等待QQ登录弹框加载
    time.sleep(3)
    #QQ登录需要框架切换成ptlogin_iframe
    driver.switch_to.frame('ptlogin_iframe')
    #点击头像
    '''
    driver.find_element_by_id("nick_2350460034").click()
    '''
    #点击账号密码登录
    driver.find_element_by_id("bottom_qlogin").click()
    #找到输入框,并且填入QQ号
    driver.find_element_by_id("u").send_keys(username)
    #找到输入框,并且输入QQ号密码
    driver.find_element_by_id("p").send_keys(password)
    #点击登录
    driver.find_element_by_id("login_button").click()
    #切换到当前窗口
    driver.switch_to.window(handles[0])
    #强制休眠5秒,等待知乎网页加载
    time.sleep(5)
    #点击热榜
    driver.find_element_by_xpath("//ul[@class='Tabs']/li[3]").click()
    time.sleep(3)
    #获取页面内容
    html = driver.page_source
    soup = BeautifulSoup(html,'html.parser')
    #格式化输出HTML代码
    print(soup.prettify())
    title = re.findall(r'class="HotItem-title">(.*?)</h2>',html)
    for i in range(len(title)):
        print("热度排名"+"["+str(i+1)+"]"+title[i])
if __name__ == "__main__":
    url = "https://www.zhihu.com/"
    username = "username"#填入自己QQ号
    password = "password"#填入自己密码
    getzhihuHot(url,username,password)

(1) 刚开始不是很熟悉xpath,毕竟没学过这个东东,语法啥的用的不多,个人觉得模拟登录个知乎看看基本知识就够

(2)selenium也是刚刚用,xpath和css定位等较高级的东西还不会,就觉得定位id,name,tag还是很简单的

(3)程序运行速度肯定比网页的反应快,所以适当的要强制休眠等待一下网页加载(以后再改改等待策略)

(3)selenium这个东东好用是真的,就是效率不咋地,程序运行下来耗费15秒,如果有可能,应该学点更高效的方法

(4)对了,如果封装成函数,调用函数后谷歌浏览器直接就自动退出了,不造怎么回事??不封装就没事的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值