Python使用Selenium+BeautifulSoup爬取淘宝搜索页


Posted in Python onFebruary 24, 2018

使用Selenium驱动chrome页面,获得淘宝信息并用BeautifulSoup分析得到结果。

使用Selenium时注意页面的加载判断,以及加载超时的异常处理。

import json
import re
from bs4 import BeautifulSoup
from selenium import webdriver
from 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

browser = webdriver.Chrome()
# 浏览器需要多次使用,所以单独拿出来。设置一个最长的等待时间,等待目标加载完成
wait = WebDriverWait(browser, 10)


def search(keyword):
 # wait容易出现加载时间长的问题,因此用try来捕捉异常
 try:
 browser.get('https://www.taobao.com')
 # 加载需要一定时间的,设置了等待时间,等待加载
 # 输入按钮的加载等待
 input = wait.until(
  # 设置加载目标,它是一个选择器,参数是需要选择方式和等待加载的内容
  EC.presence_of_element_located((By.CSS_SELECTOR, "#q")) # 选择CSS选择器和选择内容
 )
 # 提交按钮
 submit = wait.until(
  # EC后面是选择条件,按钮的加载条件最好的是element_to_be_clickable,意思为元素可以点击的
  EC.element_to_be_clickable((By.CSS_SELECTOR, "#J_TSearchForm > div.search-button > button"))
 )
 input.send_keys(keyword) # send_keys对输入框输入内容
 submit.click() # 提交搜索内容,进入下一个页面
 # 等待页码元素加载完成,并返回最大页码数
 total = wait.until(
  EC.presence_of_element_located((By.CSS_SELECTOR, "#mainsrp-pager > div > div > div > div.total"))
 )
 # 等待加载完成后获取信息
 get_products()
 return total.text
 except TimeoutException:
 # 超时后重新请求,因此递归调用
 return search()


def next_page(page_number):
 try:
 # 页码输入框和翻页按钮
 input = wait.until(
  EC.presence_of_element_located((By.CSS_SELECTOR, "#mainsrp-pager > div > div > div > div.form > input"))
 )
 # 提交按钮
 submit = wait.until(
  EC.element_to_be_clickable(
  (By.CSS_SELECTOR, "#mainsrp-pager > div > div > div > div.form > span.btn.J_Submit"))
 )
 input.clear()
 input.send_keys(page_number)
 submit.click()
 # 判断翻页成功
 wait.until(
  EC.text_to_be_present_in_element((By.CSS_SELECTOR,
      '#mainsrp-pager > div > div > div > ul > li.item.active > span'),
      str(page_number)))
 get_products()
 except TimeoutException:
 return next_page(page_number)


def get_products():
 # 判断单个页面是否被加载出来
 wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '#mainsrp-itemlist .items .item')))
 html = browser.page_source # 获取页面源代码,所有的
 # 使用BS进行分析
 soup = BeautifulSoup(html, 'lxml')
 items = soup.select('#mainsrp-itemlist .items .item')
 for item in items:
 image = item.select('.pic .img')[0]['data-src']
 price = item.select('.price strong')[0].text
 deal = item.select('.deal-cnt')[0].text[:-3]
 title = item.select('.title')[0].text.strip()
 shop = item.select('.shop')[0].text.strip()
 location = item.select('.location')[0].text
 product = {
  'image': image,
  'price': price,
  'deal': deal,
  'title': title,
  'shop': shop,
  'location': location
 }
 save_text(product) # 下载内容


def save_text(product):
 # 保存为txt文件,a追加写模式,编码模式utf-8
 with open('text.txt', 'a', encoding='utf-8') as f:
 # 使用JSON把字典转换为str格式,加换行符
 f.write(json.dumps(product, ensure_ascii=False) + '\n')
 f.close()


def main():
 # 通过关键字在淘宝进行搜索
 total = search('美食')
 # 用正则提取页码数字
 total = int(re.compile('(\d+)').search(total).group(1))
 # 翻页
 for i in range(2, total+1): # 循环包含前,不包含尾
 next_page(i)
 browser.close()


