java爬虫抓取动态网页(自问自答一下可以用一个很牛逼的包,叫做selenium)

优采云 发布时间: 2021-11-05 17:11

  java爬虫抓取动态网页(自问自答一下可以用一个很牛逼的包,叫做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页,程序没有问题,不知道数据多了会不会有问题

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线