selenium+ChromeDriver实现爬虫
参考:https://blog.csdn.net/u010986776/article/details/79266448
selenium所做的事情,恰恰是驱动真正的浏览器去执行请求和操作
无头浏览器:
- PhantomJS
- ChromeDriver
Selenium和ChromeDriver的安装与配置
- Selenium库的安装:pip install selenium (Anaconda Prompt)
- ChromeDriver的安装与配置
- 查看自己chrome浏览器的版本。浏览器地址栏输入地址: chrome://version
- 通过自己的版本下载相应的chromedriver.exe:下载地址:http://npm.taobao.org/mirrors/chromedriver/
- 将下载下来的chromedriver.exe放在chrome安装目录下以及python安装目录下
- 配置环境变量:右键点击我的电脑–>属性–>高级系统设置–>环境变量–>在path路径下添加上文中浏览器文件所在的根目录。
- 查看是否安装成功:命令行输入 chromedriver -version
- 查看自己chrome浏览器的版本。浏览器地址栏输入地址: chrome://version
# 导入selenium的浏览器驱动接口
from selenium import webdriver
# 要想调用键盘按键操作需要引入keys包
from selenium.webdriver.common.keys import Keys
# 导入chrome选项
from selenium.webdriver.chrome.options import Options
第一个程序:抓取页面内容,生成页面快照
# 创建chrome浏览器驱动,无头模式
chrome_options = Options()
chrome_options.add_argument('--headless')
driver = webdriver.Chrome(options=chrome_options)
# 加载百度页面
driver.get("http://www.baidu.com/")
# time.sleep(3)
# 获取页面名为wrapper的id标签的文本内容
data = driver.find_element_by_id("wrapper").text
print(data)
# 打印页面标题 "百度一下,你就知道"
print(driver.title)
# 生成当前页面快照并保存
driver.save_screenshot("baidu.png")
# 关闭浏览器
driver.quit()
新闻
hao123
地图
视频
贴吧
学术
登录
设置
更多产品
下载百度APP
有事搜一搜 没事看一看
把百度设为主页关于百度About Baidu百度推广
©2019 Baidu 使用百度前必读 意见反馈 京ICP证030173号 京公网安备11000002000001号
百度一下,你就知道
模拟用户输入和点击搜索
# 导入time模块
import time
# 创建chrome浏览器驱动,无头模式
chrome_options = Options()
chrome_options.add_argument('--headless')
driver = webdriver.Chrome(options=chrome_options)
# get方法会一直等到页面被完全加载,然后才会继续程序,通常测试会在这里选择 time.sleep(2)
driver.get("http://www.baidu.com/")
# id="kw"是百度搜索输入框,输入字符串"中央财经大学"
driver.find_element_by_id("kw").send_keys(u"中央财经大学")
# id="su"是百度搜索按钮,click() 是模拟点击
driver.find_element_by_id("su").click()
time.sleep(3)
# 获取新的页面快照
driver.save_screenshot("中央财经大学.png")
True
# 打印网页渲染后的源代码
print(driver.page_source)
# 获取当前页面Cookie
print(driver.get_cookies())
# ctrl+a 全选输入框内容
driver.find_element_by_id("kw").send_keys(Keys.CONTROL, 'a')
# ctrl+x 剪切输入框内容
driver.find_element_by_id("kw").send_keys(Keys.CONTROL, 'x')
# 输入框重新输入内容
driver.find_element_by_id("kw").send_keys("双十一")
# 模拟Enter回车键
driver.find_element_by_id("su").send_keys(Keys.RETURN)
time.sleep(3)
# 清除输入框内容
driver.find_element_by_id("kw").clear()
# 生成新的页面快照
driver.save_screenshot("双十一.png")
# 获取当前url
print(driver.current_url)
# 关闭浏览器
driver.quit()
模拟用户登录
账号+密码
自行查看结果
# 创建chrome浏览器驱动,无头模式
chrome_options = Options()
chrome_options.add_argument('--headless')
driver = webdriver.Chrome(options=chrome_options)
# 加载微博登录页
driver.get("https://passport.weibo.cn/signin/login")
time.sleep(3)
# 找到输入框,键入用户名和密码
driver.find_element_by_id('loginName').send_keys("worio.hainan@163.com") # 绑定了手机号的账号无法登录
driver.find_element_by_id('loginPassword').send_keys("Qq94313805")
# 点击登录按钮
driver.find_element_by_id('loginAction').click()
time.sleep(3)
# 快照显示已经成功登录
print(driver.save_screenshot('jietu.png'))
driver.quit()
True
爬取滚动加载页面
from lxml import etree
# 创建chrome浏览器驱动,无头模式
chrome_options = Options()
chrome_options.add_argument('--headless')
driver = webdriver.Chrome(options=chrome_options)
# 唯品会女装图片链接无法直接获得
# 请求唯品会页面
driver.get("https://category.vip.com/search-3-0-1.html?q=3|129372||&rp=26594|10002321&ff=women|0|1|4&adidx=1&f=ad&adp=65001&adid=326630")
time.sleep(3)
# 逐渐滚动浏览器窗口,令ajax逐渐加载
for i in range(1, 10):
js = "var q=document.documentElement.scrollTop=" + str(500 * i) # 谷歌 和 火狐
driver.execute_script(js)
print('=====================================')
time.sleep(3)
# 拿到页面源码
html = etree.HTML(driver.page_source)
all_img_list = []
# 得到所有图片
img_group_list = html.xpath("//img[contains(@id,'J_pic')]")
# img_group_list = html.xpath("//img[starts-with(@id,'J_pic')]")
# 正则表达式匹配
# img_group_list = html.xpath(r'//img[re:match(@id, "J_pic*")]',namespaces={"re": "http://exslt.org/regular-expressions"})
# 收集所有图片链接到列表
for img_group in img_group_list:
img_of_group = img_group.xpath(".//@data-original | .//@data-img-back | .//@data-img-side")
print(img_of_group)
all_img_list.append('\n'.join(img_of_group) + '\n')
# 将收集到的数据写入文件
with open('vip.txt', 'w', encoding='utf-8') as f:
f.write('\n'.join(all_img_list))
# 退出浏览器
driver.quit()