豆瓣原创电子书每周推出数十本限时免费数目,一周免费期过后恢复原价。想着豆瓣原创书中有不少值得一看,便写了个脚本,免去一个个添加的烦恼。

使用了Windows下selenium+Python的组合,有较多的文档可以查阅,主要总结如下:

1、使用chrome浏览器:下载旧版本(52),新版本不兼容,下载chromedriver,放入chrome安装目录,于chrome.exe同目录,并添加到Path环境变量。

2、强大的元素定位:通过浏览器审查元素直接复制的xpath多为绝对定位,容易受网页结构调整的影响,稳定性不好。

  相对定位在确保唯一性的前提下,可以自己写,快准稳。一般通过@id段确保唯一,注意同类型list集的影响。

  xpath中by_link_text可以通过链接文字直接定位<a>元素,在用到特殊链接时很有效。

  by_xpath("//*[text()='限时特价']")  这个简直简单粗暴,直接定位文字内容。有点JS里innerHTML的意思。

3、标签页的切换:用handles = driver.window_handles 获取当前的标签页,再通过driver.switch_to.window(handles[1]) 切换。

4、元素过期:翻页和刷新页面后再获取元素,频频报错。一方面,刷新页面后必须进行新的元素获取,并操作新获取的元素,尽量把获取写在循环体内。

  另一方面,页面刷新时,网页的代码执行速度比网页渲染速度快,下面代码采取time.sleep(2)简单粗暴,强制延迟等待网页渲染完毕,再进行元素获取,否则报错元素不存在,或元素过期。

import selenium
import time
from selenium import webdriver
from selenium.webdriver.common.keys import Keys driver=webdriver.Chrome()
#打开豆瓣主站
driver.get('https://www.douban.com/')
#最大化
driver.maximize_window()
#输入用户名,密码
driver.find_element_by_id('form_email').send_keys('********')
driver.find_element_by_id('form_password').send_keys('******')
#点击登录
time.sleep(1)
driver.find_element_by_xpath('//*[@id="lzform"]/fieldset/div[3]/input').click()
time.sleep(3)
#打开阅读
driver.find_element_by_xpath('//*[@id="db-global-nav"]/div/div[4]/ul/li[7]/a').click()
time.sleep(2)
#切换到新打开的窗口
handles = driver.window_handles
driver.switch_to.window(handles[1])
time.sleep(2)
#打开免费
driver.find_element_by_link_text('免费').click()
time.sleep(2) #需要爬的页数
page=3
#已购买数量
book_is_read=0
#未购买数量
book_not_read=0 #外循环循环翻页
for j in range(0,page+1):
#本页循环数量
page_end=0
thisbooklist=0
time.sleep(2)
#内循环循环本页20条
for i in range(0,20):
time.sleep(2)
#只爬每周限时可选
driver.find_element_by_xpath("//*[text()='限时特价']").click()
time.sleep(2)
#获取本页书籍列表
booklists=driver.find_elements_by_xpath("//li[@class='item store-item']")
page_end=0 for booklist in booklists:
#获取阅读标志
isread=booklist.find_element_by_xpath(".//div[@class='action-buttons']/a").get_attribute("class")
#检查是否已经购买
if 'read' in isread:
page_end=page_end+1
continue
thisbooklist=booklist
break
#循环至列表最后一项跳出循环
if page_end>19:break
#进入书籍详情
thisbooklist.find_element_by_xpath('.//div[1]/a/img').click()
time.sleep(1)
#点击购买
driver.find_element_by_xpath("//span[@class='icon-add-to-bookshelf']").click()
#点击确定
time.sleep(2)
driver.find_element_by_xpath("//*[@id='ark-dialog']/div[2]/div[2]/button[1]").click()
time.sleep(3)
#返回上一页
driver.back()
time.sleep(2)
#刷新
driver.refresh()
# 打开下一页
time.sleep(2)
#翻页
driver.find_element_by_xpath('/html/body/div/div/article/div[2]/div[2]/div/ul/li[10]/a').click() time.sleep(2)
driver.close()

