经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Python3 » 查看文章
python3实现爬取淘宝美食代码分享
来源:jb51  时间:2018/9/26 17:38:23  对本文有异议

环境:

ubuntu16.04
python3.5
python库: selenium, pyquery,pymongo, re

要求:

设置×××面浏览器访问,并将商品列表存入mongoDB数据库.

分析过程暂时略过

代码:

  1. #!/usr/bin/env python
  2. # -*- coding:utf-8 -*-
  3.  
  4. """
  5. 1.爬取淘宝美食的流程
  6. - 搜索关键字: 用selenium打开浏览器,模拟输入关键字,并搜索对应的商品列表.
  7. - 分析页码并翻页,模拟翻页,查看到所有页面的商品列表.
  8. - 分析并提取商品,利用Pyquery分析源码,解析得到商品列表.
  9. - 存储到MONGODB数据库,将商品列表信息存储到mongoDB数据库.
  10. """
  11. from selenium import webdriver
  12. from selenium.webdriver.common.by import By
  13. from selenium.webdriver.support.ui import WebDriverWait
  14. from selenium.webdriver.support import expected_conditions as EC
  15. from selenium.common.exceptions import TimeoutException
  16. from pyquery import PyQuery as pq
  17. import re
  18. from anli.mongoconfig import *
  19. import pymongo
  20.  
  21. client = pymongo.MongoClient(MONGO_URL)
  22. db = client[MONGO_DB]
  23.  
  24. #设置×××面访问
  25. opt = webdriver.FirefoxOptions()
  26. opt.set_headless()
  27. browser = webdriver.Firefox(options=opt)
  28.  
  29. #等待浏览器加载页面成功.
  30. wait = WebDriverWait(browser,10)
  31.  
  32. def search():
  33.   try:
  34.     # 后台打开浏览器
  35.     browser.get('https://www.taobao.com')
  36.  
  37.     # 用CSS选择器复制搜索框
  38.     input = wait.until(
  39.       EC.presence_of_element_located((By.CSS_SELECTOR, '#q'))
  40.     )
  41.  
  42.     # 找到搜索按钮.
  43.     submit = wait.until(
  44.       # EC.element_to_be_clickable((By.CSS_SELECTOR,'#J_TSearchForm .search-button')))
  45.       EC.element_to_be_clickable((By.CSS_SELECTOR,'#J_TSearchForm > div.search-button > button')))
  46.  
  47.     # 输入关键字
  48.     input.send_keys('美食')
  49.  
  50.     # 点击搜索按钮.
  51.     submit.click()
  52.  
  53.     # 输出总共的页数.
  54.     total=wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'.total')))
  55.  
  56.     # 调取商品列表的函数.
  57.     get_products()
  58.     return total.text
  59.   except TimeoutException: #超时错误.
  60.     return search()
  61.  
  62. # 翻页
  63. def next_page(page_number):
  64.   try:
  65.     #注意在firefox和chrome浏览器复制出来的元素不太一样.
  66.     #要传入的页码: 到第几页
  67.     input = wait.until(
  68.       EC.presence_of_element_located((By.CSS_SELECTOR,'input.input:nth-child(2)'))
  69.     )
  70.     #复制确定按钮的元素:
  71.     submit = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,'span.btn:nth-child(4)')))
  72.  
  73.     #清除页码
  74.     input.clear()
  75.     #输入当前页码
  76.     input.send_keys(page_number)
  77.  
  78.     #点击确定按钮.
  79.     submit.click()
  80.  
  81.     #判断当前页码是否是当前数字: 复制高亮页码数.
  82.     wait.until(EC.text_to_be_present_in_element((By.CSS_SELECTOR,'span.num'),str(page_number)))
  83.     get_products()
  84.   except TimeoutException:
  85.     next_page(page_number)
  86.  
  87. #解析jquery源码
  88. def get_products():
  89.   #商品列表:
  90.   wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#mainsrp-itemlist .items .item')))
  91.  
  92.   # 获取网页源码
  93.   html = browser.page_source
  94.   doc = pq(html)
  95.   items = doc('#mainsrp-itemlist .items .item').items()
  96.   for item in items:
  97.     #定义商品列表详细信息的字典
  98.     product = {
  99.       'title': item.find('.title').text(),
  100.       'price': item.find('.price').text(),
  101.       'image': item.find('.pic .img').attr('src'),
  102.       'shop': item.find('.shop').text(),
  103.       'deal': item.find('.deal-cnt').text()[:-3],
  104.       'location': item.find('.location').text()
  105.     }
  106.     print(product)
  107.     #将商品列表信息保存到mongoDB数据库.
  108.     save_to_mongo(product)
  109.  
  110. def save_to_mongo(result):
  111.   try:
  112.     if db[MONGO_TABLE].insert(result):
  113.       print('存储到mongodb成功',result)
  114.   except Exception:
  115.     print('存储到mongodb失败',result)
  116.  
  117. def main():
  118.   total = search()
  119.  
  120.   # 用正则表达式只匹配出数字,并打印数字.
  121.   total = int(re.compile('(\d+)').search(total).group(1))
  122.   print(total)
  123.   for i in range(2,total + 1):
  124.     next_page(i)
  125.  
  126. if __name__=='__main__':
  127.   main()
  128.   #关闭×××面浏览器.
  129.   browser.quit()
  130. #mongoconfig.py
  131. #!/usr/bin/env python
  132. # -*- coding:utf-8 -*-
  133.  
  134. MONGO_URL = 'localhost'
  135. MONGO_DB = 'taobao'
  136. MONGO_TABLE = 'meishi'

安装和使用mongodb参考:

//www.jb51.net/article/54758.htm

实现效果:

注意:

chrome浏览器和firefox浏览器的网页元素不太一样.

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号