【Python爬虫与数据分析】爬虫selenium工具

目录

一、selenium工具安装

二、selenium打开浏览器测试

三、无头浏览器

四、元素定位

五、页面滑动

六、按键、填写登录表单

七、页面切换

八、实战爬取当当网书籍数据


Selenium是Web的自动化测试工具,为网站自动化测试而开发,Selenium可以直接运行在浏览器上,它支持所有主流的浏览器,可以接收指令,让浏览器自动加载界面,获取需要的数据,页面截屏。

一、selenium工具安装

浏览器:谷歌、火狐、Edge,这些浏览器的内核都是google

打开浏览器设置,查看浏览器版本

打开chromedriver下载网页,选择一个和浏览器内核版本最接近的一个版本:CNPM Binaries Mirrorhttps://registry.npmmirror.com/binary.html?path=chromedriver/点击进入,此处以windows环境为示例:

下载安装包,并解压这个文件,得到这个exe文件

如果你是使用PyCharm自带的Python解释器,那么你需要将这个文件放入你的PyCharm文件的bin目录下,例如:C:\...\PyCharm Community Edition 2022.1.3\bin

如果你是通过PyCharm使用Anaconda虚拟环境,那么你需要将这个文件放入你的Anaconda文件的Scripts目录下,例如:C:\...\Anaconda3\Scripts

添加环境变量,如果你已经是使用过PyCharm的用户,那么你的PyCharm大概率是已经添加进入环境变量了,此时你不用再添加环境变量

二、selenium打开浏览器测试

写一个访问浏览器页面的测试代码,首先下载selenium模块

from selenium import webdriver
import time

# 这两个方法二选一,webdriver.Chrome()会真的打开一个浏览器
# driver = webdriver.PhantomJS()
driver = webdriver.Chrome()

# 访问浏览器网址
driver.get('https://www.douban.com/')

# 截图保存图片
driver.save_screenshot("首页.png")

# 页面停留时间
time.sleep(5)

# 退出当前页面
driver.close()

# 退出浏览器
driver.quit()

运行成功会打开浏览器豆瓣首页网址并停留5秒,拿到首页截图。

三、无头浏览器

无头浏览器不会打开浏览器页面,但会访问网页,适用于Linux环境

最新的selenium已经放弃了Phantomjs,直接将无头浏览器的逻辑进行了整合

from selenium import webdriver

# 无头
from selenium.webdriver.chrome.options import Options

# 配置参数
opt = Options()
opt.add_argument("--headless")
opt.add_argument("--disable-gpu")

# 把参数配置给浏览器
driver = webdriver.Chrome(options=opt)

driver.get("https://www.douban.com/")
driver.save_screenshot("./selenium_test/首页1.png")
driver.close()
driver.quit()

四、元素定位

from selenium import webdriver
import time
from lxml import etree

# 无头
from selenium.webdriver.chrome.options import Options

# 元素定位
from selenium.webdriver.common.by import By

# 配置参数
opt = Options()
opt.add_argument("--headless")
opt.add_argument("--disable-gpu")

# 把参数配置给浏览器
driver = webdriver.Chrome(options=opt)

driver.get("https://book.douban.com/")

# 截屏当前页面
driver.save_screenshot("./selenium_test/tv.png")

# 获取前端代码
test = driver.page_source
# print(test)

# html = etree.HTML(test)
# xpath_result = html.xpath('//*[@id="content"]/div/div[1]/div[1]/div[2]/div[1]/div/ul[2]/li')
# print(xpath_result)
# print(len(xpath_result))
# for i in xpath_result:
#     print(i.xpath('.//div[@class="info"]//a/@title'))

# 元素定位
xpath_result = driver.find_element(By.XPATH, '//*[@id="content"]/div/div[1]/div[1]/div[2]/div[1]/div/ul[2]/li[1]')
print(xpath_result)
print(xpath_result.text)


time.sleep(3)
driver.close()
driver.quit()

五、页面滑动

from selenium import webdriver
import time

driver = webdriver.Chrome()

driver.get("https:/www.douban.com/")

