java爬虫抓取动态网页(自问自答一下可以用一个很牛逼的包,叫做selenium)
优采云 发布时间: 2021-11-05 17:11java爬虫抓取动态网页(自问自答一下可以用一个很牛逼的包,叫做selenium)
问你自己
你可以使用一个非常棒的名为 selenium 的包(官方文档 Selenium with Python)。简单地说,它模拟人们在浏览器上的动作。您可以用代码打开浏览器,然后像人一样操作,实现浏览器的自动化(打开网页、输入文本、提交表单等),安装等细节在官方文档中有介绍。
以爬取本页Food-Popular Questions and Answers的所有主要回答信息为例。正如我所描述的,这个页面需要向下滚动才能获得更多信息。但是requests库好像不能实现这个功能?我还是不知道。. 反正这个页面的爬取基本可以用selenium库来实现。
话不多说,直接贴代码(环境为python3.5)
先导入需要的库,打开知乎-与世界页面分享你的知识、经验和见解,先登录。
from selenium import webdriver
import time
from bs4 import BeautifulSoup
driver=webdriver.Chrome() #用chrome浏览器打开
driver.get("http://www.zhihu.com") #打开知乎我们要登录
time.sleep(2) #让操作稍微停一下
driver.find_element_by_link_text('登录').click() #找到‘登录’按钮并点击
time.sleep(2)
#找到输入账号的框,并自动输入账号 这里要替换为你的登录账号
driver.find_element_by_name('account').send_keys('你的账号')
time.sleep(2)
#密码,这里要替换为你的密码
driver.find_element_by_name('password').send_keys('你的密码')
time.sleep(2)
#输入浏览器中显示的验证码,这里如果知乎让你找烦人的倒立汉字,手动登录一下,再停止程序,退出#浏览器,然后重新启动程序,直到让你输入验证码
yanzhengma=input('验证码:')
driver.find_element_by_name('captcha').send_keys(yanzhengma)
#找到登录按钮,并点击
driver.find_element_by_css_selector('div.button-wrapper.command > button').click()
然后获取你的登录cookie并加载目标页面Food-Popular Q&A,因为用这个包打开浏览器不会记录你之前的浏览器会话(cookies、书签等),所以暂时只能用这个方法登录和然后进入目标页面。
cookie=driver.get_cookies()
time.sleep(3)
driver.get('https://www.zhihu.com/topic/19551137/hot')
time.sleep(5)
定义一个函数,实现将滚轮滑动到页面底部的功能。这是官方文档里的(为了让页面加载完成,每5秒向下移动一次,共10次)
def execute_times(times):
for i in range(times + 1):
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(5)
execute_times(10)
接下来是页面解析,使用BeautifulSoup库,我就不多说了
html=driver.page_source
soup1=BeautifulSoup(html,'lxml')
authors=soup1.select('a.author-link')
authors_alls=[]
authors_hrefs=[]
for author in authors:
authors_alls.append(author.get_text())
authors_hrefs.append('http://www.zhihu.com'+author.get('href'))
authors_intros_urls=soup1.select('span.bio')
authors_intros=[]
for authors_intros_url in authors_intros_urls:
authors_intros.append(authors_intros_url.get_text())
for authors_all,authors_href,authors_intro in zip(authors_alls,authors_hrefs,authors_intros):
data={
'author':authors_all,
'href':authors_href,
'intro':authors_intro
}
print(data)
最后打印结果:
我这里只试了10页,程序没有问题,不知道数据多了会不会有问题