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装饰器基础详解
Mar 09 Python
《Python学习手册》学习总结
Jan 17 Python
python re模块findall()函数实例解析
Jan 19 Python
python如何拆分含有多种分隔符的字符串
Mar 20 Python
深入浅析Python的类
Jun 22 Python
python使用turtle库绘制时钟
Mar 25 Python
python3+selenium实现qq邮箱登陆并发送邮件功能
Jan 23 Python
python调用其他文件函数或类的示例
Jul 16 Python
python框架django项目部署相关知识详解
Nov 04 Python
Python对称的二叉树多种思路实现方法
Feb 28 Python
python GUI库图形界面开发之PyQt5信号与槽的高级使用技巧(自定义信号与槽)详解与实例
Mar 06 Python
python神经网络学习 使用Keras进行回归运算
May 04 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做文字水印时提示call an undefined function exif_imagetype()解决方法
2014/10/30 PHP
php实现singleton()单例模式实例
2014/11/06 PHP
浅析PHP关键词替换的类(避免重复替换,保留与还原原始链接)
2015/09/22 PHP
PHP中用mysqli面向对象打开连接关闭mysql数据库的方法
2016/11/05 PHP
laravel admin实现分类树/模型树的示例代码
2020/06/10 PHP
JavaScript 监听textarea中按键事件
2009/10/08 Javascript
javascript页面动态显示时间变化示例代码
2013/12/18 Javascript
JavaScript下的时间格式处理函数Date.prototype.format
2016/01/27 Javascript
js编写当天简单日历效果【实现代码】
2016/05/03 Javascript
AngularJS动态加载模块和依赖的方法分析
2016/11/08 Javascript
ES6入门教程之Iterator与for...of循环详解
2017/05/17 Javascript
基于react框架使用的一些细节要点的思考
2017/05/31 Javascript
还不懂递归?读完这篇文章保证你会懂
2018/07/29 Javascript
jquery操作checkbox的常用方法总结【附测试源码下载】
2019/06/10 jQuery
javascript History对象原理解析
2020/02/17 Javascript
[52:44]VGJ.T vs infamous Supermajor小组赛D组败者组第一轮 BO3 第一场 6.3
2018/06/04 DOTA
python应用程序在windows下不出现cmd窗口的办法
2014/05/29 Python
分析Python中设计模式之Decorator装饰器模式的要点
2016/03/02 Python
Python装饰器用法示例小结
2018/02/11 Python
Python实现绘制双柱状图并显示数值功能示例
2018/06/23 Python
python中aioysql(异步操作MySQL)的方法
2019/04/11 Python
Python如何应用cx_Oracle获取oracle中的clob字段问题
2019/08/27 Python
PyTorch里面的torch.nn.Parameter()详解
2020/01/03 Python
Python中猜拳游戏与猜筛子游戏的实现方法
2020/09/04 Python
详解python日志输出使用配置文件格式
2021/02/10 Python
HTML5标签大全
2016/11/23 HTML / CSS
Java语言程序设计测试题判断题部分
2013/01/06 面试题
关于廉洁的广播稿
2014/01/30 职场文书
就业推荐表自我鉴定范文
2014/03/21 职场文书
《谁的本领大》教后反思
2014/04/25 职场文书
大学计划书范文800字
2014/08/14 职场文书
意外伤害赔偿协议书范本
2014/09/28 职场文书
小学生作文批改评语
2014/12/25 职场文书
2016国庆节活动宣传语
2015/11/25 职场文书
话题作文之呼唤
2019/12/18 职场文书
剑指Offer之Java算法习题精讲二叉树专项训练
2022/03/21 Java/Android