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 01 Python
python实现根据ip地址反向查找主机名称的方法
Apr 29 Python
Python记录详细调用堆栈日志的方法
May 05 Python
python实现中文转换url编码的方法
Jun 14 Python
Python 爬虫图片简单实现
Jun 01 Python
Python爬虫使用Selenium+PhantomJS抓取Ajax和动态HTML内容
Feb 23 Python
使用python画社交网络图实例代码
Jul 10 Python
使用 python pyautogui实现鼠标键盘控制功能
Aug 04 Python
Python使用struct处理二进制(pack和unpack用法)
Nov 12 Python
python中@contextmanager实例用法
Feb 07 Python
python爬虫爬取某网站视频的示例代码
Feb 20 Python
Python list列表删除元素的4种方法
Nov 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 在线翻译函数代码
2009/05/07 PHP
支持中文字母数字、自定义字体php验证码代码
2012/02/27 PHP
php检测文件编码的方法示例
2014/04/25 PHP
php实现字符串反转输出的方法
2015/03/14 PHP
laravel中的错误与日志用法详解
2016/07/26 PHP
ext form 表单提交数据的方法小结
2008/08/08 Javascript
javascript dom 基本操作小结
2010/04/11 Javascript
Script标签与访问HTML页面详解
2014/01/10 Javascript
jQuery实现提交按钮点击后变成正在处理字样并禁止点击的方法
2015/03/24 Javascript
jquery使用remove()方法删除指定class子元素
2015/03/26 Javascript
简介JavaScript中getUTCMonth()方法的使用
2015/06/10 Javascript
实例代码详解javascript实现窗口抖动及qq窗口抖动
2016/01/04 Javascript
javascript特效实现——当前时间和倒计时效果的简单实例
2016/07/20 Javascript
wap手机端解决返回上一页的js实例
2016/12/08 Javascript
jQuery实现判断控件是否显示的方法
2017/01/11 Javascript
angular4 如何在全局设置路由跳转动画的方法
2017/08/30 Javascript
解决低版本的浏览器不支持es6的import问题
2018/03/09 Javascript
在Node.js下运用MQTT协议实现即时通讯及离线推送的方法
2019/01/24 Javascript
JavaScript从原型到原型链深入理解
2019/06/03 Javascript
jQuery操作cookie的示例代码
2019/06/05 jQuery
mock.js模拟前后台交互
2019/07/25 Javascript
angular共享依赖的解决方案分享
2020/10/15 Javascript
用Python解决计数原理问题的方法
2016/08/04 Python
Python中模块与包有相同名字的处理方法
2017/05/05 Python
Python元组拆包和具名元组解析实例详解
2018/03/26 Python
python爬取基于m3u8协议的ts文件并合并
2019/04/26 Python
利用Python如何实时检测自身内存占用
2020/05/09 Python
python爬取代理ip的示例
2020/12/18 Python
特步官方商城:Xtep
2017/03/21 全球购物
Tom Dixon官网:英国照明及家具设计和制造公司
2019/03/01 全球购物
打架检讨书400字
2014/01/17 职场文书
好习惯伴我成长演讲稿
2014/05/21 职场文书
大学生实训报告总结
2014/11/05 职场文书
2015年青年志愿者工作总结
2015/05/20 职场文书
维护民族团结心得体会2016
2016/01/15 职场文书
关于MybatisPlus配置双数据库驱动连接数据库问题
2022/01/22 Java/Android