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中使用Tkinter模块创建GUI程序实例
Jan 14 Python
使用Python的Treq on Twisted来进行HTTP压力测试
Apr 16 Python
举例简单讲解Python中的数据存储模块shelve的用法
Mar 03 Python
python魔法方法-属性转换和类的表示详解
Jul 22 Python
Python中格式化format()方法详解
Apr 01 Python
python3中函数参数的四种简单用法
Jul 09 Python
全面了解django的缓存机制及使用方法
Jul 22 Python
基于python的selenium两种文件上传操作实现详解
Sep 19 Python
python随机数分布random均匀分布实例
Nov 27 Python
SpringBoot实现登录注册常见问题解决方案
Mar 04 Python
Python爬虫新手入门之初学lxml库
Dec 20 Python
matplotlib 画动态图以及plt.ion()和plt.ioff()的使用详解
Jan 05 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获取表单中多个同名input元素的值
2014/03/20 PHP
Extjs学习笔记之二 初识Extjs之Form
2010/01/07 Javascript
Jquery Ajax学习实例5 向WebService发出请求,返回泛型集合数据的异步调用
2010/03/17 Javascript
浅谈Javascript面向对象编程
2011/11/15 Javascript
同一页面多个商品倒计时JS 基于面向对象的javascript
2012/02/16 Javascript
JS图片根据鼠标滚动延时加载的实例代码
2013/07/13 Javascript
javascript巧用eval函数组装表单输入项为json对象的方法
2015/11/25 Javascript
JS/jQuery判断DOM节点是否存在的简单方法
2016/11/24 Javascript
jQuery实现文档树效果
2017/02/20 Javascript
微信小程序本地缓存数据增删改查实例详解
2017/05/24 Javascript
Node.js 8 中的重要新特性
2017/06/28 Javascript
Angular2开发环境搭建教程之VS Code
2017/12/15 Javascript
js技巧之十几行的代码实现vue.watch代码
2018/06/09 Javascript
vue里input根据value改变背景色的实例
2018/09/29 Javascript
mpvue全局引入sass文件的方法步骤
2019/03/06 Javascript
react国际化化插件react-i18n-auto使用详解
2020/03/31 Javascript
javascript解析json格式的数据方法详解
2020/08/07 Javascript
Python新手实现2048小游戏
2015/03/31 Python
在Apache服务器上同时运行多个Django程序的方法
2015/07/22 Python
python图片验证码生成代码
2016/07/02 Python
Python 处理数据的实例详解
2017/08/10 Python
python pandas读取csv后,获取列标签的方法
2018/11/12 Python
python 获取url中的参数列表实例
2018/12/18 Python
python3-flask-3将信息写入日志的实操方法
2019/11/12 Python
tensorflow 实现打印pb模型的所有节点
2020/01/23 Python
python字符串常用方法及文件简单读写的操作方法
2020/03/04 Python
python的help函数如何使用
2020/06/11 Python
HTML5之SVG 2D入门1—SVG(可缩放矢量图形)概述
2013/01/30 HTML / CSS
用html5绘制折线图的实例代码
2016/03/25 HTML / CSS
迪士尼英国官方商店:shopDisney UK
2019/09/21 全球购物
俄罗斯香水和化妆品在线商店:Aroma-butik
2020/02/28 全球购物
Vuori官网:运动服装的终级表现
2021/01/27 全球购物
大学生毕业求职找工作的自我评价
2013/09/29 职场文书
交通志愿者活动总结
2014/06/27 职场文书
英语读书笔记
2015/07/02 职场文书
Python爬虫之爬取某文库文档数据
2021/04/21 Python