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基础教程之元组操作使用详解
Mar 25 Python
python实现FTP服务器服务的方法
Apr 11 Python
python 图片去噪的方法示例
Jul 09 Python
Django框架 信号调度原理解析
Sep 04 Python
Python的互斥锁与信号量详解
Sep 12 Python
flask框架json数据的拿取和返回操作示例
Nov 28 Python
Python有参函数使用代码实例
Jan 06 Python
简单了解Django ORM常用字段类型及参数配置
Jan 07 Python
Python异常继承关系和自定义异常实现代码实例
Feb 20 Python
在TensorFlow中实现矩阵维度扩展
May 22 Python
详解anaconda离线安装pytorchGPU版
Sep 08 Python
Django使用django-simple-captcha做验证码的实现示例
Jan 07 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
解析WordPress中控制用户登陆和判断用户登陆的PHP函数
2016/03/01 PHP
Jquery Change与bind事件代码
2011/09/29 Javascript
Javascript 面向对象(二)封装代码
2012/05/23 Javascript
js选取多个或单个元素的实现代码(用class)
2012/08/22 Javascript
将字符串转换成gb2312或者utf-8编码的参数(js版)
2013/04/10 Javascript
JS实现可改变列宽的table实例
2013/07/02 Javascript
Ajax中解析Json的两种方法对比分析
2015/06/25 Javascript
javascript实现在网页中运行本地程序的方法
2016/02/03 Javascript
jQuery事件与动画基础详解
2017/02/23 Javascript
关于JavaScript中的this指向问题总结篇
2017/07/23 Javascript
weui框架实现上传、预览和删除图片功能代码
2017/08/24 Javascript
vue 中filter的多种用法
2018/04/26 Javascript
angularjs实现的购物金额计算工具示例
2018/05/08 Javascript
详解easyui基于 layui.laydate日期扩展组件
2018/07/18 Javascript
深入理解NodeJS 多进程和集群
2018/10/17 NodeJs
JavaScript实现随机点名器实例详解
2019/05/07 Javascript
Vue.js自定义指令学习使用详解
2019/10/19 Javascript
如何手写一个简易的 Vuex
2020/10/10 Javascript
ES6中的类(Class)示例详解
2020/12/09 Javascript
jQuery冲突问题解决方法
2021/01/19 jQuery
Vue看了就会的8个小技巧
2021/01/21 Vue.js
python学习笔记:字典的使用示例详解
2014/06/13 Python
使用Python程序抓取新浪在国内的所有IP的教程
2015/05/04 Python
详解Django的model查询操作与查询性能优化
2018/10/16 Python
解决python多行注释引发缩进错误的问题
2019/08/23 Python
python爬虫中多线程的使用详解
2019/09/23 Python
解决pytorch 交叉熵损失输出为负数的问题
2020/07/07 Python
重构Python代码的六个实例
2020/11/25 Python
方法名是否可以与构造器的名字相同
2012/06/04 面试题
文秘求职信范文
2014/04/10 职场文书
会计人员演讲稿
2014/09/11 职场文书
教师理论学习心得体会
2016/01/21 职场文书
python基于tkinter制作m3u8视频下载工具
2021/04/24 Python
python numpy中multiply与*及matul 的区别说明
2021/05/26 Python
Keras多线程机制与flask多线程冲突的解决方案
2021/05/28 Python
详解php中流行的rpc框架
2021/05/29 PHP