Python使用Selenium爬取淘宝异步加载的数据方法


Posted in Python onDecember 17, 2018

淘宝的页面很复杂,如果使用分析ajax或者js的方式,很麻烦

抓取淘宝‘美食'上面的所有食品信息

spider.py

#encoding:utf8
import re

from selenium import webdriver
from selenium.common.exceptions import TimeoutException

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

from bs4 import BeautifulSoup
from config import *
import pymongo

client=pymongo.MongoClient(MONGODB_URL)
db=client[MONGODB_DB]


##这里使用PhantomJS,并配置了一些参数
browser=webdriver.PhantomJS(service_args=SERVICE_ArGS)

##窗口的大小,不设置的话,默认太小,会有问题
browser.set_window_size(1400,900)

wait=WebDriverWait(browser, 10)


def search():

  print('正在搜索')
##容易出现超时的错误
  try:
##等待这两个模块都加载好
    browser.get("https://www.taobao.com")
    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 > div.search-button > button'))
      )

    ######这块python2搞得鬼
    #input.send_keys('\u7f8e\u98df'.decode("unicode-escape"))
    input.send_keys(KEYWORD.decode("unicode-escape"))
    submit.click()

    total = wait.until(
        EC.presence_of_element_located((By.CSS_SELECTOR, '#mainsrp-pager > div > div > div > div.total'))
      )
    get_product()
    return total.text
  except TimeoutException:
    return search()

def next_page(page_number):

  print('翻页'+str(page_number))
  try:
    input = wait.until(
          EC.presence_of_element_located((By.CSS_SELECTOR, '#mainsrp-pager > div > div > div > div.form > input'))
        )
    submit=wait.until(
        EC.element_to_be_clickable((By.CSS_SELECTOR, '#mainsrp-pager > div > div > div > div.form > span.btn.J_Submit'))
      )

    input.clear()
    input.send_keys(page_number)
    submit.click()

##判断是否翻页成功 高亮的是不是输入的值,直接加在后面即可
    wait.until(EC.text_to_be_present_in_element((By.CSS_SELECTOR,'#mainsrp-pager > div > div > div > ul > li.item.active > span'),str(page_number)))

    get_product()

  except TimeoutException:
    return next_page(page_number)

#获取产品信息
def get_product():
  products = wait.until(
    EC.presence_of_element_located((By.CSS_SELECTOR, '#mainsrp-itemlist .m-itemlist .items'))
        )
##拿到网页
  html = browser.page_source
  soup = BeautifulSoup(html,'lxml')
  items = soup.select('#mainsrp-itemlist .m-itemlist .items .item.J_MouserOnverReq')#

  print('*************************到此*************')
  for item in items:
    img = item.select('.J_ItemPic.img')[0].get('src')
    price = item.select('.price.g_price.g_price-highlight > strong')[0].get_text()
    deal = item.select('.deal-cnt')[0].get_text()
    title= item.select('.row.row-2.title > a ')[0].get_text().strip() #:nth-of-type(3)
    shop = item.select('.row.row-3.g-clearfix > .shop > a > span:nth-of-type(2)')[0].get_text() 
    location = item.select('.location')[0].get_text()

    product={
      'img':img,
      'price':price,
      'deal':deal,
      'title':title,
      'shop':shop,
      'location':location
    }

#打印一下
    import json
    j = json.dumps(product)
    dict2 = j.decode("unicode-escape")
    print dict2

    save_to_mongo(product)


def save_to_mongo(product):
  try:
    if db[MONGODB_TABLE].insert(product):
      print('存储到mongodb成功'+str(product))
  except Exception:
    print("存储到mongodb失败"+str(product))



def main():

  try:
    total=search()

    ##搜寻 re正则表达式
    s=re.compile('(\d+)')
    total=int(s.search(total).group(1))
    for i in range(2,total+1):
      next_page(i)
  except Exception:
    print('出错')
  finally:
    browser.close()

if __name__ == '__main__':
  main()

config.py

MONGODB_URL='localhost'
MONGODB_DB='taobao'
MONGODB_TABLE='meishi'

SERVICE_ArGS=['--load-images=false','--disk-cache=true']

