selenium淘宝爬虫
使用selenium做淘宝商品爬虫
最近在学习崔庆才老师的《Python3网络爬虫开发实战》,第七章《动态渲染页面爬取》的使用selenium爬取淘宝商品,由于该书出版时间已久,淘宝的反爬机制做了其他改动,书中代码需要改进,特发此文,记录自己学习过程中遇到的问题及解决方法。
1、准备工作
确认已经安装chrome浏览器,并配置好对应版本的ChromeDriver,另外还需要正确安装selenium。
ChromeDriver各版本可在 ChromeDriver各版本下载 中查找并下载。下载完解压到你Anaconda安装目录下的Scripts目录即可。
2、页面分析
打开 淘宝主页 在搜索框键入你想要搜索的商品,进入商品列表页。比如搜“辣条”,得到以下页面:
每个商品包含该商品的基本信息,比如价格、图片、名称、店铺信息等,我们的目的就是将它们爬取下来。
拉到页面底部,会出现如下分页导航,我们爬取多页商品时,翻页需要用到它。
3、代码实现
这部分是整个项目的代码实现阶段。
3-1、模拟登陆
在学习书中代码时,书中第一步就是直接到商品列表页,但是仙子啊已经行不通了,因为淘宝改成了需要登陆账号才能访问商品列表页,因此需要模拟登陆淘宝。
首先创建account.py文件,保存自己的账号信息。之后就可以编辑登陆函数来实现登陆操作了。但是实际过程并没有这么简单,比如我遇到了以下问题。出现滑块验证,并且无论我怎么滑,都无法通过验证。上网查询解决方案,理由是淘宝检测出了我们浏览器是通过selenium打开的,因此无法访问。selenium打开的浏览器有一个特征,就是window.navigator.webdriver的值为true,而正常打开的浏览器,该值是undifine。修改webdriver为undifine试试。
根据 Chrome 79以后版本Selenium中window.navigator.webdriver 值无法更改的解决方法 我们插入以下代码:
options = ChromeOptions()
# 开启实验性功能
options.add_argument('--start-maximized') # 最大化运行(全屏窗口),不设置,取元素会报错
options.add_experimental_option('excludeSwitches', ['enable-automation'])
options.add_experimental_option('useAutomationExtension', False)
browser = webdriver.Chrome(options=options)
script = '''
Object.defineProperty(navigator, 'webdriver', {
get: () => undefined
})
'''
browser.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
"source": script})
wait = WebDriverWait(browser, 5)
试试运行结果:
遗憾失败,结果与未插入一样。可能是chrome版本升级带来的问题,试试查找chrome88.0的解决方法。
在 chrome88.0版本修改selenium的window.navigator.webdriver 文章中找到可行的解决方法。插入以下代码:
options.add_argument("--disable-blink-features=AutomationControlled")
运行试试结果:
达到目的。但是下一步也存在问题,登陆完,有个验证码拦截页面。离谱,第一天运行还没有呢,第二天就出现了。不过这个拦截比较简单,手动验证即可,验证完直接到达商品列表页。
本节代码如下:
KEYWORD = '辣条'
USER = account.USER
PASSWORD = account.PASSWORD
options = ChromeOptions()
# 开启实验性功能
options.add_argument('--start-maximized') # 最大化运行(全屏窗口),不设置,取元素会报错
options.add_experimental_option('excludeSwitches', ['enable-automation'])
options.add_experimental_option('useAutomationExtension', False)
options.add_argument("--disable-blink-features=AutomationControlled")
browser = webdriver.Chrome(options=options)
wait = WebDriverWait(browser, 5)
def login():
url = 'https://s.taobao.com/search?q=' + quote(KEYWORD)
browser