之前通过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)对了,如果封装成函数,调用函数后谷歌浏览器直接就自动退出了,不造怎么回事??不封装就没事的