方案1:一次性爬取全部淘宝美食信息

1. spider.py文件如下

  1. __author__ = 'Administrator'
  2. from selenium import webdriver
  3. from selenium.webdriver.common.by import By
  4. from selenium.webdriver.support.ui import WebDriverWait
  5. from selenium.webdriver.support import expected_conditions as EC
  6. import re
  7. from pyquery import PyQuery as pq
  8. from config import *
  9. import pymongo
  10.  
  11. client = pymongo.MongoClient(MONGO_URL)
  12. db = client[MONGO_DB]
  13.  
  14. browser = webdriver.Chrome()
  15. """
  16. 如果把Chrome修改为使用PhantomJS
  17. 1. 首先需要安装phantomJS
  18. 2. 自定义一些配置参数,这里不加载图片以及使用缓存
  19. browser = webdriver.PhantomJS(service_args=SERVICE_ARGS)
  20. 3. 设置窗口大小
  21. browser.set_window_size(1400,900)
  22. """
  23.  
  24. wait = WebDriverWait(browser, 10) #显示等待10秒再查找目标元素
  25.  
  26. def search():
  27. # print('正在搜索') 用于phantomJS调试
  28. try:
  29. browser.get('https://www.taobao.com')
  30. input1 = wait.until(
  31. EC.presence_of_element_located((By.CSS_SELECTOR, '#q')) #定位搜索框
  32. )
  33. submit = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '#J_TSearchForm > div.search-button > button'))) #定位搜索按钮
  34. # 这里的美食可以替换为配置文件中的变量KEYWORD
  35. input1.send_keys('KEYWORD')
  36. submit.click()
  37. total = wait.until(
  38. EC.presence_of_element_located((By.CSS_SELECTOR, '#mainsrp-pager > div > div > div > div.total'))) #定位总页数,使用右键copy selector的方法找出参数名
  39. # 调用get_products
  40. get_products()
  41. return total.text
  42.  
  43. except TimeoutError:
  44. return search()
  45.  
  46. # 使用翻页输入框来翻页
  47. def next_page(page_number):
  48. # print('正在翻页',page_number) 用于phantomJS调试
  49. try:
  50. input1 = wait.until(
  51. EC.presence_of_element_located((By.CSS_SELECTOR, '#mainsrp-pager > div > div > div > div.form > input'))
  52. )
  53. submit = wait.until(
  54. EC.element_to_be_clickable((By.CSS_SELECTOR, '#mainsrp-pager > div > div > div > div.form > span.btn.J_Submit'))
  55. )
  56. input1.clear()
  57. input1.send_keys(page_number)
  58. submit.click()
  59. # 根据选择页面会高亮这个条件,来判断是否成功跳转
  60. wait.until(EC.text_to_be_present_in_element(
  61. (By.CSS_SELECTOR, '#mainsrp-pager > div > div > div > ul > li.item.active > span'), str(page_number)))
  62. # 调用get_products()
  63. get_products()
  64.  
  65. except TimeoutError:
  66. next_page(page_number)
  67.  
  68. # 解析信息
  69. def get_products():
  70. wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '#mainsrp-itemlist .items .item')))
  71. html = browser.page_source
  72. doc = pq(html)
  73. items = doc('#mainsrp-itemlist .items .item').items()
  74. for item in items:
  75. product = {
  76. 'image': item.find('.pic .img').attr('src'),
  77. 'price': item.find('.price').text(),
  78. 'deal': item.find('.deal-cnt').text()[:-3],
  79. 'title': item.find('.title').text(),
  80. 'shop': item.find('.shop').text(),
  81. 'location': item.find('.location').text()
  82. }
  83. print(product)
  84. # 保存数据到mongodb
  85. save_to_mongo(product)
  86.  
  87. # 定义一个保存到mongodb的方法
  88. def save_to_mongo(result):
  89. try:
  90. if db[MON_TABLE].insert(result):
  91. print('存储到MONGODB成功', result)
  92. except Exception:
  93. print('存储到MONGODB失败', result)
  94.  
  95. def main():
  96. try:
  97. # 输出100数字
  98. total = search()
  99. total = int(re.compile('(\d+)').search(total).group(1))
  100. # 调用翻页函数
  101. for i in range(2, total + 1):
  102. next_page(i)
  103. except Exception:
  104. print('出错了')
  105.  
  106. finally:
  107. browser.close()
  108.  
  109. if __name__ == '__main__':
  110. main()

2. config.py

  1. __author__ = 'Administrator'
  2. MONGO_URL = 'localhost'
  3. MONGO_DB = 'taobao'
  4. MON_TABLE = 'product'
  5.  
  6. # 配置phantomJS
  7. SERVICE_ARGS = ['--load-images=false', '--disk-cache=true']
  8. KEYWORD = '美食'

