Python爬虫-适用新手(三)-动态页面实战练习

写在前面

上一篇以丁香园网站为例,介绍了如何从静态页面上爬取所需的数据。但是,现在的很多网站是通过动态方式来加载数据的,最常见的就是通过下拉到网页底部时动态下载数据的方式。对于动态页面,通过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次,需要的童靴可根据所需数据量自行控制。

写在后面

文章中的图片都是屏幕截图,如果涉及版权或其他不妥,请联系更改。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180810G1X1G400?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券