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 30 Python
特征脸(Eigenface)理论基础之PCA主成分分析法
Mar 13 Python
Python使用pickle模块实现序列化功能示例
Jul 13 Python
pycharm在调试python时执行其他语句的方法
Nov 29 Python
Django开发的简易留言板案例详解
Dec 04 Python
python 删除字符串中连续多个空格并保留一个的方法
Dec 22 Python
python实现狄克斯特拉算法
Jan 17 Python
python将字符串list写入excel和txt的实例
Jul 20 Python
django admin后管定制-显示字段的实例
Mar 11 Python
Numpy一维线性插值函数的用法
Apr 22 Python
python - timeit 时间模块
Apr 06 Python
学会Python数据可视化必须尝试这7个库
Jun 16 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
深入了解PHP类Class的概念
2012/06/14 PHP
php使用CURL不依赖COOKIEJAR获取COOKIE的方法
2015/06/17 PHP
PHP配置把错误日志以邮件方式发送方法(Windows系统)
2015/06/23 PHP
joomla数据库操作示例代码
2016/01/06 PHP
PHP生成制作验证码的简单实例
2016/06/12 PHP
Yii框架常见缓存应用实例小结
2019/09/09 PHP
dropdownlist之间的互相联动实现(显示与隐藏)
2009/11/24 Javascript
基于jQuery的仿flash的广告轮播
2010/11/05 Javascript
SharePoint 客户端对象模型 (一) ECMA Script
2011/05/22 Javascript
我的Node.js学习之路(四)--单元测试
2014/07/06 Javascript
JS跨域解决方案之使用CORS实现跨域
2016/04/14 Javascript
jQuery文字轮播特效
2017/02/12 Javascript
Webpack+Vue如何导入Jquery和Jquery的第三方插件
2017/02/20 Javascript
原生js实现倒计时--2018
2017/02/21 Javascript
纯js实现画一棵树的示例
2017/09/05 Javascript
对于input 框限定输入值为浮点型的js代码
2017/09/25 Javascript
如何将你的AngularJS1.x应用迁移至React的方法
2018/02/01 Javascript
深入理解JavaScript和TypeScript中的class
2018/04/22 Javascript
mac上配置Android环境变量的方法
2018/07/08 Javascript
vue 详情跳转至列表页实现列表页缓存
2019/03/27 Javascript
[17:45]DOTA2 HEROES教学视频教你分分钟做大人-军团指挥官
2014/06/11 DOTA
详细介绍Python语言中的按位运算符
2013/11/26 Python
python简单程序读取串口信息的方法
2015/03/13 Python
教你用Python创建微信聊天机器人
2020/03/31 Python
Jupyter Notebook 文件默认目录的查看以及更改步骤
2020/04/14 Python
美国浴缸、水槽和水龙头购物网站:Vintage Tub & Bath
2019/11/05 全球购物
医学生自我鉴定范文
2013/11/08 职场文书
村捐赠仪式答谢词
2014/01/21 职场文书
中秋节国旗下演讲稿
2014/09/05 职场文书
村党支部群众路线教育实践活动对照检查材料
2014/09/26 职场文书
教师党员个人整改措施
2014/10/27 职场文书
人事文员岗位职责
2015/02/04 职场文书
幽默导游词应该怎么写?
2019/08/26 职场文书
导游词之河姆渡遗址博物馆
2019/10/10 职场文书
python实现三阶魔方还原的示例代码
2021/04/28 Python
如何理解PHP核心特性命名空间
2021/05/28 PHP