最帅爬虫_豆瓣读书(加密数据获取)

网址: http://book.douban.com/subject_search?search_text=python&cat=1001&start=%s0

需求: 获取所有 python 书籍的信息

首页

在这里插入图片描述

进入页面按f12,查询页面信息
在这里插入图片描述

在页面当中未查取到数据,因此需要创建selenium.webdriver对象,去解析页面的源代码。

最后通过xpath语法去筛选标签获取所需要的数据。

代码实现:

from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait   # 等待对象
from selenium.webdriver.support import expected_conditions as EC   # 条件
from selenium.webdriver.common.by import By # 定义定位器的常量
from lxml import etree
import time


def get_content_by_selenium(url):
    '''
    通过selenium获取页面内容
    '''

    # 2、请求
    driver.get(url)

    # 3、等待:让程序在这里停一会,关注:停到啥时候

    # 意义:就是为了让浏览器能够请求结束,(不在转圈圈),同时让page_sourse里面包含需求数据。
    # 有三种等待方式:效率是步一样的。

    # 第一种等待方式:强制等待
    # time.sleep(4)#缺点:操作简单,但是效率很低。

    # 第二种等待方式:隐式等待。
    # driver.implicitly_wait(20)#20:表示最大等待时长,20秒还没有等到圈圈转完,就报 一个超时异常。
    # 等待到页面不在转圈圈为止。
    # 隐式等待有缺点:隐式等待其实就是等到将html页面所有数据全部加载执行完毕显示的时候。
    # 但是有时候,页面中的广告,图片这些很消耗时间,我们其实只想要包含数据的那个div里面内容。

    # 第三种:显式等待:等待到【特定一些页面元素】满足【某些条件】位置。

    #(1)创建显示等待对象
    # driver:表示显示等待对象监听到那个浏览器上
    # 20:最大等待时长

    # (2)等待
    # presence_of_element_located(定位器):等待定位器定位的元素出现内容
    # presence_of_all_elements_located()    #等待定位器定位的元素全部出现内容

    # 定位器:是一个元组(使用的定位语法,'对应语法的筛选路径')
    res = wait.until(EC.presence_of_all_elements_located((By.XPATH,'//*[@id="root"]/div/div[2]/div[1]/div[1]/div')))
    print(res)    # webelement对象

    # 4、获取页面源代码
    html_str = driver.page_source
    #print(html_str)
    return html_str

def parse_page(html_str):
    '''
    将页面内容变成element对象使用xpath提取
    '''
    tree = etree.HTML(html_str)
    # 提取
    # 获取所有包含书的div
    div_list = tree.xpath('//*[@id="root"]/div/div[2]/div[1]/div[1]/div[position()>1]')
    for div in div_list:

        try:
            # 书名
            book_title = div.xpath('.//div[@class="title"]/a/text()')[0]
            # 详情页url
            book_url = div.xpath('.//div[@class="title"]/a/@href')[0]
            # 评分
            book_score = div.xpath('.//span[@class="rating_nums"]/text()')[0]
            # 评论数
            book_comment_num = div.xpath('.//span[@class="pl"]/text()')[0]
            infos = div.xpath('.//div[@class="meta abstract"]/text()')[0]
            infos = infos.split(r'/')
            # print(infos)
            book_author = infos[0]
            book_price = infos[-1]
            book_public = infos[-3]
            book_date = infos[-2]
            item = {}
            item['book_title'] = book_title
            item['book_url'] = book_url
            item['book_score'] = book_score
            item['book_comment_num'] = book_comment_num
            item['book_author'] = book_author
            item['book_price'] = book_price
            item['book_public'] = book_public
            item['book_date'] = book_date

            # print(item)
        except Exception:
            pass

def main():
    # 1、确定url
    base_url = 'https://book.douban.com/subject_search?search_text=python&cat=1001&start=%s'
    # 2、分页
    for i in range(10):
        html_str = get_content_by_selenium(base_url %(i*15))
        # 3、解析:将页面内容变成element对象使用xpath提取
        parse_page(html_str)


if __name__ == '__main__':
    # 优化的思想:打开一个浏览器之后,在浏览器中请求即可。
    # 将创建驱动和显示等待对象都应该定义全局变量中即可。
    # 1、创建driver对象
    driver = webdriver.Chrome()
    wait = WebDriverWait(driver, 20)
    start = time.time()
    main()
    print('程序运行时间:',time.time()-start)#程序运行时间: 56.93825650215149
    # #20.5081729888916
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值