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 NumPy库安装使用笔记
May 18 Python
Python画图学习入门教程
Jul 01 Python
python机器学习理论与实战(六)支持向量机
Jan 19 Python
几种实用的pythonic语法实例代码
Feb 24 Python
python调用百度语音识别api
Aug 30 Python
Python面向对象程序设计类的封装与继承用法示例
Apr 12 Python
在linux下实现 python 监控usb设备信号
Jul 03 Python
Python脚本操作Excel实现批量替换功能
Nov 20 Python
python中的split()函数和os.path.split()函数使用详解
Dec 21 Python
python中watchdog文件监控与检测上传功能
Oct 30 Python
使用Python+Appuim 清理微信的方法
Jan 26 Python
Python OpenCV 图像平移的实现示例
Jun 04 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
日本因肺炎疫情影响,这几部动漫推延播放!
2020/03/03 日漫
收听困难?教您超简便短波广播抗干扰方法!
2021/03/01 无线电
PHP5各个版本的新功能和新特性总结
2014/03/16 PHP
PHP+jQuery翻板抽奖功能实现
2015/10/19 PHP
php实现面包屑导航例子分享
2015/12/19 PHP
IIS 7.5 asp Session超时时间设置方法
2017/04/17 PHP
小议Function.apply() 之一------(函数的劫持与对象的复制)
2006/11/30 Javascript
解读JavaScript中 For, While与递归的用法
2013/05/07 Javascript
JavaScript中的数值范围介绍
2014/12/29 Javascript
JQuery中serialize()用法实例分析
2015/02/06 Javascript
javascript中Math.random()使用详解
2015/04/15 Javascript
input框中的name和id的区别
2016/11/16 Javascript
Vue.js仿Metronic高级表格(一)静态设计
2017/04/17 Javascript
解决webpack打包速度慢的解决办法汇总
2017/07/06 Javascript
nodejs中解决异步嵌套循环和循环嵌套异步的问题
2017/07/12 NodeJs
详解Nodejs mongoose
2018/06/10 NodeJs
基于JS判断对象是否是数组
2020/01/10 Javascript
关于angular浏览器兼容性问题的解决方案
2020/07/26 Javascript
jQuery实现手风琴特效
2021/01/11 jQuery
[01:10:30]DOTA2-DPC中国联赛正赛 Dragon vs Dynasty BO3 第一场 3月4日
2021/03/11 DOTA
python 简易计算器程序,代码就几行
2009/08/29 Python
python可视化篇之流式数据监控的实现
2019/08/07 Python
推荐8款常用的Python GUI图形界面开发框架
2020/02/23 Python
Pandas中DataFrame基本函数整理(小结)
2020/07/20 Python
Python爬取梨视频的示例
2021/01/29 Python
pytho matplotlib工具栏源码探析一之禁用工具栏、默认工具栏和工具栏管理器三种模式的差异
2021/02/25 Python
美国专营婴幼儿用品的购物网站:buybuy BABY
2017/01/01 全球购物
美国创意礼品网站:UncommonGoods
2017/02/03 全球购物
英国体育器材进口商店:UK Sport Imports
2017/03/14 全球购物
Sofmap官网:日本著名的数码电器专卖店
2017/05/19 全球购物
德国汽车零件和汽车配件网上商店:kfzteile24
2018/11/14 全球购物
2014年会演讲稿范文
2014/01/06 职场文书
教师作风整顿个人剖析材料
2014/10/10 职场文书
机关作风建设工作总结
2014/10/23 职场文书
给朋友的道歉短信
2015/05/12 职场文书
SQL bool盲注和时间盲注详解
2022/07/23 SQL Server