##就是美食这两个字,直接用汉字会报错
KEYWORD='\u7f8e\u98df'

以上这篇Python使用Selenium爬取淘宝异步加载的数据方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python实现命令行通讯录实例教程
Aug 18 Python
《Python学习手册》学习总结
Jan 17 Python
PyTorch CNN实战之MNIST手写数字识别示例
May 29 Python
python之文件读取一行一行的方法
Jul 12 Python
使用python的pandas库读取csv文件保存至mysql数据库
Aug 20 Python
Selenium定时刷新网页的实现代码
Oct 31 Python
Django Rest framework认证组件详细用法
Jul 25 Python
Python urlencode和unquote函数使用实例解析
Mar 31 Python
Python之Sklearn使用入门教程
Feb 19 Python
浅谈Python numpy创建空数组的问题
May 25 Python
Django分页器的用法你都了解吗
May 26 Python
Opencv实现二维直方图的计算及绘制
Jul 21 Python
在scrapy中使用phantomJS实现异步爬取的方法
Dec 17 #Python
Python 通过调用接口获取公交信息的实例
Dec 17 #Python
python用插值法绘制平滑曲线
Feb 19 #Python
selenium在执行phantomjs的API并获取执行结果的方法
Dec 17 #Python
Python脚本完成post接口测试的实例
Dec 17 #Python
python:接口间数据传递与调用方法
Dec 17 #Python
python直接获取API传递回来的参数方法
Dec 17 #Python
You might like
php 友好URL的实现(吐血推荐)
2008/10/04 PHP
使用淘宝IP库获取用户ip地理位置
2013/10/27 PHP
简短几句 通俗解释javascript的闭包
2011/01/17 Javascript
浅析jQuery中常用的元素查找方法总结
2013/07/04 Javascript
jQuery中事件对象e的事件冒泡用法示例介绍
2014/04/25 Javascript
jquery.gridrotator实现响应式图片展示画廊效果
2015/06/23 Javascript
nodejs导出excel的方法
2015/06/30 NodeJs
修改js confirm alert 提示框文字的简单实例
2016/06/10 Javascript
js 自带的 map() 方法全面了解
2016/08/16 Javascript
详解Vue.use自定义自己的全局组件
2017/06/14 Javascript
基于webpack-hot-middleware热加载相关错误的解决方法
2018/02/22 Javascript
vue 实现类似淘宝星级评分的示例
2018/03/01 Javascript
JS中判断某个字符串是否包含另一个字符串的五种方法
2018/05/03 Javascript
qrcode生成二维码微信长按无法识别问题的解决
2019/04/04 Javascript
vue axios封装及API统一管理的方法
2019/04/18 Javascript
Nuxt项目支持eslint+pritter+typescript的实现
2019/05/20 Javascript
vue中使用vee-validator完成表单校验方案
2019/11/01 Javascript
javascript+css实现俄罗斯方块小游戏
2020/06/28 Javascript
Vue过滤器,生命周期函数和vue-resource简单介绍
2021/01/12 Vue.js
python实现根据用户输入从电影网站获取影片信息的方法
2015/04/07 Python
Pycharm学习教程(5) Python快捷键相关设置
2017/05/03 Python
python3学生名片管理v2.0版
2018/11/29 Python
Python图像处理之gif动态图的解析与合成操作详解
2018/12/30 Python
python django框架中使用FastDFS分布式文件系统的安装方法
2019/06/10 Python
python使用pygame实现笑脸乒乓球弹珠球游戏
2019/11/25 Python
提升python处理速度原理及方法实例
2019/12/25 Python
详解pandas.DataFrame.plot() 画图函数
2020/06/14 Python
世界各地的当地人的食物体验:Eatwith
2019/07/26 全球购物
英国计算机商店:Technextday
2019/12/28 全球购物
JSF面试题:Jsf中导航的标签是什么
2013/04/20 面试题
小学门卫岗位职责
2013/12/17 职场文书
商场消防演习方案
2014/02/12 职场文书
平面设计求职信
2014/03/10 职场文书
基层干部个人对照检查及整改措施
2014/10/28 职场文书
先进班集体事迹材料
2014/12/25 职场文书
2015暑假社会调查报告
2015/07/13 职场文书