写在前面
上一篇以丁香园网站为例,介绍了如何从静态页面上爬取所需的数据。但是,现在的很多网站是通过动态方式来加载数据的,最常见的就是通过下拉到网页底部时动态下载数据的方式。对于动态页面,通过requests从页面上get的方式只能获取到第一次加载的页面内容,没法获取到那些通过页面下拉才能加载的数据。本篇以知乎为例,写了简单的几行代码,旨在说明如何通过PhantomJS和Selenium模拟浏览器页面操作,进而获取动态页面的数据。
动态页面爬虫的完整代码
按照惯例先上代码。在一篇基础上进一步精简了下,重点表明如何使用PhantomJS和Selenium,去掉了数据的解析和保存,需要的童鞋可结合知乎网页格式自行参照上一篇代码进行数据保存。另外,此处未涉及知乎网站的登录操作,我提前通过浏览器进行了登录,不影响代码的运行和数据的爬取。
from bs4 import BeautifulSoup
from selenium import webdriver
import time
class Zhihu:
def __init__(self):
self.base_url = 'https://www.zhihu.com/search?type=content&q=%E5%A9%B4%E5%84%BF%E6%B9%BF%E7%96%B9'
@staticmethod
def scroll_down(driver, times):
for i in range(times):
print("开始执行第", str(i + 1), "次下拉操作")
print("第", str(i + 1), "次下拉操作执行完毕,等待页面加载...")
time.sleep(10)
def get_zhihu_info(self):
print('开始网页get请求')
# 声明一个PhantomJS浏览器,使用selenium控制页面下拉加载
driver = webdriver.PhantomJS()
driver.get(self.base_url)
self.scroll_down(driver=driver, times=2)
print('开始获取所有div标签')
all_div = BeautifulSoup(driver.page_source, 'lxml').find_all('div', class_="ContentItem ArticleItem")
driver.close()
for div in all_div:
print(div)
dxy_info = Zhihu()
dxy_info.get_zhihu_info()
功能描述
使用谷歌浏览器在知乎网站(https://www.zhihu.com/)登录并搜索“婴儿湿疹”,查看搜索结果。通过F12查看页面元素,可见当前页面加载的搜索结果为24个,如下图。网页上进行下拉,搜索结果则增加。因此,为获取更多数据,爬取过程需模拟网页下拉操作。本篇爬虫的功能是通过PhantomJS和Selenium模拟网页下拉,获取页面搜索结果并输出到PyCharm的结果窗口。
代码解析
PhantomJS+Selenium说明
1、之前已经解释过,PhantomJS可以当做是一个无页面的浏览器,使用PhantomJS声明一个浏览器,代码如下:
driver = webdriver.PhantomJS()
driver.get(self.base_url)
get语句相当于在浏览器中输入了base_url地址,此时driver.page_source即为首次加载的页面数据。
2、Selenium模拟动态交互操作,此处以下拉为例,代码如下:
driver.execute_script中支持输入自定义的脚本,非常地灵活,可以模拟各种页面操作,此处使用scrollTo函数模拟下拉到网页底部的操作。上面的代码中直接设置了下拉的次数为2次,需要的童靴可根据所需数据量自行控制。
写在后面
文章中的图片都是屏幕截图,如果涉及版权或其他不妥,请联系更改。
领取 专属20元代金券
Get大咖技术交流圈