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 list中append()与extend()用法分享
Mar 24 Python
总结Python编程中函数的使用要点
Mar 20 Python
python编程实现归并排序
Apr 14 Python
Python实现图片转字符画的示例代码
Aug 21 Python
不同版本中Python matplotlib.pyplot.draw()界面绘制异常问题的解决
Sep 24 Python
python opencv 图像尺寸变换方法
Apr 02 Python
Numpy之文件存取的示例代码
Aug 03 Python
Django使用AJAX调用自己写的API接口的方法
Mar 06 Python
Python3.5局部变量与全局变量作用域实例分析
Apr 30 Python
在pytorch中对非叶节点的变量计算梯度实例
Jan 10 Python
Python headers请求头如何实现快速添加
Nov 03 Python
python数据可视化JupyterLab实用扩展程序Mito
Nov 20 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控制用户的浏览器--ob*函数的使用说明
2007/03/16 PHP
php创建桌面快捷方式实现方法
2015/12/31 PHP
CI框架扩展系统核心类的方法分析
2016/05/23 PHP
PHP session会话操作技巧小结
2016/09/27 PHP
phpstudy2018升级MySQL5.5为5.7教程(图文)
2018/10/24 PHP
PHP常见加密函数用法示例【crypt与md5】
2019/01/27 PHP
tp5框架内使用tp3.2分页的方法分析
2019/05/05 PHP
简单的无缝滚动程序-仅几行代码
2007/05/08 Javascript
jQuery 中关于CSS操作部分使用说明
2007/06/10 Javascript
浅析document.ready和window.onload的区别讲解
2013/12/18 Javascript
jQuery 1.9使用$.support替代$.browser的使用方法
2014/05/27 Javascript
javascript日期验证之输入日期大于等于当前日期
2015/12/13 Javascript
关于javascript中限定时间内防止按钮重复点击的思路详解
2016/08/16 Javascript
vue实现app页面切换动画效果实例
2017/05/23 Javascript
layui实现动态和静态分页
2018/04/28 Javascript
js实现动态添加上传文件页面
2018/10/22 Javascript
JavaScript创建、读取和删除cookie
2019/09/03 Javascript
VSCode插件安装完成后的配置(常用配置)
2020/08/24 Javascript
vue内置组件keep-alive事件动态缓存实例
2020/10/30 Javascript
[01:09:24]Ti4开幕式
2014/07/19 DOTA
python中的__slots__使用示例
2015/02/26 Python
python实现word 2007文档转换为pdf文件
2018/03/15 Python
Python使用OpenCV进行标定
2018/05/08 Python
python中使用iterrows()对dataframe进行遍历的实例
2018/06/09 Python
Django框架实现的简单分页功能示例
2018/12/04 Python
python打印直角三角形与等腰三角形实例代码
2019/10/20 Python
使用python绘制cdf的多种实现方法
2020/02/25 Python
css3的focus-within选择器的使用
2020/05/11 HTML / CSS
泰国网上购物:Shopee泰国
2018/09/14 全球购物
房地产促销活动方案
2014/03/01 职场文书
科技节口号
2014/06/19 职场文书
我心目中的好老师活动方案
2014/08/19 职场文书
感恩主题班会教案
2015/08/12 职场文书
环保主题班会教案
2015/08/13 职场文书
Nginx+SpringBoot实现负载均衡的示例
2021/03/31 Servers
mybatis 解决从列名到属性名的自动映射失败问题
2021/06/30 Java/Android