爬虫进阶(二)

总第66篇

在前面的几篇推文中我们分享了最基础的爬虫入门,以及基于AJAX的爬虫入门,这篇我们分享关于如何利用selenium对目标网页进行数据爬取的。

01|背景介绍:

学爬虫怎么能不买一本Python爬虫书来看呢,有人推荐说《用Python写网络爬虫》这本书不错,所以决定入手一本看看,但是淘宝上卖家比较多,我该选哪家呢,我想选的肯定是质量又好(销量不错),价格又便宜的卖家,但是鉴于淘宝卖家众多,人为去筛选有点累,所以决定爬取数据来帮我选择一下。

数量果真有点多,每一页有四十多家,也就是用“用Python写网络爬虫”这个词做搜索词出现了四百多个结果,如果人为去筛选,会有多累。既然学了爬虫,就要用到实际生活中,所以用爬虫来爬取这四百多条数据。我们需要这四百条数据的销量、价格,发货地,书店名。

老规矩,我们先用预演一遍如果人工去实现这个过程会怎么做:

打开淘宝——找到输入框并输入《用Python写网络爬虫》——点击搜索——出现商品页——把第一页中的所有商品信息记录下来——然后进行翻页到下一页——重复记录信息的动作——直至最后。

如果用之前学过的爬虫知识来执行这个流程,翻页之前的步骤我们可以手动解决,也不麻烦,但是在翻页的这里卡住了,之前在爬取房天下的数据时有用到翻页,房天下数据爬取及简单数据分析,当时是通过调整url参数进行翻页的,我们看看这里的翻页可不可以通过修改参数来进行呢,结果发现参数并没有什么明显规律,所以不可以通过这个方式进行翻页操作。

除了修改参数,我们在上一篇推文中还用到另一种知识,基于AJAX请求的网页,我们去看看淘宝的页与页之间是否也是采用AJAX请求的,如果是的话可以通过AJAX去或获取每一页的url,然后去进行下一步。可查看前一篇基于AJAX请求的网页爬取:爬虫进阶(一)。通过浏览XHR对象,发现并没有翻页的AJAX的请求,看来此方法也行不通,那么有没有一种方法可以直接点击下一页来进行翻页操作呢,答案是有的,我们这次就分享这种可以模拟人体操作网页的技术——selenium。

02|selenium介绍:

1、selenium是什么

Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE、Mozilla Firefox、Chrome等。更多信息移步官网:http://www.seleniumhq.org/

2、用selenium能做什么

Selenium Python绑定提供了使用Selenium WebDriver编写功能/验收测试的简单API。通过Selenium Python API,您可以直观地访问Selenium WebDriver的所有功能,说的直白一点,就是他可以模拟操作几乎我们人手动对浏览器可以做的所有行为。

在本篇内容中,我们将利用selenium去进行打开淘宝页面、输入关键词、点击搜索、翻页等操作,下图为一些API。

更多详细功能介绍移步:http://selenium-python.readthedocs.io/api.html#module-selenium.webdriver.remote.webelement

03|开始爬取数据:

1、爬取目标确立

要获取《用Python写网络爬虫》这个关键词下面的所有信息,包括价格、销量、店铺名、发货地址四个信息。

2、分析目标网页

在背景介绍里面已经分析过,目标网页不适合用以前学过的知识进行爬取,需要用新的知识—selenium去进行爬取。

3、爬取流程确立

在前面的背景介绍里面已经预演过一遍,我们直接复制过来即可。

打开淘宝——找到输入框并输入《用Python写网络爬虫》——点击搜索——出现商品页——把第一页中的所有商品信息记录下来——然后进行翻页到下一页——重复记录信息的动作——直至最后。

这里所有的过程我们都使用selenium来完成,而不是人为的去点击。

4、开始编写程序

#导入相关库

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这个功能感觉好强大,本来录制一段浏览器自动化运行的视频,但是效果不太理想,就没放上来,建议大家深入了解一下这个库,还是很不错的。

原文发布于微信公众号 - 张俊红(zhangjunhong0428)

原文发表时间:2017-04-26

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏哲学驱动设计

产品前端重构(TypeScript、MVC框架设计)

最近两周完成了对公司某一产品的前端重构,本文记录重构的主要思路及相关的设计内容。 公司期望把某一管理类信息系统从项目代码中抽取、重构为一个可复用的产品。该系统的...

27980
来自专栏林德熙的博客

win10 uwp 使用油墨输入 保存,修改,加载inkUWP 手写清理笔画手写识别无法识别手写语音

现在很多人还是使用笔和纸来记录,那么可以在电脑输入方式和之前使用的方式一样,很多用户觉得会方便。在win10 我们有一个简单的方法去让用户输入,InkCanva...

26410
来自专栏信安之路

我是如何找到 Google Colaboratory 中的一个 xss 漏洞的

在本文中,我来讲讲我碰到的一个有趣的 XSS。2018 年 2 月,我在 google 的一个网络应用中发现了这个 XSS。这篇文章我不希望只是直接写出这个 X...

12700
来自专栏phodal

让你的「微信小程序」运行在Chrome浏览器上,让我们使用WebStorm

「微信小程序」的开发框架体验起来,还不错——自带了UI框架。但是问题是他的IDE,表现起来相当的糟糕——其实主要是因为,我当时买WebStorm License...

77260
来自专栏進无尽的文章

扒虫篇- Bug日志 Ⅷ

不执行的原因是 在VC中使用这个ImageUploaderManager时,需要设置为全局变量,如果是局部变量的话,很快会被销毁掉,其中的代理自然不会执行了。

20430
来自专栏北京马哥教育

LaTeXila:Linux 的多语言 LaTeX 编辑器简介

豌豆贴心提醒,本文阅读时间7分钟 LaTeXila 是一个多语言 LaTeX 编辑器,专为那些偏爱 GTK+ 外观的 Linux 用户设计。这个软件除了操作简...

36290
来自专栏Jerry的SAP技术分享

CRM WebClient UI和Hybris里工作中心跳转的url生成逻辑

把Work center的navigation target在client side不可见:在Chrome development tool里看不到,而是点击了...

36240
来自专栏李想的专栏

使用腾讯云无服务器云函数(SCF)分析天气数据

无服务器云函数(SCF)是腾讯云提供的Serverless执行环境,也是国内首款FaaS(Function as a Service,函数即服务) 产品。其核心...

1K70
来自专栏闰土大叔

在没有DOM操作的日子里,我是怎么熬过来的(中)

前言 继上篇推送之后,在掘金、segmentfault、简书、博客园等平台上迅速收到了不俗的反馈,大部分网友都留言说感同身受,还有不少网友追问中篇何时更新。于是...

354110
来自专栏腾讯NEXT学位

React 16 加载性能优化指南(下)

| 导语 本篇干货是接本周三React 16 加载性能优化指南(上)推文。 关于 React 应用加载的优化,其实网上类似的文章已经有太多太多了,随便一搜就是...

45020

扫码关注云+社区

领取腾讯云代金券