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 getopt 参数处理小示例
Jun 09 Python
详解Python中的__getitem__方法与slice对象的切片操作
Jun 27 Python
Linux RedHat下安装Python2.7开发环境
May 20 Python
Python双精度浮点数运算并分行显示操作示例
Jul 21 Python
python使用turtle绘制分形树
Jun 22 Python
pymongo中聚合查询的使用方法
Mar 22 Python
Python爬取数据保存为Json格式的代码示例
Apr 09 Python
python Matplotlib底图中鼠标滑过显示隐藏内容的实例代码
Jul 31 Python
使用python实现离散时间傅里叶变换的方法
Sep 02 Python
浅谈pytorch、cuda、python的版本对齐问题
Jan 15 Python
基于python实现matlab filter函数过程详解
Jun 08 Python
Django中ORM的基本使用教程
Dec 22 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实现按文件名搜索文件的远程文件查找器
2014/05/10 PHP
ThinkPHP调用百度翻译类实现在线翻译
2014/06/26 PHP
PHP SPL标准库之SplFixedArray使用实例
2015/05/12 PHP
PHP集成环境XAMPP的安装与配置
2018/11/13 PHP
使用jquery为table动态添加行的实现代码
2011/03/30 Javascript
JavaScript var声明变量背后的原理示例解析
2013/10/12 Javascript
jquery解析xml字符串示例分享
2014/03/25 Javascript
js操作输入框提示信息且响应鼠标事件
2014/03/25 Javascript
JavaScript字符串对象charAt方法入门实例(用于取得指定位置的字符)
2014/10/17 Javascript
Js为表单动态添加节点内容的方法
2015/02/10 Javascript
angular2使用简单介绍
2016/03/01 Javascript
javascript加减乘除的简单实例
2016/07/12 Javascript
Vuejs实现购物车功能
2017/11/05 Javascript
JavaScript实现职责链模式概述
2018/01/25 Javascript
vuex存储token示例
2019/11/11 Javascript
jQuery操作元素追加内容示例
2020/01/10 jQuery
matplotlib中legend位置调整解析
2017/12/19 Python
tensorflow中next_batch的具体使用
2018/02/02 Python
解决python3运行selenium下HTMLTestRunner报错的问题
2018/12/27 Python
Python面向对象之类的定义与继承用法示例
2019/01/14 Python
详解python 利用echarts画地图(热力图)(世界地图,省市地图,区县地图)
2019/08/06 Python
Pytorch之view及view_as使用详解
2019/12/31 Python
基于Tensorflow一维卷积用法详解
2020/05/22 Python
Python OpenCV实现测量图片物体宽度
2020/05/27 Python
CSS3让登陆面板3D旋转起来
2016/05/03 HTML / CSS
关于 HTML5 的七个传说小结
2012/04/12 HTML / CSS
自荐书格式
2013/12/01 职场文书
项目采购员岗位职责
2014/04/15 职场文书
领导班子专题民主生活会情况想汇报
2014/09/30 职场文书
师范生免费教育协议书范本
2014/10/09 职场文书
玩手机检讨书1000字
2014/10/20 职场文书
学习保证书100字
2015/02/26 职场文书
政审证明材料
2015/06/19 职场文书
初一英语教学反思
2016/02/15 职场文书
MySQL系列之四 SQL语法
2021/07/02 MySQL
Python获取字典中某个key的value
2022/04/13 Python