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判断字符串是否纯数字的方法
Nov 19 Python
python调用机器喇叭发出蜂鸣声(Beep)的方法
Mar 23 Python
Python实现的摇骰子猜大小功能小游戏示例
Dec 18 Python
python从子线程中获得返回值的方法
Jan 30 Python
在django view中给form传入参数的例子
Jul 19 Python
python之PyQt按钮右键菜单功能的实现代码
Aug 17 Python
python画微信表情符的实例代码
Oct 09 Python
python 利用jinja2模板生成html代码实例
Oct 10 Python
Python通过4种方式实现进程数据通信
Mar 12 Python
宝塔面板成功部署Django项目流程(图文)
Jun 22 Python
python3中数组逆序输出方法
Dec 01 Python
python绘图pyecharts+pandas的使用详解
Dec 13 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
使用Apache的rewrite技术
2006/06/22 PHP
php 图像函数大举例(非原创)
2009/06/20 PHP
PHP扩展Swoole实现实时异步任务队列示例
2019/04/13 PHP
JS模板实现方法
2013/04/03 Javascript
如何创建一个JavaScript弹出DIV窗口层的效果
2013/09/25 Javascript
JavaScript中的对象序列化介绍
2014/12/30 Javascript
jQuery中wrapInner()方法用法实例
2015/01/16 Javascript
jQuery使用zTree插件实现可拖拽的树示例
2017/09/23 jQuery
利用JS判断客户端类型你应该知道的四种方法
2017/12/22 Javascript
详解如何制作并发布一个vue的组件的npm包
2018/11/10 Javascript
vue 使用鼠标滚动加载数据的例子
2019/10/31 Javascript
Layer UI表格列日期格式化及取消自动填充日期的实现方法
2020/05/10 Javascript
Vue 实现v-for循环的时候更改 class的样式名称
2020/07/17 Javascript
浅谈vue 组件中的setInterval方法和window的不同
2020/07/30 Javascript
typescript编写微信小程序创建项目的方法
2021/01/29 Javascript
python在Windows8下获取本机ip地址的方法
2015/03/14 Python
解决pytorch-yolov3 train 报错的问题
2020/02/18 Python
Python3-异步进程回调函数(callback())介绍
2020/05/02 Python
让Django的BooleanField支持字符串形式的输入方式
2020/05/20 Python
学会python自动收发邮件 代替你问候女友
2020/05/20 Python
Python datetime模块使用方法小结
2020/06/18 Python
python怎么判断模块安装完成
2020/06/19 Python
PyCharm中关于安装第三方包的三个建议
2020/09/17 Python
css3实现文字扫光渐变动画效果的示例
2017/11/07 HTML / CSS
教师通用专业自荐书范文
2014/02/11 职场文书
公司年会抽奖活动主持词
2014/03/31 职场文书
数据保密承诺书
2014/06/03 职场文书
森林防火标语
2014/06/23 职场文书
小学生勤俭节约演讲稿
2014/08/28 职场文书
工作失职检讨书500字
2014/10/17 职场文书
2015年预算员工作总结
2015/05/14 职场文书
党支部对转正的意见
2015/06/02 职场文书
鸡毛信观后感
2015/06/11 职场文书
2015暑期社会实践个人总结
2015/07/13 职场文书
数据结构课程设计心得体会
2016/01/15 职场文书
java获取一个文本文件的编码(格式)信息
2022/09/23 Java/Android