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脚本实现网卡流量监控
Feb 14 Python
python操作 hbase 数据的方法
Dec 18 Python
用Python实现随机森林算法的示例
Aug 24 Python
在pandas中一次性删除dataframe的多个列方法
Apr 10 Python
windows下cx_Freeze生成Python可执行程序的详细步骤
Oct 09 Python
Python实现E-Mail收集插件实例教程
Feb 06 Python
python requests使用socks5的例子
Jul 25 Python
Pytorch .pth权重文件的使用解析
Feb 14 Python
基于python实现FTP文件上传与下载操作(ftp&sftp协议)
Apr 01 Python
Python+PyQt5实现灭霸响指功能
May 25 Python
解决numpy矩阵相减出现的负值自动转正值的问题
Jun 03 Python
pandas 操作 Excel操作总结
Mar 31 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
一个用于网络的工具函数库
2006/10/09 PHP
php 数组二分法查找函数代码
2010/02/16 PHP
php Smarty 字符比较代码
2011/02/27 PHP
php实现批量修改文件名称的方法
2016/07/23 PHP
JQuery之focus函数使用介绍
2013/08/20 Javascript
node.js中的console.trace方法使用说明
2014/12/09 Javascript
jQuery中:gt选择器用法实例
2014/12/29 Javascript
浅析JavaScript事件和方法
2015/02/28 Javascript
深入理解JavaScript系列(35):设计模式之迭代器模式详解
2015/03/03 Javascript
原生js和jquery实现图片轮播淡入淡出效果
2015/04/23 Javascript
jQuery支持添加事件的日历特效代码分享(3种样式)
2015/08/24 Javascript
AngularJs bootstrap搭载前台框架——准备工作
2016/09/01 Javascript
关于angularJs指令的Scope(作用域)介绍
2016/10/25 Javascript
详解在vue-cli中引用jQuery、bootstrap以及使用sass、less编写css
2017/11/08 jQuery
Javascript中绑定click事件的四种方式介绍
2018/10/26 Javascript
微信小程序与公众号实现数据互通的方法
2019/07/25 Javascript
Vuex中实现数据状态查询与更改
2019/11/08 Javascript
python中的字典操作及字典函数
2018/01/03 Python
Python3实现的Mysql数据库操作封装类
2018/06/06 Python
Pycharm代码无法复制,无法选中删除,无法编辑的解决方法
2018/10/22 Python
正确理解Python中if __name__ == '__main__'
2019/01/24 Python
Python中一般处理中文的几种方法
2019/03/06 Python
使用python搭建服务器并实现Android端与之通信的方法
2019/06/28 Python
Python原始套接字编程实例解析
2020/01/29 Python
在echarts中图例legend和坐标系grid实现左右布局实例
2020/05/16 Python
学习Python需要哪些工具
2020/09/04 Python
Python列表的深复制和浅复制示例详解
2021/02/12 Python
使用CSS Grid布局实现网格的流动
2014/12/30 HTML / CSS
丝芙兰中国官方商城:SEPHORA中国
2018/01/10 全球购物
Foot Locker澳洲官网:美国运动服和鞋类零售商
2019/10/11 全球购物
天网面试题
2013/04/07 面试题
优秀党支部书记事迹材料
2014/05/29 职场文书
四查四看自我剖析材料
2014/09/19 职场文书
升职感谢信
2015/01/22 职场文书
2015年超市收银员工作总结
2015/04/25 职场文书
教学质量月活动总结
2015/05/11 职场文书