这篇博客主要是通过Selenium来模拟浏览器操作,抓取淘宝商品的信息,并将结果保存到MongoDB中。
淘宝为什么需要用所谓的Selenium
来进行抓取呢,是因为淘宝这种页面,其Ajax接口包含很多加密参数,我们很难从中找出规律。为了解决这个问题,我们引入Selenium
。
Selenium简介
Selenium
是自动化测试工具,利用它可以驱动浏览器执行特定的动作,比如点击、下拉等操作,同时还可以获取浏览器当前呈现的页面源代码,做到可见即可爬,对于一些JavaScript
动态渲染的页面来说,这种抓取很有效。除了需要Selenium
之外,还需要与之搭配的浏览器,因此需要Chrome
浏览器和ChromeDriver
驱动的配置
Selenium
安装
1
2 >pip install selenium
>
ChromDriver
安装
首先查看Chrome的版本号:通过点击Chrome的菜单帮助->关于Google Chrome里面就有其版本号
然后根据Chrome的版本号,下载ChromeDriver的型号。
然后配置环境变量,具体看《python3 网络爬虫开发实战》的介绍。
Selenium
的使用
- 申明浏览器对象并访问页面
1
2
3
4
5
6
7 >>from selenium import webdriver
>>
>>browser = webdriver.Chrome()
>>browser.get('http://www.taobao.com')
>>print(browser.page_source)
>>browser.close()
>>
查找节点
单个节点
查找单个节点比如搜索框,首先要看源码,通过选定页面元素,可以在网页源码中查看到,可以通过
find_element_by_name()
以及find_element_by_id()或者find_element(BY,ID,id)
来获取相关的属性。多个节点
获取多个节点可以通过
find_elements()
来得到。节点交互
节点交互就是模拟我们平常在网页上的操作。比如下面这个
1
2
3
4
5
6
7
8
9
10
11
12
13 > >from selenium import webdriver
> >import time
> >
> >browser = webdriver.Chrome()
> >browser.get('http://www.taobao.com')
> >input=browser.find_element_by_id('q')
> >input.send_keys('iphone')
> >time.sleep(1)
> >input.clear()
> >input.send_keys('ipad')
> >button=browser.find_element_by_class_name('btn-search')
> >button.click()
> >
更多的常见节点动作操作,可以查看官方文档
动作链
比如执行鼠标拖动、键盘按键灯没有特定执行对象的操作,就需要使用动作链来执行。比如下面这段代码实现将一个节点拖曳至另一个节点处。
1
2
3
4
5
6
7
8
9
10
11
12
13 > >from selenium import webdriver
> >from selenium.webdriver import ActionChains
> >
> >browser = webdriver.Chrome()
> >url = 'http://www.runoob.com/'
> >browser.get(url)
> >browser.switch_to_frame('iframeResult')
> >source =browser.find_element_by_css_selector('#draggable')
> >target =browser.find_element_by_css_selector('#droppable')
> >actions=ActionChains(browser)
> >actios.drag_and_drop(source,target)
> >action.perform()
> >
执行JavaScript以及获取节点信息
selenium还可以执行API没有的功能可以用执行JavaScript,通过page_source属性获取网页源代码,接着使用解析库(正则表达式,BeautifulSoup,pyquery)来提取信息。
切换Frame以及延时等待
我们网页有一种节点叫iframe,也就是子Frame,相当于页面的子页面,他的结构和外部网页结构完全一致。
Splash
的使用
Splash是一个JavaScript渲染服务,是一个带有HTTP API的轻量级浏览器,同时他对python中的Twisted和QT库
使用Selenium
爬取淘宝商品
爬取思路
爬取淘宝上的商品的爬虫程序主要分为四个大的部分:
- 获取商品列表
抓取的入口就是淘宝的搜索页面,这个连接可以通过直接构造函数来进行访问,搜索iPad就可以直接通过网址
http://s.taobao.com/search?q=ipad
将呈现第一页的搜索结果。
- 解析商品列表
当成功加载了一页商品之后,利用selenium就可以获取页面源代码,然后再用相应的解析库
Pyquery
库解析就行了。
- 保存到MongoDB
创建一个MongoDB的连接对象,指定数据库。
- 遍历每页
商品的搜索结果一般最大都是100页,要获取每页的内容就需要有翻页操作,可以通过在文本框中
输入页码
,点击确定
进行翻页,不推荐使用下一页
,因为直接点击下一页容易出现加载失败的情况。
代码
1 | from selenium import webdriver |