项目介绍:
本文主要介绍利用selenium库对动态渲染页面的抓取,并介绍一些反爬的操作,以淘宝网为例。Selenium简介:
- Selenium是一个自动化测试工具,利用它可以实现驱动浏览器,模拟人真实的行为,如点击,下拉等操作;
- 在访问服务器方面,它的安全性是高于requests库的,不需要构造虚拟请求,所有的操作都真实发生;
- 同时,selenium获取网页信息的方法是基于网页的elements而不是network,即获得当前页面封装后的代码(通常浏览器的network获得服务器的文件是json或html格式,需要解析方才组成elements);
- Selenium主要解决JavaScript动态渲染页面的数据抓取;
- Selenium支持多种浏览器,本文以Chrome为例,需要浏览器驱动webdriver,下载地址为:ChromeDriver ,选择对应浏览器的相对应版本进行安装;
- Selenium版本:3.141.0;官方文档:中文链接;
问题描述:
from urllib.parse import quote
from selenium import webdriver
browser=webdriver.Chrome()
browser.maximize_window()
browser.get('https://s.taobao.com/search?q='+quote('iphone'))
- 这里是正常情况下使用selenium库中的webdriver去请求淘宝网出现的情况,遇见了输入账号密码的情况,下面以此问题展开介绍解决方式。
解决方案:
修改options属性:
- webdriver.Chrome()具有多个属性,其中之一为options属性,默认值为None;
- options属性可以通过Options类来进行赋值,传入到webdriver.Chrome()中,进而改变浏览器的操作方式,下面的代码块即为Options类,它具有很多属性,我们就是通过改变这些属性值来实现网页的请求;
代码如下(示例):
class Options(object):
KEY = "goog:chromeOptions"
def __init__(self):
self._binary_location = ''
self._arguments = []
self._extension_files = []
self._extensions = []
self._experimental_options = {}
self._debugger_address = None
self._caps = DesiredCapabilities.CHROME.copy()
具体操作如下:
- 通过self._arguments = []属性,在本地创建一个Chrome配置目录,这样做的原因是因为:创建一个新的目录就不会影响源目录,其次如果我们用已经添加这个属性的webdriver.Chrome()会记录我们之前的信息,如登陆的账号密码等,这样就可以解决登陆问题而不会出现登陆弹窗;
代码如下(示例):
option.add_argument('--user-data-dir=~/code/chrome-test')
–user-data-dir是配置文件变量名,~/code/chrome-test是放入配置文件的目录,这个目录是自己指定,自己选择,读者根据自己的系统和预存路径自行选择;
如果你已经运行了,并且登陆了淘宝网的账号,运行代码,进行了前几次访问可能会正常,但是之后就会出现了下图的问题
- 我们可以再次配置self._arguments = []属性,修改我们的请求头即‘–user-agent’,这里的请求头可以从自己的Google浏览器里去查找,在地址搜索栏中输入chrome://version/,获取自己的Chrome的配置信息,得到自己的–user-agent;
代码如下(示例):
option.add_argument('--user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 11_1_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36')
- 为了安全起见,我们再把chorme的头部的自动化检测信息消除掉,因为往往大多的反爬虫机制都是检测此信息(如下图所示);
代码如下(示例):
option.add_argument("--disable-blink-features=AutomationControlled")
option.add_experimental_option("excludeSwitches", ["enable-automation"])
option.add_experimental_option('useAutomationExtension', False)
- 改变以上属性后,则可以呈现出淘宝商品页面如下;
整体代码如下(示例)::
from selenium.webdriver.chrome.options import Options
option = Options()
option.add_extension("/Users/sunsky/Desktop/Crawler/ScrapyTools/mcbpblocgmgfnpjjppndjkmgjaogfceg/take-webpage-screenshots.crx")
option.add_experimental_option("excludeSwitches", ["enable-automation"])
option.add_experimental_option('useAutomationExtension', False)
option.add_argument("--disable-blink-features=AutomationControlled")
option.add_argument('--user-data-dir=~/code/chrome-test')
option.add_argument('--user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 11_1_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36')
browser=webdriver.Chrome(options=option)
我们已经建立好可以请求淘宝页面的webdriver对象,所以下面可以按照正常的爬虫流程进行操作;
- 对Options()对象添加变量(option.add_argument())有很多选择,本文只是列举了一部分,更多的变量添加可以参考:https://sites.google.com/a/chromium.org/chromedriver/capabilities
- 本文是通过自动化检测工具Selenium进行数据抓取,一般的做法(reques库+解析库)请参考抓取天猫网商品信息
数据抓取:
未完待续!!!