方案2:上面这种方法经测试可正常运行,但是会一次性爬取全部数据,数据量较大且不能灵活控制抓取内容,下面代码基本实现方法如下

1. 把搜索的关键字直接放在url中

2. 分页抓取商品信息

3. 使用chrome的headless功能

  1. import pymongo
  2. from selenium import webdriver
  3. from selenium.common.exceptions import TimeoutException
  4. from selenium.webdriver.common.by import By
  5. from selenium.webdriver.support import expected_conditions as EC
  6. from selenium.webdriver.support.wait import WebDriverWait
  7. from pyquery import PyQuery as pq
  8. from config import *
  9. from urllib.parse import quote
  10.  
  11. # browser = webdriver.Chrome()
  12. # browser = webdriver.PhantomJS(service_args=SERVICE_ARGS)
  13.  
  14. chrome_options = webdriver.ChromeOptions()
  15. chrome_options.add_argument('--headless')
  16. browser = webdriver.Chrome(chrome_options=chrome_options)
  17.  
  18. wait = WebDriverWait(browser, 10)
  19. client = pymongo.MongoClient(MONGO_URL)
  20. db = client[MONGO_DB]
  21.  
  22. def index_page(page):
  23. """
  24. 抓取索引页
  25. :param page: 页码
  26. """
  27. print('正在爬取第', page, '页')
  28. try:
  29. url = 'https://s.taobao.com/search?q=' + quote(KEYWORD)
  30. browser.get(url)
  31. if page > 1:
  32. #定位页码输入框
  33. input = wait.until(
  34. EC.presence_of_element_located((By.CSS_SELECTOR, '#mainsrp-pager div.form > input')))
  35. ##定位页码跳转确定按钮
  36. submit = wait.until(
  37. EC.element_to_be_clickable((By.CSS_SELECTOR, '#mainsrp-pager div.form > span.btn.J_Submit')))
  38. input.clear()
  39. input.send_keys(page)
  40. submit.click()
  41.  
  42. """
  43. 验证是否跳转到对应的页码
  44. 只需要判断当前高亮的页码数是当前的页码数即可,可使用等待条件text_to_be_present_in_element,它会等待指定的文本出现在某一节点里面时即返回成功
  45. 我们将高亮的页面节点对应的css选择器和当前要跳转的页面作为这个等待条件的参数,那么这个等待条件就会检测此页码节点是否为指定的页码数
  46. """
  47. wait.until(
  48. EC.text_to_be_present_in_element((By.CSS_SELECTOR, '#mainsrp-pager li.item.active > span'), str(page)))
  49.  
  50. #等待商品信息加载,选择器'.m-itemlist .items .item'对应的页面内容就是每个商品的信息,如果加载成功,执行get_products()
  51. wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '.m-itemlist .items .item')))
  52. get_products()
  53. except TimeoutException:
  54. index_page(page)
  55.  
  56. #解析商品列表
  57. def get_products():
  58. """
  59. 提取商品数据
  60. """
  61. html = browser.page_source
  62. doc = pq(html)
  63. items = doc('#mainsrp-itemlist .items .item').items()
  64. for item in items:
  65. product = {
  66. 'image': item.find('.pic .img').attr('data-src'),
  67. 'price': item.find('.price').text(),
  68. 'deal': item.find('.deal-cnt').text(), #成交量
  69. 'title': item.find('.title').text(),
  70. 'shop': item.find('.shop').text(),
  71. 'location': item.find('.location').text()
  72. }
  73. print(product)
  74. save_to_mongo(product)
  75.  
  76. def save_to_mongo(result):
  77. """
  78. 保存至MongoDB
  79. :param result: 结果
  80. """
  81. try:
  82. if db[MONGO_COLLECTION].insert(result):
  83. print('存储到MongoDB成功')
  84. except Exception:
  85. print('存储到MongoDB失败')
  86.  
  87. def main():
  88. """
  89. 遍历每一页
  90. """
  91. for i in range(1, MAX_PAGE + 1):
  92. index_page(i)
  93. browser.close()
  94.  
  95. if __name__ == '__main__':
  96. main()

对应的配置文件如下

  1. MONGO_URL = 'localhost'
  2. MONGO_DB = 'taobao'
  3. MONGO_COLLECTION = 'products'
  4.  
  5. KEYWORD = 'ipad'
  6.  
  7. MAX_PAGE = 100
  8.  
  9. SERVICE_ARGS = ['--load-images=false', '--disk-cache=true']

