网址: 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