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的Crypto模块实现AES加密实例代码
Jan 22 Python
tensorflow实现对图片的读取的示例代码
Feb 12 Python
python实战之实现excel读取、统计、写入的示例讲解
May 02 Python
Python爬虫实现(伪)球迷速成
Jun 10 Python
Python txt文件加入字典并查询的方法
Jan 15 Python
Python读取指定日期邮件的实例
Feb 01 Python
python 计算平均平方误差(MSE)的实例
Jun 29 Python
python字符串中匹配数字的正则表达式
Jul 03 Python
Django实现简单网页弹出警告代码
Nov 15 Python
Django自带的加密算法及加密模块详解
Dec 03 Python
Pytorch十九种损失函数的使用详解
Apr 29 Python
python关于集合的知识案例详解
May 30 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
一个多文件上传的例子(原创)
2006/10/09 PHP
谷歌音乐搜索栏的提示功能php修正代码
2011/05/09 PHP
php初始化对象和析构函数的简单实例
2014/03/11 PHP
PHP 中常量的知识整理
2017/04/14 PHP
PHP获取MySQL执行sql语句的查询时间方法
2018/08/21 PHP
另类调用flash无须激活的方法
2006/12/27 Javascript
JavaScript的Cookies
2008/01/16 Javascript
学习并汇集javascript匿名函数
2010/11/25 Javascript
JQuery each打印JS对象的方法
2013/11/13 Javascript
JS小游戏之仙剑翻牌源码详解
2014/09/25 Javascript
javascript获取flash版本号的方法
2014/11/20 Javascript
Nodejs下用submit提交表单提示cannot post错误的解决方法
2016/11/21 NodeJs
JS前端笔试题分析
2016/12/19 Javascript
详解微信小程序 wx.uploadFile 的编码坑
2017/01/23 Javascript
JavaScript装饰器函数(Decorator)实例详解
2017/03/30 Javascript
Angualrjs和bootstrap相结合实现数据表格table
2017/03/30 Javascript
基于vue-cli配置lib-flexible + rem实现移动端自适应
2017/12/26 Javascript
JS中的继承操作实例总结
2020/06/06 Javascript
Python中内建函数的简单用法说明
2016/05/05 Python
Python实现输出程序执行进度百分比的方法
2017/09/16 Python
Python自动抢红包教程详解
2019/06/11 Python
Python 定义只读属性的实现方式
2020/03/05 Python
python实点云分割k-means(sklearn)详解
2020/05/28 Python
使用HTML5中的contentEditable来将多行文本自动增高
2016/03/01 HTML / CSS
美国转售二手商品的电子商务平台:BLINQ
2018/12/13 全球购物
zooplus波兰:在线宠物店
2019/07/21 全球购物
综合办公室主任职责
2013/12/16 职场文书
养殖行业的创业计划书
2014/01/05 职场文书
2014物价局民主生活会对照检查材料思想汇报
2014/09/24 职场文书
2014民事授权委托书范本
2014/09/29 职场文书
查摆问题整改措施范文
2014/10/11 职场文书
学习普通话的体会
2014/11/07 职场文书
2014年妇产科工作总结
2014/12/08 职场文书
2015年乡镇妇联工作总结
2015/05/19 职场文书
2015初中政治教学工作总结
2015/07/21 职场文书
python之基数排序的实现
2021/07/26 Python