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实现apahce网站日志分析示例
Apr 02 Python
Python实现多进程共享数据的方法分析
Dec 04 Python
pygame实现简易飞机大战
Sep 11 Python
Appium Python自动化测试之环境搭建的步骤
Jan 23 Python
基于python生成器封装的协程类
Mar 20 Python
python交易记录整合交易类详解
Jul 03 Python
docker-py 用Python调用Docker接口的方法
Aug 30 Python
python图形用户接口实例详解
Dec 16 Python
将labelme格式数据转化为标准的coco数据集格式方式
Feb 17 Python
Python猜数字算法题详解
Mar 01 Python
pytorch实现查看当前学习率
Jun 24 Python
Python Flask实现进度条
May 11 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的array_multisort()使用方法介绍
2012/05/16 PHP
PHP提示Deprecated: mysql_connect(): The mysql extension is deprecated的解决方法
2014/08/28 PHP
PHP中把数据库查询结果输出为json格式简单实例
2015/04/09 PHP
调试WordPress中定时任务的相关PHP脚本示例
2015/12/10 PHP
JavaScript与Div对层定位和移动获得坐标的实现代码
2010/09/08 Javascript
JS中令人发指的valueOf方法介绍
2013/02/22 Javascript
我的Node.js学习之路(三)--node.js作用、回调、同步和异步代码 以及事件循环
2014/07/06 Javascript
JS实现简洁、全兼容的拖动层实例
2015/05/13 Javascript
实例代码详解jquery.slides.js
2015/11/16 Javascript
Knockout自定义绑定创建方法
2015/12/26 Javascript
jQuery中数据缓存$.data的用法及源码完全解析
2016/04/29 Javascript
JS实现图片的不间断连续滚动的简单实例
2016/06/03 Javascript
AngularJS优雅的自定义指令
2016/07/01 Javascript
jQuery Easyui datagrid/treegrid 清空数据
2016/07/09 Javascript
Vue使用json-server进行后端数据模拟功能
2018/04/17 Javascript
微信小程序wx.navigateTo方法里的events参数使用详情及场景
2020/01/07 Javascript
python的正则表达式re模块的常用方法
2013/03/09 Python
使用Python获取Linux系统的各种信息
2014/07/10 Python
python subprocess 杀掉全部派生的子进程方法
2017/01/16 Python
解决python删除文件的权限错误问题
2018/04/24 Python
对python当中不在本路径的py文件的引用详解
2018/12/15 Python
Django给admin添加Action的步骤详解
2019/05/01 Python
python自动化测试无法启动谷歌浏览器问题
2019/10/10 Python
Python调用Redis的示例代码
2020/11/24 Python
python中lower函数实现方法及用法讲解
2020/12/23 Python
python爬虫利用代理池更换IP的方法步骤
2021/02/21 Python
详解CSS3的perspective属性设置3D变换距离的方法
2016/05/23 HTML / CSS
英国家喻户晓的折扣商场:TK Maxx
2017/05/26 全球购物
英国最受信任的在线眼镜商之一:Fashion Eyewear
2019/10/31 全球购物
小车司机岗位职责
2013/11/25 职场文书
巡警年度自我鉴定
2014/02/21 职场文书
甘南现象心得体会
2014/09/11 职场文书
房产公证书格式
2015/01/26 职场文书
营销策划分析:怎么策划才能更好销量产品?
2019/09/04 职场文书
详解MySQL InnoDB存储引擎的内存管理
2021/04/08 MySQL
MySQL三种方式实现递归查询
2022/04/18 MySQL