if __name__ == '__main__':
 main()

更多内容请参考专题《python爬取功能汇总》进行学习。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python的Bottle框架的一些使用技巧介绍
Apr 08 Python
详解Python中expandtabs()方法的使用
May 18 Python
python 时间戳与格式化时间的转化实现代码
Mar 23 Python
如何利用Python分析出微信朋友男女统计图
Jan 25 Python
python config文件的读写操作示例
Sep 27 Python
Python 获取命令行参数内容及参数个数的实例
Dec 20 Python
Pytorch实现各种2d卷积示例
Dec 30 Python
pytorch载入预训练模型后,实现训练指定层
Jan 06 Python
为什么说python更适合树莓派编程
Jul 20 Python
python中xlutils库用法浅析
Dec 29 Python
python 如何读、写、解析CSV文件
Mar 03 Python
在pyCharm中下载第三方库的方法
Apr 18 Python
python3+mysql查询数据并通过邮件群发excel附件
Feb 24 #Python
Python3实现带附件的定时发送邮件功能
Dec 22 #Python
python正则实现提取电话功能
Feb 24 #Python
python3实现公众号每日定时发送日报和图片
Feb 24 #Python
详解如何在python中读写和存储matlab的数据文件(*.mat)
Feb 24 #Python
使用python和pygame绘制繁花曲线的方法
Feb 24 #Python
python3操作微信itchat实现发送图片
Feb 24 #Python
You might like
ThinkPHP学习笔记(一)ThinkPHP部署
2014/06/22 PHP
详解将数据从Laravel传送到vue的四种方式
2019/10/16 PHP
thinkphp5.1 框架导入/导出excel文件操作示例
2020/05/25 PHP
javascript取消文本选定的实现代码
2010/11/14 Javascript
通过JavaScript控制字体大小的代码
2011/10/04 Javascript
javascript 二进制运算技巧解析
2012/11/27 Javascript
JavaScript中的条件判断语句使用详解
2015/06/03 Javascript
vue省市区三联动下拉选择组件的实现
2017/04/28 Javascript
vue.js学习之UI组件开发教程
2017/07/03 Javascript
史上最全JavaScript常用的简写技巧(推荐)
2017/08/17 Javascript
node.js部署之启动后台运行forever的方法
2018/05/23 Javascript
linux 后台运行node服务指令方法
2018/05/23 Javascript
vue 1.0 结合animate.css定义动画效果
2018/07/11 Javascript
node.js使用免费的阿里云ip查询获取ip所在地【推荐】
2018/09/03 Javascript
服务端预渲染之Nuxt(使用篇)
2019/04/08 Javascript
[01:58]2018DOTA2亚洲邀请赛趣味视频——交流
2018/04/03 DOTA
python利用elaphe制作二维条形码实现代码
2012/05/25 Python
浅谈使用Python变量时要避免的3个错误
2017/10/30 Python
python和c语言的主要区别总结
2019/07/07 Python
pygame实现弹球游戏
2020/04/14 Python
解决Keras中循环使用K.ctc_decode内存不释放的问题
2020/06/29 Python
python使用selenium爬虫知乎的方法示例
2020/10/28 Python
如何通过python计算圆周率PI
2020/11/11 Python
python 用opencv实现霍夫线变换
2020/11/27 Python
python3实现简单飞机大战
2020/11/29 Python
Python操作PostgreSql数据库的方法(基本的增删改查)
2020/12/29 Python
Dr. Martens马汀博士法国官网:马丁靴鼻祖
2020/01/15 全球购物
写出程序把一个链表中的接点顺序倒排
2014/04/28 面试题
linux面试题参考答案(4)
2014/09/21 面试题
高三毕业典礼主持词
2014/03/27 职场文书
森林防火宣传标语
2014/06/27 职场文书
旅游饭店管理专业自荐书
2014/06/28 职场文书
旅行社优秀创业计划书
2014/08/16 职场文书
城管个人总结
2015/02/28 职场文书
停车场管理制度范本
2015/08/05 职场文书
《赵州桥》教学反思
2016/02/17 职场文书