爬虫实战4:用selenium爬取淘宝美食的更多相关文章

  1. 利用Selenium爬取淘宝商品信息

    一.  Selenium和PhantomJS介绍 Selenium是一个用于Web应用程序测试的工具,Selenium直接运行在浏览器中,就像真正的用户在操作一样.由于这个性质,Selenium也是一 ...

  2. python3编写网络爬虫16-使用selenium 爬取淘宝商品信息

    一.使用selenium 模拟浏览器操作爬取淘宝商品信息 之前我们已经成功尝试分析Ajax来抓取相关数据,但是并不是所有页面都可以通过分析Ajax来完成抓取.比如,淘宝,它的整个页面数据确实也是通过A ...

  3. PYTHON 爬虫笔记十:利用selenium+PyQuery实现淘宝美食数据搜集并保存至MongeDB(实战项目三)

    利用selenium+PyQuery实现淘宝美食数据搜集并保存至MongeDB 目标站点分析 淘宝页面信息很复杂的,含有各种请求参数和加密参数,如果直接请求或者分析Ajax请求的话会很繁琐.所以我们可 ...

  4. Selenium爬取淘宝商品概要入mongodb

    准备: 1.安装Selenium:终端输入 pip install selenium 2.安装下载Chromedriver:解压后放在…\Google\Chrome\Application\:如果是M ...

  5. 使用Selenium爬取淘宝商品

    import pymongo from selenium import webdriver from selenium.common.exceptions import TimeoutExceptio ...

  6. 【Python爬虫案例学习】Python爬取淘宝店铺和评论

    安装开发需要的一些库 (1) 安装mysql 的驱动:在Windows上按win+r输入cmd打开命令行,输入命令pip install pymysql,回车即可. (2) 安装自动化测试的驱动sel ...

  7. 使用scrapy+selenium爬取淘宝网

    --***2019-3-27测试有效***---- 第一步: 打开cmd,输入scrapy startproject taobao_s新建一个项目. 接着cd 进入我们的项目文件夹内输入scrapy ...

  8. 【Python爬虫案例学习】python爬取淘宝里的手机报价并以价格排序

    第一步: 先分析这个url,"?"后面的都是它的关键字,requests中get函数的关键字的参数是params,post函数的关键字参数是data, 关键字用字典的形式传进去,这 ...

  9. 关于爬虫的日常复习(10)—— 实战:使用selenium模拟浏览器爬取淘宝美食

随机推荐

  1. SpringMvc配置拦截器

    SpringMVC可以通过配置拦截器,进行url过滤等处理. 在spring-mvc.xml的配置文件中,如下示: 其中,在<mvc:interceptors>中可以配置多个拦截器< ...

  2. 在windows下安装python包管理器pip及使用

      从来没有在Windows下用过pip,今天试了下,原来pip也可以在Windows下安装,使用也和Linux下一样简单. 先从下面的地址下载pip源码: http://pypi.python.or ...

  3. Linux内核分析 - 网络[十四]:IP选项

    Linux内核分析 - 网络[十四]:IP选项 标签: linux内核网络structsocketdst 2012-04-25 17:14 5639人阅读 评论(1) 收藏 举报  分类: 内核协议栈 ...

  4. 配置yum源方法,以及失效时的处理

    正常方法如下: step1: 备份原CentOS-Base.repo 文件 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-B ...

  5. VC++知识点整理

    1.内联函数        定义:定义在类体内的成员函数,即函数的函数体放在类体内        特点:在调用处用内联函数体的代码来替换,用于解决程序的运行效率问题.一定要在调用之前定义,并且内联函数 ...

  6. Java 设计模式系列(十二)代理模式

    Java 设计模式系列(十二)代理模式 代理模式是对象的结构模式.代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用. package com.github.binarylei.de ...

  7. Linux中bash编程

    bash编程也叫shell编程 预定义变量         $? 最后一次执行的命令的返回状态.如果这个变量的值为0,证明上一个命令正确的执行:如果这个变量返回的值非0(具体是那个数,有命令自己来决定 ...

  8. Swift实现UIKit Dynamic动画

    iOS7引入了UIKit Dynamics,可以帮助开发者开发出更接近真实世界的动画效果.之前,用户如果要做出这样的效果,需要话很多的时间在物理计算和Core Animation上.现在,所有的一切都 ...

  9. Android如何判断当前手机是否正在播放音乐,并获取到正在播放的音乐的信息

    我想实现如下的场景,判断当前Android手机上是否正在播放音乐,如果是,通过某个特定的手势, 或者点击某个按键,将当前我正在听的音乐共享出去. 第一步,就是判断当前是否有音乐正在播放. 最开始我想得 ...

  10. VC++中MessageBox的常见用法详解

    消息框是个很常用的控件,属性比较多,本文列出了它的一些常用方法,及指出了它的一些应用场合.         1.MessageBox("这是一个最简单的消息框!");        ...