总第66篇
在前面的几篇推文中我们分享了最基础的爬虫入门,以及基于AJAX的爬虫入门,这篇我们分享关于如何利用selenium对目标网页进行数据爬取的。
学爬虫怎么能不买一本Python爬虫书来看呢,有人推荐说《用Python写网络爬虫》这本书不错,所以决定入手一本看看,但是淘宝上卖家比较多,我该选哪家呢,我想选的肯定是质量又好(销量不错),价格又便宜的卖家,但是鉴于淘宝卖家众多,人为去筛选有点累,所以决定爬取数据来帮我选择一下。
数量果真有点多,每一页有四十多家,也就是用“用Python写网络爬虫”这个词做搜索词出现了四百多个结果,如果人为去筛选,会有多累。既然学了爬虫,就要用到实际生活中,所以用爬虫来爬取这四百多条数据。我们需要这四百条数据的销量、价格,发货地,书店名。
老规矩,我们先用预演一遍如果人工去实现这个过程会怎么做:
打开淘宝——找到输入框并输入《用Python写网络爬虫》——点击搜索——出现商品页——把第一页中的所有商品信息记录下来——然后进行翻页到下一页——重复记录信息的动作——直至最后。
如果用之前学过的爬虫知识来执行这个流程,翻页之前的步骤我们可以手动解决,也不麻烦,但是在翻页的这里卡住了,之前在爬取房天下的数据时有用到翻页,房天下数据爬取及简单数据分析,当时是通过调整url参数进行翻页的,我们看看这里的翻页可不可以通过修改参数来进行呢,结果发现参数并没有什么明显规律,所以不可以通过这个方式进行翻页操作。
除了修改参数,我们在上一篇推文中还用到另一种知识,基于AJAX请求的网页,我们去看看淘宝的页与页之间是否也是采用AJAX请求的,如果是的话可以通过AJAX去或获取每一页的url,然后去进行下一步。可查看前一篇基于AJAX请求的网页爬取:爬虫进阶(一)。通过浏览XHR对象,发现并没有翻页的AJAX的请求,看来此方法也行不通,那么有没有一种方法可以直接点击下一页来进行翻页操作呢,答案是有的,我们这次就分享这种可以模拟人体操作网页的技术——selenium。
Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE、Mozilla Firefox、Chrome等。更多信息移步官网:http://www.seleniumhq.org/
Selenium Python绑定提供了使用Selenium WebDriver编写功能/验收测试的简单API。通过Selenium Python API,您可以直观地访问Selenium WebDriver的所有功能,说的直白一点,就是他可以模拟操作几乎我们人手动对浏览器可以做的所有行为。
在本篇内容中,我们将利用selenium去进行打开淘宝页面、输入关键词、点击搜索、翻页等操作,下图为一些API。
更多详细功能介绍移步:http://selenium-python.readthedocs.io/api.html#module-selenium.webdriver.remote.webelement
要获取《用Python写网络爬虫》这个关键词下面的所有信息,包括价格、销量、店铺名、发货地址四个信息。
在背景介绍里面已经分析过,目标网页不适合用以前学过的知识进行爬取,需要用新的知识—selenium去进行爬取。
在前面的背景介绍里面已经预演过一遍,我们直接复制过来即可。
打开淘宝——找到输入框并输入《用Python写网络爬虫》——点击搜索——出现商品页——把第一页中的所有商品信息记录下来——然后进行翻页到下一页——重复记录信息的动作——直至最后。
这里所有的过程我们都使用selenium来完成,而不是人为的去点击。
#导入相关库
import refrom selenium
import webdriverfrom selenium.common.exceptions
import TimeoutException
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from bs4 import BeautifulSoup
#创建空列表用于存放数据
sales=[]
prices=[]
adresses=[]
shopname=[]
#输入关键字并进行搜索
browser = webdriver.Chrome()#创建一个浏览器对象
browser.get('https://www.taobao.com')#给浏览器传入一个url参数
input=WebDriverWait(browser,10).until(EC.presence_of_element_located((By.CSS_SELECTOR, '#q')))#等到输入框加载完成
submit=WebDriverWait(browser,10).until(EC.element_to_be_clickable((By.CSS_SELECTOR,'#J_TSearchForm > div.search-button > button')))#等到点击搜索按钮加载完成
input.send_keys("用Python写网络爬虫")#向输入框输入关键字进行搜索
submit.click()#点击搜索按钮
#连续翻页并进行解析
for i in range(2,10):
#等待页码框加载完成
input1=WebDriverWait(browser,10).until(EC.presence_of_element_located((By.CSS_SELECTOR, '#mainsrp-pager > div > div > div > div.form > input')))
#等待确定按钮加载完成
submit1=WebDriverWait(browser,10).until(EC.element_to_be_clickable((By.CS S_SELECTOR, '#mainsrp-pager > div > div > div > div.form > span.btn.J_Submit')))
input1.clear()#清空输入框
input1.send_keys(i)#向输入框输入页码数
submit1.click()#点击确定按钮
WebDriverWait(browser,10).until(EC.text_to_be_present_in_element(
(By.CSS_SELECTOR, '#mainsrp-pager > div > div > div > ul > li.item.active > span'), str(i)))#等待页码跳转成功
WebDriverWait(browser,10).until(EC.presence_of_element_located((By.CSS_SELECTOR, '.m-itemlist .items .item')))#等待商品页加载完成
#开始网页解析
html=browser.page_source
soup = BeautifulSoup(html,'lxml')
for name in soup.select(".item .shopname"):
shopname.append(name.text[6:-1])
for sale in soup.select(".item .deal-cnt"):
sales.append(sale.text[:-3])
for price in soup.select(".item strong"):
prices.append(price.text)
for adress in soup.select(".item .location"):
adresses.append(adress.text)
最后把各个列表进行合并,生成一个DataFrame进行输出,下图为部分结果示例。
PS:
selenium这个功能感觉好强大,本来录制一段浏览器自动化运行的视频,但是效果不太理想,就没放上来,建议大家深入了解一下这个库,还是很不错的。