数据分析之数据采集(仅Web爬虫相关)。本文继续从爬虫入手。不过这次使用的是
Python
。
一、另一种方式的爬虫
爬虫通常是:①得到目标网页URL;②发起HTTP请求得到网页数据;③使用各种方式解析网页得到想要的数据;
通常,在第②步,是不会去执行页面中的JS代码的。有些网站,会使用Ajax异步加载一些数据,然后再渲染到页面上的;或者使用JS对页面Dom做一些修改。这样都会导致第②步请求的页面中缺少、甚至是没有目标数据。这就需在获取到网页数据后,执行页面中的JS代码了。
最早是使用phantomjs+selenium。后面Chrome出了headless
模式,基本就一直使用Chrome了。处理逻辑大概:①请求获取网页,执行JS代码;②再将处理过的页面数据进行保存;③后续的处理(解析网页获取数据)。
1.1 Selenium使用示例
我们就以掘金征文为例,获取该文章下所有的评论。
注: 虽然可以直接通过接口获取,但我们假设无法直接获取数据,必须执行完JS才能得到目标数据。
使用Selenium + Chrome,首先需要下载与Chrome版本对应的ChromeDriver。
示例代码如下:
self.driver.get(self.article_url)
# 等待评论列表出现
WebDriverWait(self.driver, 10).until(
EC.presence_of_element_located((By.CLASS_NAME, 'comment-list'))
)
self.save_page()
通过Selenium来操控Chrome加载网页时,通常会遇到这种问题:网络延迟,导致目标数据没有及时下载下来,但此时已将网页保存完毕。最简单的方式是,每次发生加载网页时,调用下time.sleep(5)
类似的方式,但这种方式虽然简单但却比较粗暴。更好的办法是使用Selenium提供的WebDriverWait
来处理。
官方文档,一定不要错过:selenium-python。
1.2 页面的后续处理
将渲染后的网页保存之后,接下来就要解析提取数据了。这次我们使用XPath
来解析数据。
还是先分析下网页
数据所处位置为://div[&