python3实现爬取淘宝美食代码分享


Posted in Python onSeptember 23, 2018

环境:

ubuntu16.04
python3.5
python库: selenium, pyquery,pymongo, re

要求:

设置×××面浏览器访问,并将商品列表存入mongoDB数据库.

分析过程暂时略过

代码:

#!/usr/bin/env python
# -*- coding:utf-8 -*-

"""
1.爬取淘宝美食的流程
- 搜索关键字: 用selenium打开浏览器,模拟输入关键字,并搜索对应的商品列表.
- 分析页码并翻页,模拟翻页,查看到所有页面的商品列表.
- 分析并提取商品,利用Pyquery分析源码,解析得到商品列表.
- 存储到MONGODB数据库,将商品列表信息存储到mongoDB数据库.
"""
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException
from pyquery import PyQuery as pq
import re
from anli.mongoconfig import *
import pymongo

client = pymongo.MongoClient(MONGO_URL)
db = client[MONGO_DB]

#设置×××面访问
opt = webdriver.FirefoxOptions()
opt.set_headless()
browser = webdriver.Firefox(options=opt)

#等待浏览器加载页面成功.
wait = WebDriverWait(browser,10)

def search():
  try:
    # 后台打开浏览器
    browser.get('https://www.taobao.com')

    # 用CSS选择器复制搜索框
    input = wait.until(
      EC.presence_of_element_located((By.CSS_SELECTOR, '#q'))
    )

    # 找到搜索按钮.
    submit = wait.until(
      # EC.element_to_be_clickable((By.CSS_SELECTOR,'#J_TSearchForm .search-button')))
      EC.element_to_be_clickable((By.CSS_SELECTOR,'#J_TSearchForm > div.search-button > button')))

    # 输入关键字
    input.send_keys('美食')

    # 点击搜索按钮.
    submit.click()

    # 输出总共的页数.
    total=wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'.total')))

    # 调取商品列表的函数.
    get_products()
    return total.text
  except TimeoutException: #超时错误.
    return search()

# 翻页
def next_page(page_number):
  try:
    #注意在firefox和chrome浏览器复制出来的元素不太一样.
    #要传入的页码: 到第几页
    input = wait.until(
      EC.presence_of_element_located((By.CSS_SELECTOR,'input.input:nth-child(2)'))
    )
    #复制确定按钮的元素:
    submit = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,'span.btn:nth-child(4)')))

    #清除页码
    input.clear()
    #输入当前页码
    input.send_keys(page_number)

    #点击确定按钮.
    submit.click()

    #判断当前页码是否是当前数字: 复制高亮页码数.
    wait.until(EC.text_to_be_present_in_element((By.CSS_SELECTOR,'span.num'),str(page_number)))
    get_products()
  except TimeoutException:
    next_page(page_number)

#解析jquery源码
def get_products():
  #商品列表:
  wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#mainsrp-itemlist .items .item')))

  # 获取网页源码
  html = browser.page_source
  doc = pq(html)
  items = doc('#mainsrp-itemlist .items .item').items()
  for item in items:
    #定义商品列表详细信息的字典
    product = {
      'title': item.find('.title').text(),
      'price': item.find('.price').text(),
      'image': item.find('.pic .img').attr('src'),
      'shop': item.find('.shop').text(),
      'deal': item.find('.deal-cnt').text()[:-3],
      'location': item.find('.location').text()
    }
    print(product)
    #将商品列表信息保存到mongoDB数据库.
    save_to_mongo(product)

def save_to_mongo(result):
  try:
    if db[MONGO_TABLE].insert(result):
      print('存储到mongodb成功',result)
  except Exception:
    print('存储到mongodb失败',result)

def main():
  total = search()

  # 用正则表达式只匹配出数字,并打印数字.
  total = int(re.compile('(\d+)').search(total).group(1))
  print(total)
  for i in range(2,total + 1):
    next_page(i)

if __name__=='__main__':
  main()
  #关闭×××面浏览器.
  browser.quit()
#mongoconfig.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-

MONGO_URL = 'localhost'
MONGO_DB = 'taobao'
MONGO_TABLE = 'meishi'

