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脚本
Apr 05 Python
Python中请使用isinstance()判断变量类型
Aug 25 Python
Python中用pycurl监控http响应时间脚本分享
Feb 02 Python
安装dbus-python的简要教程
May 05 Python
Sanic框架路由用法实例分析
Jul 16 Python
Python基于百度云文字识别API
Dec 13 Python
numpy基础教程之np.linalg
Feb 12 Python
Win10环境python3.7安装dlib模块趟过的坑
Aug 01 Python
基于h5py的使用及数据封装代码
Dec 26 Python
基于keras输出中间层结果的2种实现方式
Jan 24 Python
详解pandas.DataFrame.plot() 画图函数
Jun 14 Python
只用Python就可以制作的简单词云
Jun 07 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数字格式化
2006/12/06 PHP
PHP实现手机归属地查询API接口实现代码
2012/08/27 PHP
yii框架通过控制台命令创建定时任务示例
2014/04/30 PHP
php unlink()函数使用教程
2018/07/12 PHP
一个简单的JavaScript数据缓存系统实现代码
2010/10/24 Javascript
下载文件个别浏览器文件名乱码解决办法
2013/03/19 Javascript
JavaScript实现的多种鼠标拖放效果
2015/11/03 Javascript
JavaScript 数组的深度复制解析
2016/11/02 Javascript
提高JavaScript执行效率的23个实用技巧
2017/03/01 Javascript
详解nodeJS中读写文件方法的区别
2017/03/06 NodeJs
微信小程序实现皮肤功能(夜间模式)
2017/06/18 Javascript
vue scroller返回页面记住滚动位置的实例代码
2018/01/29 Javascript
利用Bootstrap Multiselect实现下拉框多选功能
2019/04/08 Javascript
jquery实现直播弹幕效果
2019/11/28 jQuery
JS代码检查工具ESLint介绍与使用方法
2020/02/04 Javascript
Node.js API详解之 tty功能与用法实例分析
2020/04/27 Javascript
[03:16]DOTA2完美大师赛主赛事首日集锦
2017/11/23 DOTA
在Django的URLconf中进行函数导入的方法
2015/07/18 Python
编写Python脚本抓取网络小说来制作自己的阅读器
2015/08/20 Python
python 3利用BeautifulSoup抓取div标签的方法示例
2017/05/28 Python
python实现字符串中字符分类及个数统计
2018/09/28 Python
selenium+python 对输入框的输入处理方法
2018/10/11 Python
django模板加载静态文件的方法步骤
2019/03/01 Python
Python爬虫爬取Bilibili弹幕过程解析
2019/10/10 Python
节日快乐! Python画一棵圣诞树送给你
2019/12/24 Python
在python中使用pymysql往mysql数据库中插入(insert)数据实例
2020/03/02 Python
pycharm工具连接mysql数据库失败问题
2020/04/01 Python
python在一个范围内取随机数的简单实例
2020/08/16 Python
Pandas中DataFrame交换列顺序的方法实现
2020/12/14 Python
伦敦剧院及景点门票:Encore Tickets
2018/07/01 全球购物
3D空间设计学生找工作的自我评价
2013/10/28 职场文书
父亲节活动总结
2015/02/12 职场文书
2015年化验员工作总结
2015/04/10 职场文书
检察院起诉意见书
2015/05/20 职场文书
2015年防灾减灾工作总结
2015/07/24 职场文书
详解Java实现数据结构之并查集
2021/06/23 Java/Android