您的位置:首页 > 编程语言 > Python开发

Python使用Selenium webdriver爬虫某电商商品数据

2018-01-22 23:28 1251 查看
周末两天在家带孩子没有更新博客,今天用Selenium webdriver设计了一个爬虫程序,来获取某电商平台的商品信息。

 首先简单介绍一下什么是Selenium webdriver。Selenium本身是一个项目的名字,它包含了一组使用工具以及一套API函数,

Selenium webdriver只是它的一个套件而已。Selenium webdriver本质上是一个支持浏览器自动化测试的工具,它可以为不同的浏

览器提供驱动,从而开发人员可以使用自己擅长的语言来编写自动化测试脚本。

Webdriver可以为多种语言提供类库,webdriver用driver去对不同的浏览器进行控制。目前主流的几大浏览器Chrome,

Firefox,Safari,IE都可以提供驱动。

本项目其实只是使用了Selenium
webdriver中很简单的功能,就是开发网页,同时把网页中需要的信息抓取到即可。

接下来需要介绍一下Selenium
webdriver在Python中的配置方法。

安装Selenium,当然这要求你有pip安装工具包

pip install selenium

下载webdriver驱动器。我这里使用的是chrome,因此需要下载chromedriver.exe。下面是下载的地址:
http://chromedriver.storage.googleapis.com/index.html
这里要特别提醒一下,chromedriver.exe不同的版本对应不同版本的chrome浏览器,我使用的chrome浏览器的版本是63.0.3239.192。对应的chromdriver.exe的版本是v2.35。至于不同版本之间的对应关系,大家可以参考下面的这篇文章。
http://blog.csdn.net/huilan_same/article/details/51896672。
下载完webdriver之后,需要把chromedriver.exe拷贝到chrome浏览器的安装目录下,一般大家的chrome的安装目录都是

C:\Program Files (x86)\Google\Chrome\Application。最后把该目录的路径拷贝到系统的环境变量中即可。注意不同的环境变量要用;隔开。

好了,Selenium webdriver的开发环境我们已经搭建完毕,下面我们就可以正式进入爬虫程序的编写阶段。

首先说明一下,这段代码是爬取“一起火”网站的大衣产品的名称与价格,并且打印出来。我们把代码分成几个部分,一段一段来看。

# encoding=utf-8
import time
from selenium import webdriver
import io
import sys
sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='utf-8')

这部分代码自然不必说,还是为了能够在sublime中打印中文字符,同时我们引入了Selenium webdriver这个包。

我们接着往下看
browser = webdriver.Chrome()
browser.set_page_load_timeout(30)

这里使用webdriver构造了一个对象,同时设置了读取每页信息的时间间隔 

# 有多少页商品
browser.get('http://www.17huo.com/search.html?sq=2&keyword=%E5%A4%A7%E8%A1%A3')
page_info = browser.find_element_by_css_selector('body > div.wrap > div.pagem.product_list_pager > div')
pages = int((page_info.text.split('. ')[0]).split(' ')[1])

读取一页信息,主要是获取商品的总页数。这里是使用了基于DOM的CSS选择器,此处涉及一些web前端的知识,HTML,CSS以及JS,这些内容就比较多了,大家有兴
b37e
趣可以自己补充一下,这里不再多说。

最终商品的页数就存在pages这个变量中。

for i in range(pages):
if i > 5:
break
url = 'http://www.17huo.com/?mod=search&sq=2&keyword=%E5%A4%A7%E8%A1%A3&page=' + str((i + 1))
browser.get(url)
browser.execute_script('window.scrollTo(0, document.body.scrollHeight);')
time.sleep(2)
goods = browser.find_element_by_css_selector('body > div.wrap > div:nth-child(2) > div.p_main > ul').find_elements_by_tag_name('li')
print('第%d页有%d件商品' % ((i + 1), len(goods)))

这里程序是一页一页来读取商品的信息,每页里商品的信息就保存在goods这个list中。为了节省时间,我们这里只抓取前5页的信息,当大于5时,程序就跳出。

 这里要特别注意其中这行代码

browser.execute_script('window.scrollTo(0, document.body.scrollHeight);')

有些页面时动态渲染了,页面没有往下滑动时,下面的页面是不会渲染的。这样信息就会读不完整,因此我们需要手动的操作一下页面,使其滑动到页面的底部,让所有的内容都渲染出来。这是一行JavaScript代码,意思就是让页面滑动到底部。

 最后一部分代码

for good in goods:
try:
title = good.find_element_by_css_selector('a:nth-child(1) > p:nth-child(2)').text
price = good.find_element_by_css_selector('div > a > span').text
print(title, price)
except Exception as e:
print(e)

最后就是打印前5页的所有商品的title和价格。此处用try做了处理,因为我发现有些页面的DOM并没有严格按照span这样的格式来,因此会出现错误的情况,这里偷懒就用了try。有兴趣的小伙伴可以把检测是否为正常DOM的代码补上。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