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多重继承实例
Oct 11 Python
举例讲解Python中的迭代器、生成器与列表解析用法
Mar 20 Python
Python编程pygal绘图实例之XY线
Dec 09 Python
python 3.6 tkinter+urllib+json实现火车车次信息查询功能
Dec 20 Python
Python和Java进行DES加密和解密的实例
Jan 09 Python
python使用xslt提取网页数据的方法
Feb 23 Python
Python实现多态、协议和鸭子类型的代码详解
May 05 Python
python调用并链接MATLAB脚本详解
Jul 05 Python
Flask框架学习笔记之表单基础介绍与表单提交方式
Aug 12 Python
Pytorch to(device)用法
Jan 08 Python
Python selenium使用autoIT上传附件过程详解
May 26 Python
Python 排序最长英文单词链(列表中前一个单词末字母是下一个单词的首字母)
Dec 14 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获取文件后缀名的三个函数
2012/10/15 PHP
PHP大批量插入数据库的3种方法和速度对比
2014/07/08 PHP
php加密之discuz内容经典加密方式实例详解
2017/02/04 PHP
JavaScript中的Screen屏幕对象
2008/01/16 Javascript
javascript document.execCommand() 常用解析
2009/12/14 Javascript
jquery 实现checkbox全选,反选,全不选等功能代码(奇数)
2012/10/24 Javascript
可简单避免的三个JS发布错误的详细介绍
2013/08/02 Javascript
jQuery性能优化技巧分析
2015/02/20 Javascript
JavaScript获取当前日期是星期几的方法
2015/04/06 Javascript
JavaScript 表单处理实现代码
2015/04/13 Javascript
JQuery ztree带筛选、异步加载实例讲解
2016/02/25 Javascript
基于AngularJs + Bootstrap + AngularStrap相结合实现省市区联动代码
2016/05/30 Javascript
浅谈js内置对象Math的属性和方法(推荐)
2016/09/19 Javascript
JavaScript中const、var和let区别浅析
2016/10/11 Javascript
微信小程序icon组件使用详解
2018/01/31 Javascript
用node-webkit把web应用打包成桌面应用(windows环境)
2018/02/01 Javascript
vue中使用mxgraph的方法实例代码详解
2019/05/17 Javascript
vue 取出v-for循环中的index值实例
2019/11/09 Javascript
[51:53]DOTA2-DPC中国联赛 正赛 RNG vs Dragon BO3 第二场 1月24日
2021/03/11 DOTA
python脚本设置超时机制系统时间的方法
2016/02/21 Python
python 动态加载的实现方法
2017/12/22 Python
Python使用smtp和pop简单收发邮件完整实例
2018/01/09 Python
Python实现定时精度可调节的定时器
2018/04/15 Python
python定时关机小脚本
2018/06/20 Python
Python企业编码生成系统之系统主要函数设计详解
2019/07/26 Python
python等差数列求和公式前 100 项的和实例
2020/02/25 Python
Python日志logging模块功能与用法详解
2020/04/09 Python
python如何快速生成时间戳
2020/07/21 Python
美国在线纱线商店:Darn Good Yarn
2019/03/20 全球购物
绘画专业自荐信范文
2014/02/23 职场文书
学期评语大全
2014/04/30 职场文书
高中同学会活动方案
2014/08/14 职场文书
刑事辩护词范文
2015/05/21 职场文书
python用字节处理文件实例讲解
2021/04/13 Python
Python实现8种常用抽样方法
2021/06/27 Python
关于Mybatis中SQL节点的深入解析
2022/03/19 Java/Android