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脚本快速为iOS10生成图标和截屏
Sep 22 Python
python+selenium开发环境搭建图文教程
Aug 11 Python
python中requests库session对象的妙用详解
Oct 30 Python
python线程中同步锁详解
Apr 27 Python
python批量复制图片到另一个文件夹
Sep 17 Python
python selenium 弹出框处理的实现
Feb 26 Python
python如何实现异步调用函数执行
Jul 08 Python
Django在pycharm下修改默认启动端口的方法
Jul 26 Python
python 中xpath爬虫实例详解
Aug 26 Python
Python字符串的修改方法实例
Dec 19 Python
python实现感知机模型的示例
Sep 30 Python
详解使用python爬取抖音app视频(appium可以操控手机)
Jan 26 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 Mysql类 可以参考学习熟悉下
2009/06/21 PHP
PHP错误提示的关闭方法详解
2013/06/23 PHP
php+ajax实现无刷新文件上传功能(ajaxuploadfile)
2018/02/11 PHP
JavaScript语法着色引擎(demo及打包文件下载)
2007/06/13 Javascript
javascript 解决表单仍然提交即使监听处理函数返回false
2010/03/14 Javascript
js动态创建标签示例代码
2014/06/09 Javascript
javascript随机显示背景图片的方法
2015/06/18 Javascript
Javascript使用post方法提交数据实例
2015/08/03 Javascript
jQuery表格行上移下移和置顶的实现方法
2015/10/08 Javascript
学习AngularJs:Directive指令用法(完整版)
2016/04/26 Javascript
JavaScript中有关一个数组中最大值和最小值及它们的下表的输出的解决办法
2016/07/01 Javascript
Vue2.0设置全局样式(less/sass和css)
2017/11/18 Javascript
详解浏览器缓存和webpack缓存配置
2018/07/06 Javascript
vue富文本框(插入文本、图片、视频)的使用及问题小结
2018/08/17 Javascript
了解重排与重绘
2019/05/29 Javascript
jQuery模拟html下拉多选框的原生实现方法示例
2019/05/30 jQuery
原生JavaScript实现随机点名表
2021/01/14 Javascript
[56:14]Fnatic vs OG 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
编写Python脚本把sqlAlchemy对象转换成dict的教程
2015/05/29 Python
在Django的form中使用CSS进行设计的方法
2015/07/18 Python
MySQL中表的复制以及大型数据表的备份教程
2015/11/25 Python
Flask教程之重定向与错误处理实例分析
2019/08/01 Python
Python for循环搭配else常见问题解决
2020/02/11 Python
Python基于BeautifulSoup爬取京东商品信息
2020/06/01 Python
Python实现迪杰斯特拉算法过程解析
2020/09/18 Python
python实现发送邮件
2021/03/02 Python
突破canvas语法限制 让他支持链式语法
2012/12/24 HTML / CSS
英国演唱会订票网站:Ticket Selection
2018/03/27 全球购物
NFL Game Pass欧洲:在线观看NFL比赛直播和点播,以高清质量播放
2018/08/30 全球购物
美国轻奢时尚购物网站:REVOLVE(支持中文)
2020/07/18 全球购物
开学季活动策划方案
2014/02/28 职场文书
电视购物广告词
2014/03/19 职场文书
综合实践活动总结
2014/05/05 职场文书
自查自纠工作总结
2014/10/15 职场文书
军训通讯稿范文
2015/07/18 职场文书
Redis Stream类型的使用详解
2021/11/11 Redis