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对比C语言的编程思想差异
Aug 30 Python
深入解析Python中函数的参数与作用域
Mar 20 Python
判断网页编码的方法python版
Aug 12 Python
Python解决N阶台阶走法问题的方法分析
Dec 28 Python
windows安装TensorFlow和Keras遇到的问题及其解决方法
Jul 10 Python
10分钟用python搭建一个超好用的CMDB系统
Jul 17 Python
简单了解python中的与或非运算
Sep 18 Python
如何基于python生成list的所有的子集
Nov 11 Python
Python cookie的保存与读取、SSL讲解
Feb 17 Python
keras的siamese(孪生网络)实现案例
Jun 12 Python
Python bisect模块原理及常见实例
Jun 17 Python
Python操作MySQL数据库的示例代码
Jul 13 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 magic_quotes_gpc的一点认识与分析
2008/08/18 PHP
php is_file 判断给定文件名是否为一个正常的文件
2010/05/10 PHP
使用array mutisort 实现按某字段对数据排序
2013/06/18 PHP
PHP获取服务器端信息的方法
2014/11/28 PHP
动态加载js的几种方法
2006/10/23 Javascript
javascript 兼容鼠标滚轮事件
2009/04/07 Javascript
Web前端设计模式  制作漂亮的弹出层
2010/10/29 Javascript
input禁止键盘及中文输入,但可以点击
2014/02/13 Javascript
select多选 multiple的使用示例
2014/06/16 Javascript
JS+CSS实现实用的单击输入框弹出选择框的方法
2015/02/28 Javascript
AngularJS中的$watch(),$digest()和$apply()区分
2016/04/04 Javascript
基于openlayers4实现点的扩散效果
2020/08/17 Javascript
jQuery实现列表的增加和删除功能
2018/06/14 jQuery
vue.js响应式原理解析与实现
2020/06/22 Javascript
Vue中使用ElementUI使用第三方图标库iconfont的示例
2018/10/11 Javascript
Vue组件之单向数据流的解决方法
2018/11/10 Javascript
Jquery 获取相同NAME 或者id删除行操作
2020/08/24 jQuery
[03:04]DOTA2超级联赛专访ZSMJ “莫名其妙”的逆袭
2013/05/23 DOTA
[51:28]EG vs Mineski 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/16 DOTA
[49:21]TNC vs VG 2019DOTA2国际邀请赛淘汰赛 胜者组赛BO3 第三场 8.20.mp4
2019/08/22 DOTA
[01:33:25]DOTA2-DPC中国联赛 正赛 Elephant vs IG BO3 第一场 1月24日
2021/03/11 DOTA
Python中使用中文的方法
2011/02/19 Python
Python实现Linux命令xxd -i功能
2016/03/06 Python
Python 搭建Web站点之Web服务器网关接口
2016/11/06 Python
Python中顺序表的实现简单代码分享
2018/01/09 Python
python中将正则过滤的内容输出写入到文件中的实例
2018/10/21 Python
学习python可以干什么
2019/02/26 Python
通过python扫描二维码/条形码并打印数据
2019/11/14 Python
pip 20.3 新版本发布!即将抛弃 Python 2.x(推荐)
2020/12/16 Python
python实现发送邮件
2021/03/02 Python
html5应用缓存_动力节点Java学院整理
2017/07/13 HTML / CSS
欧洲有机婴儿食品最大的市场:Organic Baby Food(供美国和加拿大)
2018/03/28 全球购物
领导干部学习“三严三实”思想汇报
2014/09/15 职场文书
2014年中职班主任工作总结
2014/12/16 职场文书
python opencv检测直线 cv2.HoughLinesP的实现
2021/06/18 Python
Node-Red实现MySQL数据库连接的方法
2021/08/07 MySQL