Python爬虫学习之selenium+ChromeDriver实现爬虫

selenium+ChromeDriver实现爬虫

参考:https://blog.csdn.net/u010986776/article/details/79266448
selenium所做的事情,恰恰是驱动真正的浏览器去执行请求和操作
无头浏览器:

  • PhantomJS
  • ChromeDriver

Selenium和ChromeDriver的安装与配置

  1. Selenium库的安装:pip install selenium (Anaconda Prompt)
    在这里插入图片描述
  2. ChromeDriver的安装与配置
    • 查看自己chrome浏览器的版本。浏览器地址栏输入地址: chrome://version
      在这里插入图片描述
    • 通过自己的版本下载相应的chromedriver.exe:下载地址:http://npm.taobao.org/mirrors/chromedriver/
    • 将下载下来的chromedriver.exe放在chrome安装目录下以及python安装目录下
    • 配置环境变量:右键点击我的电脑–>属性–>高级系统设置–>环境变量–>在path路径下添加上文中浏览器文件所在的根目录。
    • 查看是否安装成功:命令行输入 chromedriver -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("[email protected]") # 绑定了手机号的账号无法登录
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()
发布了4 篇原创文章 · 获赞 4 · 访问量 222

猜你喜欢

转载自blog.csdn.net/m0_37544963/article/details/105030049