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 相关文章推荐
非递归的输出1-N的全排列实例(推荐)
Apr 11 Python
python实现对excel进行数据剔除操作实例
Dec 07 Python
python机器学习之贝叶斯分类
Mar 26 Python
python实现数据库跨服务器迁移
Apr 12 Python
python Pillow图像处理方法汇总
Oct 16 Python
详解Python中打乱列表顺序random.shuffle()的使用方法
Nov 11 Python
VSCode中自动为Python文件添加头部注释
Nov 14 Python
详解字符串在Python内部是如何省内存的
Feb 03 Python
pymysql 插入数据 转义处理方式
Mar 02 Python
Python sql注入 过滤字符串的非法字符实例
Apr 03 Python
Python下opencv库的安装过程及问题汇总
Jun 11 Python
Pygame如何使用精灵和碰撞检测
Nov 17 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
探讨如何把session存入数据库
2013/06/07 PHP
探讨方法的重写(覆载)详解
2013/06/08 PHP
php图片处理函数获取类型及扩展名实例
2014/11/19 PHP
1亿条数据如何分表100张到Mysql数据库中(PHP)
2015/07/29 PHP
JS request函数 用来获取url参数
2010/05/17 Javascript
JavaScript模板入门介绍
2012/09/26 Javascript
iframe的父子窗口之间的对象相互调用基本用法
2013/09/03 Javascript
javascript实现文本域写入字符时限定字数
2014/02/12 Javascript
javasript实现密码的隐藏与显示
2015/05/08 Javascript
JS实现模拟风力的雪花飘落效果
2015/05/13 Javascript
使用JavaScript制作一个简单的计数器的方法
2015/07/07 Javascript
JS如何判断是否为ie浏览器的方法(包括IE10、IE11在内)
2015/12/13 Javascript
原生js二级联动效果
2017/06/20 Javascript
vue 请求后台数据的实例代码
2017/06/22 Javascript
JavaScript数据结构之双向链表和双向循环链表的实现
2017/11/28 Javascript
vue项目使用.env文件配置全局环境变量的方法
2019/10/24 Javascript
node.js实现http服务器与浏览器之间的内容缓存操作示例
2020/02/11 Javascript
原生js实现轮播图特效
2020/05/04 Javascript
JS this关键字在ajax中使用出现问题解决方案
2020/07/17 Javascript
jQuery实现动态加载瀑布流
2020/09/01 jQuery
[39:46]完美世界DOTA2联赛PWL S2 LBZS vs Rebirth 第二场 11.25
2020/11/25 DOTA
在Python的Django框架中包装视图函数
2015/07/20 Python
PYTHON 中使用 GLOBAL引发的一系列问题
2016/10/12 Python
python paramiko模块学习分享
2017/08/23 Python
python爬虫面试宝典(常见问题)
2018/03/02 Python
PyQt5 QSerialPort子线程操作的实现
2018/04/21 Python
78行Python代码实现现微信撤回消息功能
2018/07/26 Python
python字符串常用方法及文件简单读写的操作方法
2020/03/04 Python
涂鸦板简单实现 Html5编写属于自己的画画板
2016/07/05 HTML / CSS
实例讲解利用HTML5 Canvas API操作图形旋转的方法
2016/03/22 HTML / CSS
Spartoo英国:欧洲最大的网上鞋店
2016/09/13 全球购物
世界上最大的售后摩托车零配件超市:J&P Cycles
2017/12/08 全球购物
Berghaus官网:户外服装和设备,防水服
2020/01/17 全球购物
兼职业务员岗位职责
2014/01/01 职场文书
2015年保送生自荐信
2015/03/24 职场文书
Python面向对象之成员相关知识总结
2021/06/24 Python