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压缩和解压缩zip文件的教程
May 06 Python
TensorFlow车牌识别完整版代码(含车牌数据集)
Aug 05 Python
Python操作excel的方法总结(xlrd、xlwt、openpyxl)
Sep 02 Python
在 Python 中接管键盘中断信号的实现方法
Feb 04 Python
pytorch中图像的数据格式实例
Feb 11 Python
Python日期格式和字符串格式相互转换的方法
Feb 18 Python
python 5个顶级异步框架推荐
Sep 09 Python
python 如何区分return和yield
Sep 22 Python
pip 20.3 新版本发布!即将抛弃 Python 2.x(推荐)
Dec 16 Python
matplotlib绘制鼠标的十字光标的实现(自定义方式,官方实例)
Jan 10 Python
python uuid生成唯一id或str的最简单案例
Jan 13 Python
python 三种方法提取pdf中的图片
Feb 07 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
苏联队长,苏联超人蝙蝠侠,这些登场的“山寨”英雄真的很严肃
2020/04/09 欧美动漫
国内咖啡文化
2021/03/03 咖啡文化
PHP 数组教程 定义数组
2009/10/23 PHP
php+mysqli事务控制实现银行转账实例
2015/01/29 PHP
php计算多维数组中所有值总和的方法
2015/06/24 PHP
Yii2简单实现多语言配置的方法
2016/07/23 PHP
javascript学习笔记(一) 在html中使用javascript
2012/06/18 Javascript
获取客户端电脑日期时间js代码(jquery)
2012/09/12 Javascript
判断及设置浏览器全屏模式
2014/04/20 Javascript
Javascript中拼接大量字符串的方法
2015/02/05 Javascript
js实现按钮控制图片360度翻转特效的方法
2015/02/17 Javascript
提升jQuery的性能需要做好七件事
2016/01/11 Javascript
jQuery插件passwordStrength密码强度指标详解
2016/06/24 Javascript
详解ES6中的let命令
2020/04/05 Javascript
JS实现简单抖动效果
2017/06/01 Javascript
使用jQuery实现两个div中按钮互换位置的实例代码
2017/09/21 jQuery
基于Vue2.0+ElementUI实现表格翻页功能
2017/10/23 Javascript
AngularJS实现的省市二级联动功能示例【可对选项实现增删】
2017/10/26 Javascript
详解ES6中的代理模式——Proxy
2018/01/08 Javascript
vue 中动态绑定class 和 style的方法代码详解
2018/06/01 Javascript
JavaScript学习笔记之图片库案例分析
2019/01/08 Javascript
Vue实现简单购物车功能
2020/12/13 Vue.js
基于element-ui封装表单金额输入框的方法示例
2021/01/06 Javascript
[45:18]完美世界DOTA2联赛循环赛 PXG vs IO 第二场 11.06
2020/11/09 DOTA
Python企业编码生成系统总体系统设计概述
2019/07/26 Python
python笔记_将循环内容在一行输出的方法
2019/08/08 Python
使用opencv中匹配点对的坐标提取方式
2020/06/04 Python
Fossil美国官网:Fossil手表、手袋、珠宝及配件
2017/02/01 全球购物
同学会邀请书大全
2014/01/12 职场文书
作文评语大全
2014/04/23 职场文书
2014年服务员工作总结
2014/11/18 职场文书
2014年维稳工作总结
2014/11/18 职场文书
2014年行风建设工作总结
2014/12/01 职场文书
写给医生的感谢信
2015/01/22 职场文书
接收函格式
2015/01/30 职场文书
如何在C++中调用Python
2021/05/21 Python