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 相关文章推荐
centos系统升级python 2.7.3
Jul 03 Python
Mac下Supervisor进程监控管理工具的安装与配置
Dec 16 Python
在Python中操作字典之clear()方法的使用
May 21 Python
分享Python文本生成二维码实例
Jan 06 Python
Python自动化测试ConfigParser模块读写配置文件
Aug 15 Python
Python中最大最小赋值小技巧(分享)
Dec 23 Python
Python 字符串与二进制串的相互转换示例
Jul 23 Python
使用python3调用wxpy模块监控linux日志并定时发送消息给群组或好友
Jun 05 Python
python程序运行进程、使用时间、剩余时间显示功能的实现代码
Jul 11 Python
matlab中二维插值函数interp2的使用详解
Apr 22 Python
Python模拟伯努利试验和二项分布代码实例
May 27 Python
详解Django中views数据查询使用locals()函数进行优化
Aug 24 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
星际RPG字典
2020/03/04 星际争霸
PHP中Date()时间日期函数的使用方法小结
2011/04/20 PHP
Laravel实现用户注册和登录
2015/01/23 PHP
php操作(删除,提取,增加)zip文件方法详解
2015/03/12 PHP
php实现的用户查询类实例
2015/06/18 PHP
php通过各种函数判断0和空
2020/07/04 PHP
PHP模糊查询技术实例分析【附源码下载】
2019/03/07 PHP
javascript function调用时的参数检测常用办法
2010/02/26 Javascript
JavaScript中奇葩的假值示例应用
2014/03/11 Javascript
js表头排序实现方法
2015/01/16 Javascript
jQuery插件Zclip实现完美兼容个浏览器点击复制内容到剪贴板
2015/04/30 Javascript
JS中frameset框架弹出层实例代码
2016/04/01 Javascript
JS模拟超市简易收银台小程序代码解析
2017/08/18 Javascript
JavaScript强制类型转换和隐式类型转换操作示例
2019/05/01 Javascript
你准备好迎接vue3.0了吗
2020/04/28 Javascript
[04:44]DOTA2英雄梦之声_第12期_矮人直升机
2014/06/21 DOTA
wxPython 入门教程
2008/10/07 Python
Python图像处理之简单画板实现方法示例
2018/08/30 Python
详解Python:面向对象编程
2019/04/10 Python
python 用户交互输入input的4种用法详解
2019/09/24 Python
python中什么是面向对象
2020/06/11 Python
美国在线眼镜商城:Eyeglasses.com
2017/06/26 全球购物
Linux如何修改文件和文件夹的权限
2013/09/05 面试题
模具专业推荐信
2013/10/30 职场文书
找工作最新求职信
2013/12/22 职场文书
读书心得体会
2013/12/28 职场文书
授权委托书范本
2014/04/03 职场文书
医院竞聘演讲稿
2014/05/16 职场文书
建筑横幅标语
2014/10/09 职场文书
场地使用证明模板
2014/10/25 职场文书
接收函格式
2015/01/30 职场文书
倡议书的格式写法
2015/04/28 职场文书
教师工作证明范本
2015/06/12 职场文书
《平移和旋转》教学反思
2016/02/19 职场文书
springboot利用redis、Redisson处理并发问题的操作
2021/06/18 Java/Android
GTX1660显卡搭配显示器推荐
2022/04/19 数码科技