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的ORM框架中的SQLAlchemy库的映射关系
Apr 25 Python
python 链接和操作 memcache方法
Mar 04 Python
python中通过预先编译正则表达式提高效率
Sep 25 Python
利用Python找出序列中出现最多的元素示例代码
Dec 08 Python
python DataFrame 修改列的顺序实例
Apr 10 Python
Python文件如何引入?详解引入Python文件步骤
Dec 10 Python
Python关于excel和shp的使用在matplotlib
Jan 03 Python
python3实现zabbix告警推送钉钉的示例
Feb 20 Python
python opencv摄像头的简单应用
Jun 06 Python
Python日志无延迟实时写入的示例
Jul 11 Python
Python Django 实现简单注册功能过程详解
Jul 29 Python
在pycharm中使用matplotlib.pyplot 绘图时报错的解决
Jun 01 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/03/03 PHP
PHP性能分析工具XHProf安装使用教程
2015/05/13 PHP
PHP创建PowerPoint2007文档的方法
2015/12/10 PHP
ThinkPHP 模板引擎使用详解
2017/05/07 PHP
phpcms实现验证码替换及phpcms实现全站搜索功能教程详解
2017/12/13 PHP
thinkphp5.1 文件引入路径问题及注意事项
2018/06/13 PHP
可以显示单图片,多图片ajax请求的ThickBox3.1类下载
2007/12/23 Javascript
js 弹出菜单/窗口效果
2011/10/30 Javascript
javascript动态控制服务器控件实例
2014/09/05 Javascript
JS动态改变表格边框宽度的方法
2015/03/31 Javascript
jquery实现的动态回到顶部特效代码
2015/10/28 Javascript
Bootstrap打造一个左侧折叠菜单的系统模板(一)
2016/05/17 Javascript
JavaScript中0和""比较引发的问题
2016/05/26 Javascript
JavaScript判断数字是否为质数的方法汇总
2016/06/02 Javascript
深入浅析JS的数组遍历方法(推荐)
2016/06/15 Javascript
jquery计算出left和top,让一个div水平垂直居中的简单实例
2016/07/13 Javascript
jquery把int类型转换成字符串类型的方法
2016/10/07 Javascript
javascript 定时器工作原理分析
2016/12/03 Javascript
详解angular中如何监控dom渲染完毕
2017/01/03 Javascript
react-native使用react-navigation进行页面跳转导航的示例
2017/09/07 Javascript
在vue中更换字体,本地存储字体非引用在线字体库的方法
2018/09/28 Javascript
Vue.extend 登录注册模态框的实现
2020/12/29 Vue.js
[52:39]完美世界DOTA2联赛PWL S3 CPG vs Forest 第一场 12.16
2020/12/17 DOTA
python 查找文件夹下所有文件 实现代码
2009/07/01 Python
python实现apahce网站日志分析示例
2014/04/02 Python
跟老齐学Python之编写类之一创建实例
2014/10/11 Python
Python与shell的3种交互方式介绍
2015/04/11 Python
python中dir()与__dict__属性的区别浅析
2018/12/10 Python
浅谈python的输入输出,注释,基本数据类型
2019/04/02 Python
哪些是python中web开发框架
2020/06/17 Python
Html5页面在微信端的分享的实现方法
2018/08/30 HTML / CSS
html5 canvas绘制放射性渐变色效果
2018/01/04 HTML / CSS
行政专员岗位职责
2014/01/02 职场文书
爱国演讲稿400字
2014/05/07 职场文书
一个都不能少观后感
2015/06/04 职场文书
2019年描写人生经典诗句大全
2019/07/08 职场文书