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网络编程学习笔记(九):数据库客户端 DB-API
Jun 09 Python
Python多进程机制实例详解
Jul 02 Python
详解Django中的form库的使用
Jul 18 Python
Python json 错误xx is not JSON serializable解决办法
Mar 15 Python
Python机器学习之决策树算法
Dec 22 Python
python地震数据可视化详解
Jun 18 Python
django框架模板中定义变量(set variable in django template)的方法分析
Jun 24 Python
python实现大文件分割与合并
Jul 22 Python
python add_argument()用法解析
Jan 29 Python
Python内建序列通用操作6种实现方法
Mar 26 Python
python中plt.imshow与cv2.imshow显示颜色问题
Jul 16 Python
Python 使用xlwt模块将多行多列数据循环写入excel文档的操作
Nov 10 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
用户的详细注册和判断
2006/10/09 PHP
phpmyadmin 常用选项设置详解版
2010/03/07 PHP
PHP获取指定时间段之间的 年,月,天,时,分,秒
2016/06/05 PHP
php 自定义错误日志实例详解
2016/11/12 PHP
PHP开发之归档格式phar文件概念与用法详解【创建,使用,解包还原提取】
2017/11/17 PHP
document 和 document.all 分别什么时候用
2006/06/22 Javascript
ExtJS Ext.MessageBox.alert()弹出对话框详解
2010/04/02 Javascript
JQuery 自定义CircleAnimation,Animate方法学习笔记
2011/07/10 Javascript
jquery 插件学习(一)
2012/08/06 Javascript
利用js实现前台动态添加文本框,后台获取文本框内容(示例代码)
2013/11/25 Javascript
eclipse导入jquery包后报错的解决方法
2014/02/17 Javascript
Javascript验证上传图片大小[前台处理]
2014/07/18 Javascript
了不起的node.js读书笔记之mongodb数据库交互
2014/12/22 Javascript
PHP中CURL的几个经典应用实例
2015/01/23 Javascript
认识Knockout及如何使用Knockout绑定上下文
2015/12/25 Javascript
JS 实现导航菜单中的二级下拉菜单的几种方式
2016/10/31 Javascript
微信小程序 swiper组件轮播图详解及实例
2016/11/16 Javascript
jquery实现图片放大点击切换
2017/06/06 jQuery
vue 实现 ios 原生picker 效果及实现思路解析
2017/12/06 Javascript
Vue.js实现大屏数字滚动翻转效果
2019/11/29 Javascript
Pandas读取并修改excel的示例代码
2019/02/17 Python
python实现图片九宫格分割
2021/03/07 Python
python基础教程之while循环
2019/08/14 Python
python numpy实现多次循环读取文件 等间隔过滤数据示例
2020/03/14 Python
3种适用于Python的疯狂秘密武器及原因解析
2020/04/29 Python
使用matplotlib的pyplot模块绘图的实现示例
2020/07/12 Python
matplotlib教程——强大的python作图工具库
2020/10/15 Python
浅谈Html5页面打开app的一些思考
2020/03/30 HTML / CSS
毕业生自荐信
2013/12/14 职场文书
职业生涯规划书范文
2014/03/10 职场文书
美国留学经济担保书
2014/05/20 职场文书
党员干部一句话承诺
2014/05/30 职场文书
2015年端午节活动方案
2015/05/05 职场文书
写给医护人员的一封感谢信
2019/09/16 职场文书
JS前端使用canvas实现物体的点选示例
2022/08/05 Javascript
Mysql的Table doesn't exist问题及解决
2022/12/24 MySQL