python selenium 练习 自动获取豆瓣阅读当前特价书籍 chrome 元素定位 窗口切换 元素过期的更多相关文章

  1. python编写的自动获取代理IP列表的爬虫-chinaboywg-ChinaUnix博客

    python编写的自动获取代理IP列表的爬虫-chinaboywg-ChinaUnix博客 undefined Python多线程抓取代理服务器 | Linux运维笔记 undefined java如 ...

  2. 开源you-get项目爬虫,以及基于python+selenium的自动测试利器

    写在前面 爬虫和自动测试,对于python来说是最合适不过也是最擅长的. 开源的项目也很多,例如you-get项目https://github.com/soimort/you-get.盗链和爬虫神器. ...

  3. python - web自动化测试 - 元素操作 - 窗口切换

    # -*- coding:utf-8 -*- ''' @project: web学习 @author: Jimmy @file: 元素操作-切换.py @ide: PyCharm Community ...

  4. Python+Selenium学习--自动生成HTML测试报告

    前言 在脚本运行完成之后,除了在log.txt 文件看到运行日志外,我们更希望能生一张漂亮的测试报告来展示用例执行的结果.        HTMLTestRunner 是Python 标准库的unit ...

  5. 用python+selenium从百度获取本地明日的天气信息并根据温度情况设置提醒

    从百度天气获取当地明天的天气情况,如果明天下雨,请发送邮件通知全体同事带伞, 如果明天气温低于10度,请邮件提醒同事注意保暖,如果气温高于30度则提醒同事注意高温. 假设存在发送邮件的方法self.s ...

  6. Python selenium 文件自动下载 (自动下载器)

    MyGithub:https://github.com/williamzxl 最新代码已经上传到Github,以下版本为stupid版本. 由于在下载过程中需要下载不同文件,所以可以把所有类型放在Va ...

  7. python+selenium实现自动抢票

    使用说明 程序运行开始,需要输入出发地,目的地,出发时间,乘客信息,车次:乘客信息和车次可以输入多个 刚刚开始学习爬虫,selenium仅仅是解放了双手,运行效率不是很高: 程序运行时会打开chrom ...

  8. Python + Selenium 练习篇 - 获取页面所有邮箱

    代码如下: # coding=utf-8import re    #python中利用正则,需要导入re模块from selenium import webdriverdriver = webdriv ...

  9. Python+selenium整合自动发邮件功能

    主要实现的目的是:自动将测试报告以邮件的形式通知相关人员 from HTMLTestRunner import HTMLTestRunner import HTMLTestReport from em ...

随机推荐

  1. 进程—内存描述符(mm_struct)

    http://blog.csdn.net/qq_26768741/article/details/54375524 前言 上一篇我们谈论了task_struct这个结构体,它被叫做进程描述符,内部成员 ...

  2. 计算1到n的n次方之和

    实现效果: 知识运用: Math类的Pow方法:返回指定数字的指定次幂 public static double Pow(double x,double y) 实现代码: public string ...

  3. EF问题集合

    1. 在使用数据迁移的过程中,如果手工删除了本地数据库之后,再次尝试连接被删除的数据库,会有以下提示: System.Data.SqlClient.SqlException (0x80131904): ...

  4. mysql常用命令添加外键主键约束存储过程索引

    数据库连接 mysql -u root -p123456 查看表 show databases 创建数据库设置编码 create table books character set utf8; 创建用 ...

  5. SQL按时间段统计(5分钟统计一次访问量为例,oracle统计)

    需求:统计当天的访问量,每五分钟采集一次 表结构中有日期字段,类型TIMESTAMP 如果,统计是采用每秒/分钟/小时/天/周/月/年,都非常容易实现,只要to_char日期字段然后group by分 ...

  6. AngularJS 表达式中添加过滤器实例

    过滤器可以通过一个管道字符(|)和一个过滤器添加到表达式中 历练实例: <!DOCTYPE html><html><head><meta http-equiv ...

  7. C#接口定义

    C#接口定义 C#不支持多重继承,但是客观世界出现多重继承的情况又比较多.为了避免传统的多重继承给程序带来的复杂性等问题,C# 提出了接口的概念.通过接口可以实现多重继承的功能.  继承该接口的类或结 ...

  8. 4.Spring Cloud初相识--------Feign负载均衡

    前言: 在上一节里,我们学习了ribbon的使用. 我们了解到ribbon是一个客户端负载均衡机制. 而我们今天要讲的Feign呢,也是一款客户端负载均衡机制. 或者这样说,Feign封装了ribbo ...

  9. 【杂题总汇】NOIP2013(洛谷P1967) 货车运输

    [洛谷P1967] 货车运输 重做NOIP提高组ing... +传送门-洛谷P1967+ ◇ 题目(copy from 洛谷) 题目描述 A国有n座城市,编号从1到n,城市之间有m条双向道路.每一条道 ...

  10. IDEA怎么生成UML类图

    说之前先说一下Diagram这个单词,意思是图表; 示意图; 图解; [数] 线图的意思. 打开设置 File->Setting或windows下按Ctrl+Alt+S 在搜索框中输入Diagr ...