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 相关文章推荐
Windows下安装python2.7及科学计算套装
Mar 05 Python
详解Python中__str__和__repr__方法的区别
Apr 17 Python
如何使用python爬取csdn博客访问量
Feb 14 Python
Linux中Python 环境软件包安装步骤
Mar 31 Python
Python socket网络编程TCP/IP服务器与客户端通信
Jan 05 Python
python对list中的每个元素进行某种操作的方法
Jun 29 Python
python解压TAR文件至指定文件夹的实例
Jun 10 Python
python3 BeautifulSoup模块使用字典的方法抓取a标签内的数据示例
Nov 28 Python
YUV转为jpg图像的实现
Dec 09 Python
pytorch:torch.mm()和torch.matmul()的使用
Dec 27 Python
浅谈python print(xx, flush = True) 全网最清晰的解释
Feb 21 Python
python GUI库图形界面开发之PyQt5信号与槽机制、自定义信号基础介绍
Feb 25 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下MAIL的另一解决方案
2006/10/09 PHP
php判断终端是手机还是电脑访问网站的思路及代码
2013/04/24 PHP
php 获取页面中指定内容的实现类
2014/01/23 PHP
页面利用渐进式JPEG来提升用户体验度
2014/12/01 PHP
PHP输出日历表代码实例
2015/03/27 PHP
PHP+MySQL使用mysql_num_rows实现模糊查询图书信息功能
2018/05/31 PHP
详解php协程知识点
2018/09/21 PHP
PHP常量及变量区别原理详解
2020/08/14 PHP
jQuery 在光标定位的地方插入文字的插件
2012/05/10 Javascript
Jquery解析json数据详解
2013/12/26 Javascript
JS获取多维数组中相同键的值实现方法示例
2017/01/06 Javascript
Ajax异步获取html数据中包含js方法无效的解决方法
2017/02/20 Javascript
vue路由嵌套的SPA实现步骤
2017/11/06 Javascript
使用JS获取SessionStorage的值
2018/01/12 Javascript
JavaScript事件发布/订阅模式原理与用法分析
2018/08/21 Javascript
详解Vue webapp项目通过HBulider打包原生APP(vue+webpack+HBulider)
2019/02/02 Javascript
解决vue.js提交数组时出现数组下标的问题
2019/11/05 Javascript
Python利用前序和中序遍历结果重建二叉树的方法
2016/04/27 Python
Python正则抓取网易新闻的方法示例
2017/04/21 Python
Python 高级专用类方法的实例详解
2017/09/11 Python
git进行版本控制心得详谈
2017/12/10 Python
pandas 把数据写入txt文件每行固定写入一定数量的值方法
2018/12/28 Python
python给指定csv表格中的联系人群发邮件(带附件的邮件)
2019/12/31 Python
python画环形图的方法
2020/03/25 Python
python工具——Mimesis的简单使用教程
2021/01/16 Python
HTML5之SVG 2D入门6—视窗坐标系与用户坐标系及变换概述
2013/01/30 HTML / CSS
美国户外生活方式品牌:Eddie Bauer
2016/12/28 全球购物
阿迪达斯墨西哥官方网站:adidas墨西哥
2017/11/03 全球购物
“四风”问题自我剖析材料思想汇报
2014/09/23 职场文书
处级领导班子全部召开专题民主生活会情况汇报
2014/09/27 职场文书
学校食堂食品安全承诺书
2015/04/29 职场文书
公积金贷款承诺书
2015/04/30 职场文书
2015年计划生育协会工作总结
2015/05/13 职场文书
K8s部署发布Golang应用程序的实现方法
2021/07/16 Golang
《黑岩★★射手 DAWN FALL》BD发售宣传CM公开
2022/04/04 日漫
uniapp 微信小程序 自定义tabBar 导航
2022/04/22 Javascript