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 相关文章推荐
pycharm 使用心得(七)一些实用功能介绍
Jun 06 Python
利用Anaconda完美解决Python 2与python 3的共存问题
May 25 Python
Python编程使用tkinter模块实现计算器软件完整代码示例
Nov 29 Python
Python决策树分类算法学习
Dec 22 Python
python正则表达式及使用正则表达式的例子
Jan 22 Python
python爬虫之验证码篇3-滑动验证码识别技术
Apr 11 Python
python爬虫selenium和phantomJs使用方法解析
Aug 08 Python
pandas中遍历dataframe的每一个元素的实现
Oct 23 Python
python flask中动态URL规则详解
Nov 22 Python
对python中 math模块下 atan 和 atan2的区别详解
Jan 17 Python
浅谈在django中使用filter()(即对QuerySet操作)时踩的坑
Mar 31 Python
Django基于客户端下载文件实现方法
Apr 21 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的开发框架的现状和展望
2007/03/16 PHP
php 随机记录mysql rand()造成CPU 100%的解决办法
2010/05/18 PHP
php实现12306余票查询、价格查询示例
2014/04/17 PHP
分享50个提高PHP执行效率的技巧
2015/12/26 PHP
网站被黑的假象--ARP欺骗之页面中加入一段js
2007/05/16 Javascript
jQuery插件实现控制网页元素动态居中显示
2015/03/24 Javascript
JS查找字符串中出现次数最多的字符
2016/09/05 Javascript
Angular.JS实现无限级的联动菜单(使用demo)
2017/02/08 Javascript
前端axios下载excel文件(二进制)的处理方法
2018/07/31 Javascript
JavaScript 实现HTML DOM增删改查操作的常见方法详解
2020/01/04 Javascript
vue实现下拉菜单树
2020/10/22 Javascript
[01:07:13]TNC vs Pain 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
python计算时间差的方法
2015/05/20 Python
Python的Twisted框架中使用Deferred对象来管理回调函数
2016/05/25 Python
python输入错误密码用户锁定实现方法
2017/11/27 Python
python微信好友数据分析详解
2018/11/19 Python
Python实现定时自动关闭的tkinter窗口方法
2019/02/16 Python
Python queue队列原理与应用案例分析
2019/09/27 Python
pandas中read_csv的缺失值处理方式
2019/12/19 Python
如何给Python代码进行加密
2020/01/10 Python
pytorch方法测试详解——归一化(BatchNorm2d)
2020/01/15 Python
Python计算公交发车时间的完整代码
2020/02/12 Python
Python如何绘制日历图和热力图
2020/08/07 Python
用CSS3打造HTML5的Logo(实现代码)
2016/06/16 HTML / CSS
在IE6系列等老式浏览器中使用HTML5的新标签实现方案
2012/12/25 HTML / CSS
乔丹诺(Giordano)酒庄德国官网:找到最好的意大利葡萄酒
2017/12/28 全球购物
在SQL Server中创建数据库主要有那种方式
2013/09/10 面试题
群众路线批评与自我批评
2014/02/06 职场文书
C++程序员求职信范文
2014/04/14 职场文书
正科级干部考察材料
2014/05/29 职场文书
小学课外活动总结
2014/07/09 职场文书
2014年党员整改措施范文
2014/09/21 职场文书
临时用工协议书范本
2014/10/29 职场文书
试用期转正工作总结2015
2015/05/28 职场文书
python blinker 信号库
2022/05/04 Python
vue如何在data中引入图片的正确路径
2022/06/05 Vue.js