前言
文字、图片、视频这类常规的内容下载、API 的使用,这些操作对你来说,应该轻而易举了。
那今天,就讲解一下高级一点的技能,「模拟登录」。
值此 618 之际,帮他/她清空一波购物车!
2
模拟登录
学爬虫,总能听到「模拟登录」这四个字,究竟什么是「模拟登录」?
通俗一点讲,「模拟登录」就是程序用账号和密码自动登录一个网站。
然后,拿到只有登录后,才能下载的网站数据。
比如,我们只有登录淘宝账号之后,才能看到购物车里有哪些东西。
本文,就以「模拟登录」淘宝为例进行讲解,并帮他/她清空购物车。
你只需要知道他/她的淘宝账号和密码,并且有个充足的钱包,就可以运行程序,扫码支付一气呵成。
体验自动结算,钱包秒空的快感!
3
Selenium
模拟登录无非两种方法:请求包分析模拟登录、自动化测试工具模拟登录。
前者,需要抓包分析请求,解析各种参数,还可能涉及一些加密算法。
后者,可以绕过一些繁琐的分析过程,直接定位元素进行操作,但也会遇到一些反爬策略。
两者,都有各自的操作技巧。
之前的教程,讲解了很多基于 requests 请求包分析的爬虫思路。
本文讲解一个新思路,使用自动化测试工具 Selenium 模拟登录。
Selenium 基本的使用方法,以及如何破解淘宝对于 Selenium 的反爬策略,尽在下文。
Selenium 安装
Selenium 是一个自动化测试工具,支持各种主流浏览器,例如 Chrome、Safari、Firefox 等。
不知道什么是自动化测试工具没关系,我会通过实战操作,慢慢讲解。
不管怎样,先安装 Selenium 再说。
pip install selenium
使用 pip 直接安装 selenium。
除了安装 Python 的 Selenium 第三方库,还需要根据浏览器配置相应的浏览器驱动。
以 Chrome 为例,下载浏览器驱动。
驱动下载地址(需翻墙):
https://sites.google.com/a/chromium.org/chromedriver/downloads
需要根据浏览器的版本,选择驱动下载。
无法翻墙下载没关系,我已经将这三个版本的驱动下载并上传到百度云了。
百度云链接(提取码:cbsu):
https://pan.baidu.com/s/1-AfONQGkK8xPwLaW5P-9Bw
小试牛刀
使用 Selenium 登录百度看一下。
from selenium import webdriverif __name__ == "__main__": browser = webdriver.Chrome('path\to\your\chromedriver.exe') browser.get('https://www.baidu.com/')
上面的 path\to\your\chromedriver.exe 是刚刚下载的 Chrome 驱动文件位置,根据自己的情况修改,建议使用绝对路径。结果如下图所示:
程序会自动打开 Chrome 浏览器,并打开 www.baidu.com。
再来个复杂一些的例子。
from selenium import webdriverfrom selenium.webdriver.common.keys import Keysif __name__ == "__main__": driver = webdriver.Chrome("path\to\your\chromedriver.exe") driver.get("https://www.python.org") assert "Python" in driver.title elem = driver.find_element_by_name("q") elem.send_keys("pycon") elem.send_keys(Keys.RETURN) print(driver.page_source)
打开 www.python.org 官网,并根据 name 属性为 q 找到搜索框,并输入 pycon 并点击搜索。
运行结果:
写好程序,浏览器自动操作,是不是很简单,很酷炫?
这就是自动化测试工具,程序写好,浏览器自动执行你的写的操作。
find_element_by_* 是一种定位网页元素的方法,有很多方式:
find_element_by_idfind_element_by_namefind_element_by_xpathfind_element_by_link_textfind_element_by_partial_link_textfind_element_by_tag_namefind_element_by_class_namefind_element_by_css_selector
可以通过,标签的 id 属性、name 属性、class_name 属性查找元素,也可以通过 xpath 等。
这里面,其实用到最多的就是 xpath,因为好用。
不用动脑思考怎么写xpath,就能操作,方便好用。举个例子,比如我想找到 baidu.com 的搜索框的元素: