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基础教程之lambda表达式使用方法
Feb 12 Python
Python中如何获取类属性的列表
Dec 26 Python
python获取中文字符串长度的方法
Nov 14 Python
用python脚本24小时刷浏览器的访问量方法
Dec 07 Python
Python 正则表达式匹配字符串中的http链接方法
Dec 25 Python
python自动分箱,计算woe,iv的实例代码
Nov 22 Python
python飞机大战pygame游戏框架搭建操作详解
Dec 17 Python
flask框架渲染Jinja模板与传入模板变量操作详解
Jan 25 Python
python numpy--数组的组合和分割实例
Feb 24 Python
Python 使用office365邮箱的示例
Oct 29 Python
Python利用matplotlib绘制折线图的新手教程
Nov 05 Python
Python 爬取淘宝商品信息栏目的实现
Feb 06 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
Yii实现自动加载类地图的方法
2015/04/01 PHP
神奇的代码 通杀各种网站-可随意修改复制页面内容
2008/07/17 Javascript
Js 获取当前日期时间及其它操作实现代码
2021/03/04 Javascript
javascript new 需不需要继续使用
2009/07/02 Javascript
基于jQuery的淡入淡出可自动切换的幻灯插件打包下载
2010/09/15 Javascript
addEventListener()第三个参数useCapture (Boolean)详细解析
2013/11/07 Javascript
JavaScript对象的property属性详解
2014/04/01 Javascript
加随机数引入脚本不让浏览器读取缓存
2014/09/04 Javascript
jquery中map函数遍历数组用法实例
2015/05/18 Javascript
探索Javascript中this的奥秘
2016/12/11 Javascript
js多个物体运动功能实例分析
2016/12/20 Javascript
vue.js实现含搜索的多种复选框(附源码)
2017/03/23 Javascript
原生js的ajax和解决跨域的jsonp(实例讲解)
2017/10/16 Javascript
浅析Vue自定义组件的v-model
2017/11/26 Javascript
python 专题九 Mysql数据库编程基础知识
2017/03/16 Python
python中nan与inf转为特定数字方法示例
2017/05/11 Python
Python操作mysql数据库实现增删查改功能的方法
2018/01/15 Python
基于Python Numpy的数组array和矩阵matrix详解
2018/04/04 Python
Python 实现选择排序的算法步骤
2018/04/22 Python
Django项目中用JS实现加载子页面并传值的方法
2018/05/28 Python
python mac下安装虚拟环境的图文教程
2019/04/12 Python
使用Puppeteer爬取微信文章的实现
2020/02/11 Python
解决Opencv+Python cv2.imshow闪退问题
2020/04/24 Python
python按照list中字典的某key去重的示例代码
2020/10/13 Python
python从Oracle读取数据生成图表
2020/10/14 Python
维德科技C#面试题笔试题
2015/12/09 面试题
护士自荐信
2013/10/25 职场文书
语文教育专业推荐信范文
2013/11/25 职场文书
文明演讲稿范文
2014/05/12 职场文书
加油口号大全
2014/06/13 职场文书
路政管理求职信
2014/06/18 职场文书
党的群众路线教育实践活动总结大会主持词
2014/10/30 职场文书
公司总经理岗位职责
2015/04/01 职场文书
工作收入证明模板
2015/06/12 职场文书
html5移动端禁止长按图片保存的实现
2021/04/20 HTML / CSS
教你如何用Python实现人脸识别(含源代码)
2021/06/23 Python