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中optionParser模块的使用方法实例教程
Aug 29 Python
python实现实时监控文件的方法
Aug 26 Python
Python实现简单的获取图片爬虫功能示例
Jul 12 Python
Python实现App自动签到领取积分功能
Sep 29 Python
python for循环输入一个矩阵的实例
Nov 14 Python
使用 Python 玩转 GitHub 的贡献板(推荐)
Apr 04 Python
Python3中urlencode和urldecode的用法详解
Jul 23 Python
详解Python中的正斜杠与反斜杠
Aug 09 Python
python写入数据到csv或xlsx文件的3种方法
Aug 23 Python
Python List列表对象内置方法实例详解
Oct 22 Python
pytorch sampler对数据进行采样的实现
Dec 31 Python
Python把图片转化为pdf代码实例
Jul 28 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免费发送定时短信的实例
2016/10/24 PHP
PHP实现会员账号单唯一登录的方法分析
2019/03/07 PHP
Thinkphp5 自定义上传文件名的实现方法
2019/07/23 PHP
JavaScript实现简单图片滚动附源码下载
2014/06/17 Javascript
jQuery html()方法使用不了无法显示内容的问题
2014/08/06 Javascript
node.js开机自启动脚本文件
2014/12/24 Javascript
javascript变量声明实例分析
2015/04/25 Javascript
javascript框架设计之种子模块
2015/06/23 Javascript
JS组件系列之Bootstrap table表格组件神器【终结篇】
2016/05/10 Javascript
当jquery ajax遇上401请求的解决方法
2016/05/19 Javascript
AngularJS基础 ng-hide 指令用法及示例代码
2016/08/01 Javascript
深入理解vue2.0路由如何配置问题
2017/07/18 Javascript
jQuery实现输入框的放大和缩小功能示例
2018/07/21 jQuery
JS插件clipboard.js实现一键复制粘贴功能
2020/12/04 Javascript
从组件封装看Vue的作用域插槽的实现
2019/02/12 Javascript
深入了解query和params的使用区别
2019/06/24 Javascript
浅析Vue 中的 render 函数
2020/02/28 Javascript
js利用iframe实现选项卡效果
2020/08/09 Javascript
跟老齐学Python之用while来循环
2014/10/02 Python
轻松理解Python 中的 descriptor
2017/09/15 Python
python实现数据预处理之填充缺失值的示例
2017/12/22 Python
django 通过ajax完成邮箱用户注册、激活账号的方法
2018/04/17 Python
解决PyCharm的Python.exe已经停止工作的问题
2018/11/29 Python
python return逻辑判断表达式实现解析
2019/12/02 Python
Python实现微信表情包炸群功能
2021/01/28 Python
CSS3 制作旋转的大风车(充满童年回忆)
2013/01/30 HTML / CSS
英国领先的在线旅游和休闲零售商:lastminute.com
2019/01/23 全球购物
Java的五个基础面试题
2016/02/26 面试题
小学庆六一活动总结
2014/08/28 职场文书
车辆年审委托书范本
2014/09/18 职场文书
2016新年感言
2015/08/03 职场文书
2016春季运动会前导词
2015/11/25 职场文书
民警忠诚教育心得体会
2016/01/23 职场文书
Redis遍历所有key的两个命令(KEYS 和 SCAN)
2021/04/12 Redis
SQL Server中搜索特定的对象
2022/05/25 SQL Server
Nginx本地配置SSL访问的实例教程
2022/05/30 Servers