皮卡丘联合爬虫业界大牛FastGets整理一系列文章,介绍python爬虫基础知识、大牛多年反爬经验,有难度网站抓取实战、爬虫系统架构设计、安卓app逆向分析。帮助小白入门,初级工程师成为资深工程师,大神回顾。大家有任何问题可留言交流,欢迎转发分享。
爬虫工程师经常会遇到一些网页在浏览器中打开是有数据的,但是html源码里面却没有数据。这通常是由于浏览器执行了html源码中的js代码,然后生成了数据,使我们在浏览器中可以正常看到,但是源码却没有,这就给数据采集增加了困难。针对这类问题,笔者今天来介绍python3 + selenium + chrome组合。
Selenium 是一个自动化测试工具,它提供了一个通用的接口,来模拟用户操作浏览器。它支持多种浏览器,包括 Chrome,Safari,Firefox,PhantomJS等主流界面式浏览器,也是由于这个特性,被广泛的应用于数据采集中,主要是来解决JavaScript渲染等问题。
之前笔者主要使用PhantomJS这个无界面的浏览器,由于无界面性能和速度都会好些。但是PhantomJS无人维护,坑比较多,好在Chrome在V59版本之后,支持无界面模式,所有chrome就成了我们的首选。
一、环境配置
1. Linux系统 ,笔者使用的是centos7
(1)安装google-chrome
添加chrome源,在终端输入
sudo vi /etc/yum.repos.d/google.repo
然后将下面复制进去,保存退出。
终端输入:
sudo yum -y install google-chrome-stable
然后测试下,是否安装成功,在终端输入:
google-chrome-stable --no-sandbox --headless --disable-gpu --screenshothttps://www.baidu.com/
看看当前目录下是否有截图生成。
(2) 安装chromedriver
chromedriver的版本需要与chrome一致,在终端输入如下命令,查看刚刚安装的chrome版本
google-chrome -version
# 输出:Google Chrome 66.0.3359.117
可知笔者的版本是66。
我们打开notes.txt,如下图:
可以看到2.38版本的chromedriver支持66版本的chrome,然后我们下载此版本就好,在终端输入:
# 下载:
wgethttps://chromedriver.storage.googleapis.com/2.38/chromedriver_linux64.zip
# 解压:
unzip chromedriver_linux64.zip
# 移动到/usr/bin目录下:
sudo mv chromedriver /usr/bin/
如果不移动的话,需要在启动时,写出chromedriver的路径。
(3) 安装python3模块selenium
pip3 install selenium
到这里安装成功了。有一点需要注意,linux下我们使用selenium调用chromedriver时,不能在root用户下,否则会报错。
2.Windows系统和Mac系统
他们的安装比Linux简单一些,下载与Chrome对应版本的chromedriver,然后将其路径添加进环境变量即可。
二、使用方法
以上代码就可以打印出百度的html源码了。
1. 获取JavaScript渲染的数据
下面我们来看一个例子:
浏览器打开以下链接:https://detail.tmall.com/item.htm?id=564794769484
可以看到月销量的值为95,然后我们显示网页源码,如下:
可以看到源码里面其实是没有值的。
看如下代码,我们对比requests和chrome:
可以看到,我们使用chrome的无界面模式,成功获取到了月销量的值。
2. 模拟登陆后获取cookie
笔者以微博为例,我们登陆微博并获取cookie,代码如下:
获取到了cookie之后,我们就可以使用cookie来登陆操作,使用requests来直接抓取页面了。看如下例子:
3.执行js
下面我们将百度首页的百度一下,改为搜狗二下浏览器出现:
以后每篇文章的代码都可以在github的CrawlArticles仓库查看:https://github.com/piweidong/CrawlArticles
【往期文章】
领取专属 10元无门槛券
私享最新 技术干货