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抓取某汽车网数据解析html存入excel示例
Dec 04 Python
python实现在目录中查找指定文件的方法
Nov 11 Python
Python使用metaclass实现Singleton模式的方法
May 05 Python
在Python中处理日期和时间的基本知识点整理汇总
May 22 Python
安装python时MySQLdb报错的问题描述及解决方法
Mar 20 Python
Python 读取图片文件为矩阵和保存矩阵为图片的方法
Apr 27 Python
python实现可逆简单的加密算法
Mar 22 Python
详解Python 解压缩文件
Apr 09 Python
pytorch 模型可视化的例子
Aug 17 Python
Python爬虫图片懒加载技术 selenium和PhantomJS解析
Sep 18 Python
Python sorted排序方法如何实现
Mar 31 Python
python上下文管理的使用场景实例讲解
Mar 03 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
ThinkPHP之R方法实例详解
2014/06/20 PHP
给Javascript数组插入一条记录的代码
2007/08/30 Javascript
JavaScript 私有成员分析
2009/01/13 Javascript
让div层随鼠标移动的实现代码 ie ff
2009/12/18 Javascript
javascript来定义类的规范小结
2010/11/19 Javascript
JavaScript创建对象的写法
2013/08/29 Javascript
JS小功能(onmouseover实现选择月份)实例代码
2013/11/28 Javascript
js实现超酷的照片墙展示效果图附源码下载
2015/10/08 Javascript
BootStrap的JS插件之轮播效果案例详解
2016/05/16 Javascript
微信小程序 条件渲染详解
2016/10/09 Javascript
jQuery特殊符号转义的实现
2016/11/30 Javascript
在ABP框架中使用BootstrapTable组件的方法
2017/07/31 Javascript
vue轮播图插件vue-concise-slider的使用
2018/03/13 Javascript
Vue中使用vue-i18插件实现多语言切换功能
2018/04/25 Javascript
angular学习之动态创建表单的方法
2018/12/07 Javascript
深入理解es6块级作用域的使用
2019/03/28 Javascript
element 动态合并表格的步骤
2020/12/31 Javascript
[02:15]2015国际邀请赛选手档案IG.Ferrari 430
2015/07/30 DOTA
Python中urllib2模块的8个使用细节分享
2015/01/01 Python
用Python的Django框架来制作一个RSS阅读器
2015/07/22 Python
Python Selenium异常处理的实例分析
2021/02/28 Python
Pytorch 中的optimizer使用说明
2021/03/03 Python
三星美国官网:Samsung美国
2017/02/06 全球购物
Mixbook加拿大:照片书,照片卡,剪贴簿,年历和日历
2017/02/21 全球购物
公司营业员的工作总结自我评价
2013/10/05 职场文书
医药大学生求职简历的自我评价
2013/10/17 职场文书
英语专业毕业生自荐信范文
2013/12/31 职场文书
个人能力自我鉴赏
2014/01/25 职场文书
金融与证券专业求职信
2014/06/22 职场文书
会议接待欢迎词范文
2015/01/26 职场文书
收银员岗位职责范本
2015/04/07 职场文书
公司副总经理岗位职责
2015/04/08 职场文书
项目技术负责人岗位职责
2015/04/13 职场文书
电影雨中的树观后感
2015/06/15 职场文书
简历中的自我评价应该这样写!
2019/07/12 职场文书
公文写作:新员工转正申请书范本3篇!
2019/08/07 职场文书