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中的With语句
Mar 18 Python
Python实现备份MySQL数据库的方法示例
Jan 11 Python
Python实现的IP端口扫描工具类示例
Feb 15 Python
Python3.4解释器用法简单示例
Mar 22 Python
python模块常用用法实例详解
Oct 17 Python
使用Python完成15位18位身份证的互转功能
Nov 06 Python
tensorflow查看ckpt各节点名称实例
Jan 21 Python
PyCharm License Activation激活码失效问题的解决方法(图文详解)
Mar 12 Python
Python替换NumPy数组中大于某个值的所有元素实例
Jun 08 Python
python 实现端口扫描工具
Dec 18 Python
Python之qq自动发消息的示例代码
Feb 18 Python
python turtle绘制多边形和跳跃和改变速度特效
Mar 16 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 信息采集程序代码
2009/03/17 PHP
探讨:array2xml和xml2array以及xml与array的互相转化
2013/06/24 PHP
jquery中防刷IP流量软件影响统计的一点对策
2011/07/10 Javascript
JS实现Enter键跳转及控件获得焦点
2013/08/12 Javascript
多种方法实现JS动态添加事件
2013/11/01 Javascript
使用vue.js制作分页组件
2016/06/27 Javascript
javascript加载xml 并解析各节点的值(实现方法)
2016/10/12 Javascript
JS实现touch 点击滑动轮播实例代码
2017/01/19 Javascript
vue 2.0项目中如何引入element-ui详解
2017/09/06 Javascript
React Native使用fetch实现图片上传的示例代码
2018/03/07 Javascript
nodejs高大上的部署方式(PM2)
2018/09/11 NodeJs
vue实现微信分享链接添加动态参数的方法
2019/04/29 Javascript
小程序云开发如何实现图片上传及发表文字
2019/05/17 Javascript
Vue+axios+WebApi+NPOI导出Excel文件实例方法
2019/06/05 Javascript
JS中实现一个下载进度条及播放进度条的代码
2019/06/10 Javascript
NodeJS多种创建WebSocket监听的方式(三种)
2020/06/04 NodeJs
JS实现按比例缩小图片宽高
2020/08/24 Javascript
从零开始用webpack构建一个vue3.0项目工程的实现
2020/09/24 Javascript
video.js添加自定义组件的方法
2020/12/09 Javascript
[01:18]PWL开团时刻DAY10——一拳超人
2020/11/11 DOTA
python获取图片颜色信息的方法
2015/03/18 Python
Python实现SMTP发送邮件详细教程
2021/03/02 Python
高效使用Python字典的清单
2018/04/04 Python
python删除不需要的python文件方法
2018/04/24 Python
Python 利用scrapy爬虫通过短短50行代码下载整站短视频
2018/10/29 Python
由Python编写的MySQL管理工具代码实例
2019/04/09 Python
python全栈知识点总结
2019/07/01 Python
python数据预处理 :数据抽样解析
2020/02/24 Python
python 解决函数返回return的问题
2020/12/05 Python
Python如何实现Paramiko的二次封装
2021/01/30 Python
BIFFI美国站:意大利BIFFI BOUTIQUES豪华多品牌时装零售公司
2020/02/11 全球购物
给物业的表扬信
2014/01/21 职场文书
李培根演讲稿
2014/05/22 职场文书
第一军规观后感
2015/06/12 职场文书
iPhone13 Pro外观确定,升级4800万镜头,4月20日发新品
2021/04/15 数码科技
深入浅出的讲解:信号调制到底是如何实现的
2022/02/18 无线电