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 相关文章推荐
Python实现的数据结构与算法之快速排序详解
Apr 22 Python
python模拟enum枚举类型的方法小结
Apr 30 Python
Python编程实现生成特定范围内不重复多个随机数的2种方法
Apr 14 Python
python3.x 将byte转成字符串的方法
Jul 17 Python
利用Python将数值型特征进行离散化操作的方法
Nov 06 Python
pip install python 快速安装模块的教程图解
Oct 08 Python
Python 生成一个从0到n个数字的列表4种方法小结
Nov 28 Python
Python 动态变量名定义与调用方法
Feb 09 Python
对tensorflow中cifar-10文档的Read操作详解
Feb 10 Python
numpy库ndarray多维数组的维度变换方法(reshape、resize、swapaxes、flatten)
Apr 28 Python
Python 实现一个计时器
Jul 28 Python
基于python+selenium自动健康打卡的实现代码
Jan 13 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
2020年4月放送!《Princess Connect Re:Dive》制作组 & 角色声优公开!
2020/03/06 日漫
关于访问控制的一首PHP面试题(对属性或方法的访问控制)
2012/09/13 PHP
PHP 反射(Reflection)使用实例
2015/05/12 PHP
PHP基于yii框架实现生成ICO图标
2015/11/13 PHP
在Laravel5.6中使用Swoole的协程数据库查询
2018/06/15 PHP
php实现微信公众平台发红包功能
2018/06/14 PHP
php-fpm超时时间设置request_terminate_timeout资源问题分析
2019/09/27 PHP
jquery中的 $("#jb51")与document.getElementById("jb51") 的区别
2011/07/26 Javascript
Javascript数据结构与算法之列表详解
2015/03/12 Javascript
NodeJS远程代码执行
2016/08/28 NodeJs
ES6学习教程之模板字符串详解
2017/10/09 Javascript
node.js多个异步过程中判断执行是否完成的解决方案
2017/12/10 Javascript
微信小程序实现topBar底部选择栏效果
2018/07/20 Javascript
Webpack中SplitChunksPlugin 配置参数详解
2020/03/24 Javascript
如何在 Vue 表单中处理图片
2021/01/26 Vue.js
[01:20]DOTA2上海特级锦标赛现场采访:谁的ID最受青睐
2016/03/25 DOTA
在Django的URLconf中进行函数导入的方法
2015/07/18 Python
windows 下python+numpy安装实用教程
2017/12/23 Python
Python实现的当前时间多加一天、一小时、一分钟操作示例
2018/05/21 Python
Python将8位的图片转为24位的图片实现方法
2018/10/24 Python
对Python中list的倒序索引和切片实例讲解
2018/11/15 Python
python实现H2O中的随机森林算法介绍及其项目实战
2019/08/29 Python
Python BeautifulReport可视化报告代码实例
2020/04/13 Python
Python中pass的作用与使用教程
2020/11/13 Python
使用Python获取爱奇艺电视剧弹幕数据的示例代码
2021/01/12 Python
python 实现IP子网计算
2021/02/18 Python
CSS3让登陆面板3D旋转起来
2016/05/03 HTML / CSS
国际化的太阳镜及太阳镜配件零售商:Sunglass Hut
2016/07/26 全球购物
Jacadi Paris美国官方网站:法国童装品牌
2017/10/15 全球购物
网络安全方面的面试题
2015/11/04 面试题
生活部的活动方案
2014/08/19 职场文书
2015年建党94周年演讲稿
2015/03/19 职场文书
学校社团活动总结
2015/05/07 职场文书
2015年关爱留守儿童工作总结
2015/05/22 职场文书
新兵入伍决心书
2015/09/22 职场文书
对Golang中的FORM相关字段理解
2021/05/02 Golang