安装和使用mongodb参考:

实现效果:

python3实现爬取淘宝美食代码分享

注意:

chrome浏览器和firefox浏览器的网页元素不太一样.

Python 相关文章推荐
在Ubuntu系统下安装使用Python的GUI工具wxPython
Feb 18 Python
Python操作RabbitMQ服务器实现消息队列的路由功能
Jun 29 Python
Python更新数据库脚本两种方法及对比介绍
Jul 27 Python
Python对字符串实现去重操作的方法示例
Aug 11 Python
Python最火、R极具潜力 2017机器学习调查报告
Dec 11 Python
python使用Pycharm创建一个Django项目
Mar 05 Python
python实现扫描日志关键字的示例
Apr 28 Python
Python实现平行坐标图的两种方法小结
Jul 04 Python
Python进度条的制作代码实例
Aug 31 Python
python使用正则表达式(Regular Expression)方法超详细
Dec 30 Python
python实现与redis交互操作详解
Apr 21 Python
Python实现定时监测网站运行状态的示例代码
Sep 30 Python
ubuntu16.04制作vim和python3的开发环境
Sep 23 #Python
Python实现注册、登录小程序功能
Sep 21 #Python
用于业余项目的8个优秀Python库
Sep 21 #Python
Python 经典面试题 21 道【不可错过】
Sep 21 #Python
python使用folium库绘制地图点击框
Sep 21 #Python
在python中安装basemap的教程
Sep 20 #Python
python编程使用协程并发的优缺点
Sep 20 #Python
You might like
php不使用copy()函数复制文件的方法
2015/03/13 PHP
php提交过来的数据生成为txt文件
2016/04/28 PHP
PHP实现的随机IP函数【国内IP段】
2016/07/20 PHP
浅谈PHP中的Trait使用方法
2019/03/22 PHP
另类调用flash无须激活的方法
2006/12/27 Javascript
Javascript中的var_dump函数实现代码
2009/09/07 Javascript
JSQL 批量图片切换的实现代码
2010/05/05 Javascript
window.open的页面如何刷新(父页面)上层页面
2012/12/28 Javascript
js 中将多个逗号替换为一个逗号的代码
2014/06/07 Javascript
javascript性能优化之DOM交互操作实例分析
2015/12/12 Javascript
Angular ng-repeat 对象和数组遍历实例
2016/09/14 Javascript
用 js 的 selection range 操作选择区域内容和图片
2017/04/18 Javascript
jQuery实现简单的手风琴效果
2020/04/17 jQuery
angularjs实现时间轴效果的示例代码
2017/11/29 Javascript
Vue前后端不同端口的实现方法
2018/09/19 Javascript
微信小程序实现文字跑马灯
2020/05/26 Javascript
js简单的分页器插件代码实例
2019/09/11 Javascript
ES2020 已定稿,真实场景案例分析
2020/05/25 Javascript
python zip文件 压缩
2008/12/24 Python
Python使用random和tertools模块解一些经典概率问题
2015/01/28 Python
Python初学时购物车程序练习实例(推荐)
2017/08/08 Python
python数据封装json格式数据
2018/03/04 Python
Python使用numpy实现BP神经网络
2018/03/10 Python
PyCharm 创建指定版本的 Django(超详图解教程)
2019/06/18 Python
在PyTorch中Tensor的查找和筛选例子
2019/08/18 Python
Python数据存储之 h5py详解
2019/12/26 Python
Selenium启动Chrome时配置选项详解
2020/03/18 Python
台湾演唱会订票网站:StubHub台湾
2019/06/11 全球购物
白俄罗斯女装和针织品网上商店:Presli.by
2019/10/13 全球购物
澳大利亚第一旅行车和房车配件店:Caravan RV Camping
2020/12/26 全球购物
自荐信格式
2013/12/01 职场文书
优秀教师事迹简介
2014/02/02 职场文书
创业女性典型材料
2014/05/02 职场文书
2021年pycharm的最新安装教程及基本使用图文详解
2021/04/03 Python
MySQL慢查询优化解决问题
2022/03/17 MySQL
golang语言指针操作
2022/04/14 Golang