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多线程同步Lock、RLock、Semaphore、Event实例
Nov 21 Python
Python读写ini文件的方法
May 28 Python
Linux CentOS7下安装python3 的方法
Jan 21 Python
Python+selenium 获取一组元素属性值的实例
Jun 22 Python
python 如何将数据写入本地txt文本文件的实现方法
Sep 11 Python
Python读取实时数据流示例
Dec 02 Python
pytorch 图像预处理之减去均值,除以方差的实例
Jan 02 Python
python 命名规范知识点汇总
Feb 14 Python
Selenium向iframe富文本框输入内容过程图解
Apr 10 Python
python如何写try语句
Jul 14 Python
如何使用python自带IDLE的几种方法
Oct 10 Python
Python Pandas pandas.read_sql_query函数实例用法分析
Jun 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表单提交表单名称含有点号(.)则会被转化为下划线(_)
2011/12/14 PHP
PHP实现简单爬虫的方法
2015/07/29 PHP
关于PHP 如何用 curl 读取 HTTP chunked 数据
2016/02/26 PHP
Javascript实现的分页函数
2006/12/22 Javascript
js下判断 iframe 是否加载完成的完美方法
2010/10/26 Javascript
JavaScript ( (__ = !$ + $)[+$] + ({} + $)[_/_] +({} + $)[_/_] )
2011/02/25 Javascript
基于jQuery的简单的列表导航菜单
2011/03/02 Javascript
js 自制滚动条的小例子
2013/03/16 Javascript
通过url查找a元素应用案例
2014/04/29 Javascript
js实现同一个页面多个渐变效果的方法
2015/04/10 Javascript
js实现仿MSN带关闭功能的右下角弹窗代码
2015/09/04 Javascript
javascript html5实现表单验证
2016/03/01 Javascript
javascript单页面手势滑屏切换原理详解
2016/03/21 Javascript
js剪切板应用clipboardData实例解析
2016/05/29 Javascript
JavaScript获取IP获取的是IPV6 如何校验
2016/06/12 Javascript
基于JavaScript实现树形下拉框
2016/08/10 Javascript
bootstrap侧边栏圆点导航
2017/01/11 Javascript
jQuery实现select下拉框获取当前选中文本、值、索引
2017/05/08 jQuery
简单谈谈CommonsChunkPlugin抽取公共模块
2017/12/31 Javascript
vue created钩子函数与mounted钩子函数的用法区别
2020/11/05 Javascript
three.js如何实现3D动态文字效果
2021/03/03 Javascript
python实现简单的计时器功能函数
2015/03/14 Python
Python selenium文件上传下载功能代码实例
2020/04/13 Python
浅析python函数式编程
2020/09/26 Python
Python项目打包成二进制的方法
2020/12/30 Python
时尚的CSS3进度条效果
2012/02/22 HTML / CSS
详解HTML5中表单验证的8种方法介绍
2016/12/19 HTML / CSS
英国最大的在线运动补充剂商店:Discount Supplements
2017/06/03 全球购物
Feelunique中文官网:欧洲最大化妆品零售电商
2020/07/10 全球购物
什么是java序列化,如何实现java序列化
2012/11/14 面试题
如何在Shell脚本中使用函数
2015/09/06 面试题
大学校运会广播稿
2014/02/03 职场文书
个性与发展自我评价
2015/03/06 职场文书
千与千寻观后感
2015/06/04 职场文书
傲慢与偏见读书笔记
2015/06/29 职场文书
Django实现在线无水印抖音视频下载(附源码及地址)
2021/05/06 Python