selenium和pyquery抓取异步加载数据

from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from pyquery import PyQuery as pq
import time

#打开不同的浏览器实例
def openBrower(brower_type):
    if brower_type == ‘chrome‘:
        return webdriver.Chrome("C:/Users/net/PycharmProjects/untitled/venv/Scripts/chromedriver.exe")
    elif brower_type == ‘firefox‘:
        return webdriver.Firefox()
    elif brower_type == ‘safari‘:
        return webdriver.Safari()
    elif brower_type == ‘PhantomJS‘:
        return webdriver.PhantomJS()
    else :
        return webdriver.Ie()

def parse_website():
    # 通过Chrome()方法打开chrome浏览器
    browser = openBrower(‘chrome‘)
    # 访问京东网站
    browser.get("https://www.jd.com")
    # 等待50秒
    wait = WebDriverWait(browser, 50)
    # 通过css选择器的id属性获得输入框。until方法表示浏览器完全加载到对应的节点,才返回相应的对象。presence_of_all_elements_located是通过css选择器加载节点
    input = wait.until(
        EC.presence_of_all_elements_located((By.CSS_SELECTOR, ‘#key‘))
    )

    # input = browser.find_element_by_id(‘key‘)
    # 在输入框中写入要查询的信息
    input[0].send_keys(‘计算机书籍‘)
    # 查询按钮完全加载完毕,返回查询按钮对象
    submit_button = wait.until(
        EC.element_to_be_clickable((By.CSS_SELECTOR, ‘.button‘))
    )
    # 点击查询按钮
    submit_button.click()

    # 模拟下滑到底部操作
    for i in range(0,3):
        browser.execute_script("window.scrollTo(0, document.body.scrollHeight);")
        time.sleep(3)

    # 商品列表的总页数
    total = wait.until(
        EC.presence_of_all_elements_located(
            (By.CSS_SELECTOR, ‘#J_bottomPage > span.p-skip > em:nth-child(1) > b‘)
        )
    )
    html = browser.page_source.replace(‘xmlns‘, ‘another_attr‘)

    parse_book(1,html)

    for page_num in range(2,int(total[0].text) + 1):
        print(‘当前第‘ + str(page_num) + ‘页‘)
        parse_next_page(page_num,browser,wait)

##解析下一页
def parse_next_page(page_num,browser,wait):

    next_page_button = wait.until(
        EC.element_to_be_clickable((By.CSS_SELECTOR, ‘#J_bottomPage > span.p-num > a.pn-next > em‘))
    )
    next_page_button.click()

    #滑动到页面底部,用于加载数据
    for i in range(0,3):
        browser.execute_script("window.scrollTo(0, document.body.scrollHeight);")
        time.sleep(10)

    #一页显示60个商品,"#J_goodsList > ul > li:nth-child(60)确保60个商品都正常加载出来。
    wait.until(
        EC.presence_of_all_elements_located((By.CSS_SELECTOR, "#J_goodsList > ul > li:nth-child(60)"))
    )
    # 判断翻页成功,当底部的分页界面上显示第几页时,就显示翻页成功。
    wait.until(
        EC.text_to_be_present_in_element((By.CSS_SELECTOR, "#J_bottomPage > span.p-num > a.curr"), str(page_num))
    )

    html = browser.page_source.replace(‘xmlns‘, ‘another_attr‘)
    parse_book(page_num, html)

def parse_book(page,html):
    doc = pq(html)
    li_list = doc(‘.gl-item‘).items()
    print(‘-------------------第‘ + str(page) + ‘页的图书信息---------------------‘)
    for item in li_list:
        image_html = item(‘.gl-i-wrap .p-img‘)
        book_img_url = item.find(‘img‘).attr(‘data-lazy-img‘)
        if book_img_url == "done":
            book_img_url = item.find(‘img‘).attr(‘src‘)
        print(‘图片地址:‘ + book_img_url)
        item(‘.p-name‘).find(‘font‘).remove()
        book_name = item(‘.p-name‘).find(‘em‘).text()
        print(‘书名:‘ + book_name)
        price = item(‘.p-price‘).find(‘em‘).text() + str(item(‘.p-price‘).find(‘i‘).text())
        print(‘价格:‘ + price)
        commit = item(‘.p-commit‘).find(‘strong‘).text()
        print(‘评价数量:‘ + commit)
        shopnum = item(‘.p-shopnum‘).find(‘a‘).text()
        print(‘出版社:‘ + shopnum)
        print(‘++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++‘)

def main():
    parse_website()
if __name__ == "__main__":
    main()

原文地址:https://www.cnblogs.com/dongml/p/10115381.html

时间: 2024-08-07 03:46:32

selenium和pyquery抓取异步加载数据的相关文章

iScroll.js 向上滑动异步加载数据回弹问题

iScroll是一款用于移动设备web开发的一款插件.像缩放.下拉刷新.滑动切换等移动应用上常见的一些效果都可以轻松实现. 现在最新版本是5.X,官网这里:http://iscrolljs.com/ 下面是按照官网给的Demo,写的一个异步加载数据实例: 1 <title>iScroll demo: click</title> 2 <script src="~/Scripts/iscroll5/jquery-1.10.2.js"></scrip

SpringMVC+Jquery -页面异步加载数据

背景: 做项目时涉及到页面,当我打算在controller中传一个list到页面,然后通过<c:foreach>循环遍历出来时,同事说:你这样每次都要刷新,这都是几百年前使用的技术了.你用post实现异步加载数据.然后就...... ResultUtil.java 工具类: package com.sgcc.uds.fs.config.web.util; import java.util.HashMap; import java.util.Map; import net.sf.json.JSO

jQuery异步加载数据添加事件

几个月前在一个项目中涉及到树形栏,然后看了很多插件,觉得有点麻烦,于是自己写了一个,写着写着就出问题了.当时项目是通过树形栏进行权限控制的,管理员可以对从数据库去的数据动态生成树形栏进行增删改查操作,可是用$(".XX").click();方法是不行的.1.之前用的是jq1.4.3 ,jq1.7一下都可以使用live()方法,来实现该功能 $('#div').live('click',function(){ //do stuff }); 但是live方法也有不支持的事件,例如:togg

Android利用Volley异步加载数据完整详细示例(二)

MainActivity如下: package cc.y; import android.app.Activity; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Bitmap.Config; import android.os.Bundle; import android.util.LruCache; import android.widget.ImageView;

Android利用Volley异步加载数据完整详细示例(一)

MainActivity如下: package cc.cn; import java.util.HashMap; import org.json.JSONObject; import android.app.Activity; import android.content.Context; import android.os.Bundle; import com.android.volley.AuthFailureError; import com.android.volley.RequestQ

淘宝购物车页面 智能搜索框Ajax异步加载数据

如果有朋友对本篇文章的一些知识点不了解的话,可以先阅读此篇文章.在这篇文章中,我大概介绍了一下构建淘宝购物车页面需要的基础知识. 这篇文章主要探讨的是智能搜索框Ajax异步加载数据.jQuery的社区非常的活跃,许多朋友都在不同地方分享了很多优秀的插件.我在相关的网站上找过想实现类似功能的插件,但是没有找到.于是乎,自己动手丰衣足食.自己来搭建智能搜索框下拉列表.当然,如果有类似功能并且常维护Bug的插件,望留言交流. 源码地址: 淘宝购物车页面--PC端和移动端项目实战 首先需要先给大家打一根

Android-搭建简单服务端+ListView异步加载数据

Android-搭建简单服务端+ListView异步加载数据 2014年5月6日 本篇博文带给大家的是教大家如何在MyEclipse中搭建一个服务端,并通过手机端与其通信,异步加载数据. 笔者使用的是MyEclipse,各位也可以直接用Eclipse创建Java Web项目,谷歌提供的ADT Bundle是不能创建Web项目,读者可以下载Eclipse For JaveEE Developer这个IDE. 下面来介绍如何在MyEclipse创建一个Web项目,并部署到Tomcat当中,关于Tom

Loader异步加载数据

在android3.0开始,新增了Loader.  Loader加载数据的方式是异步的.Loader的特点: 1.适合于activity和fragment 2.提供了异步加载数据机制 3.监控数据源,当数据源发生改变时,会传递新结果 4.自动重连到最后一个数据加载器游标,不需要重新查询数据 使用情况:对数据源监控,比如contentProvider.     CursorLoader是AsyncTaskLoader的子类,AsyncTaskLoader会提供AsynTask去操作.故不会阻塞UI

iOS中异步加载数据效率更高

在开发中有得时候虽然也能从服务器返回来数据,但是我们要根据实际情况,加快数据的显示,所以我们使用异步加载数据. 下面我们看一下如何异步加载数据 dispatch_async(dispatch_get_global_queue(0, 0), ^{ //下载数据(这里写的是使用AFNetWorking请求的数据) dispatch_async(dispatch_get_main_queue(), ^{ //更新视图(这里写的是,要把数据显示出来) }); });