time.sleep(2)
js = 'window.scrollTo(0, 10000)'   # 向下滑
# js = 'window.scrollTo(10000, 0)' # 向右滑
# js = 'window.scrollTo(10000, 10000)' # 向右并向下滑
driver.execute_script(js)
time.sleep(2)       
js = 'window.scrollTo(0, -10000)'  # 向上滑
driver.execute_script(js)

time.sleep(5)

driver.close()
driver.quit()

六、按键、填写登录表单

from selenium import webdriver
import time
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()

try:
    driver.get('https://book.douban.com/')
    time.sleep(3)

    btn = driver.find_element(By.LINK_TEXT, '登录/注册')
    btn.click()

    # url = driver.current_url
    # driver.get(url)

    driver.find_element(By.XPATH, '//*[@id="account"]/div[2]/div[2]/div/div[1]/ul[1]/li[2]').click()
    time.sleep(2)

    # 填写登录表单
    driver.find_element(By.XPATH, '//*[@id="username"]').send_keys('12345678')
    driver.find_element(By.XPATH, '//*[@id="password"]').send_keys('202125DOUBAN')
    time.sleep(2)

    driver.find_element(By.XPATH, '//*[@id="account"]/div[2]/div[2]/div/div[2]/div[1]/div[4]/a').click()

    time.sleep(10)
    driver.close()
    driver.quit()

except:
    print(Exception)

七、页面切换

不同的网站有不同的应有场景,有些网站不会新生成页面,有些网站可以自动跳转

from selenium import webdriver
from selenium.webdriver.common.by import By
from lxml import etree
import time

url = 'https://www.bilibili.com/'
driver = webdriver.Chrome()
driver.get(url)

html = driver.page_source
html = etree.HTML(html)

href = html.xpath('//*[@id="i_cecream"]/div[2]/main/div[2]/div/div[1]/div[5]/div/div[2]/a/@href')
print(href)
time.sleep(3)

driver.find_element(By.XPATH, '//*[@id="i_cecream"]/div[2]/main/div[2]/div/div[1]/div[5]/div/div[2]/a').click()

time.sleep(3)
# 获取当前所有窗口
current_windows = driver.window_handles
# 根据窗口索引进行切换
driver.switch_to.window(current_windows[0])     # 从 0 下标开始

time.sleep(3)
driver.close()
time.sleep(3)
driver.quit()

八、实战爬取当当网书籍数据

配置无头浏览器更方便测试和程序的执行

当爬取的数据量较少时,可将数据存入列表数据结构中,当爬取大量数据时,可以一边爬取一边将数据写入文件

利用selenium工具lxml模块的配合对前端页面的数据做处理,使程序能自动获取多个前端页面的数据

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from lxml import etree

# 配置无头浏览器参数
opt = Options()
opt.add_argument("--headless")
opt.add_argument("--disable-gpu")

# 打开浏览器,传入无头参数
driver = webdriver.Chrome(options=opt)

driver.get('http://search.dangdang.com/')

book_key = input('请输入图书关键字: ')
driver.find_element(By.XPATH, '//*[@id="book_key"]').send_keys(book_key)

# 搜索图书
driver.find_element(By.XPATH, '//*[@id="search_btn1"]').click()

# 爬取界面页数
books_num = int(input('请输入需要爬取的界面页数(60本/页): '))
books_info_lst = []
for i in range(books_num):
    driver.find_element(By.XPATH, f'//*[@id="12810"]/div[5]/div[2]/div/ul/li[{i+2}]/a').click()

    # 获取前端代码
    text = driver.page_source
    html = etree.HTML(text)

    # 获取单页书籍列表
    books_lst = html.xpath('//ul[@id="component_59"]/li')
    for book in books_lst:
        book_name = book.xpath("a/@title")[0]
        book_author = book.xpath("p[@class='search_book_author']/span/a/@title")[0]
        book_price = book.xpath("p[@class='price']/span[@class='search_now_price']/text()")[0]
        try:
            book_detail = book.xpath("p[@class='detail']/text()")[0]
        except:
            book_detail = '没有简介'
        books_info_lst.append((book_name, book_author, book_price, book_detail))

for i in books_info_lst:
    print(i)
print(len(books_info_lst))

driver.close()
driver.quit()

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AllinTome

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值