行业知识
【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 webdriverimport 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 webdriverimport timefrom 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('//*[@]/p/p[1]/p[1]/p[2]/p[1]/p/ul[2]/li')# print(xpath_result)# print(len(xpath_result))# for i in xpath_result:# print(i.xpath('.//p[@]//a/@title'))# 元素定位xpath_result = driver.find_element(By.XPATH, '//*[@]/p/p[1]/p[1]/p[2]/p[1]/p/ul[2]/li[1]')print(xpath_result)print(xpath_result.text)time.sleep(3)driver.close()driver.quit() 五、页面滑动
from selenium import webdriverimport timedriver = 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 webdriverimport timefrom selenium.webdriver.common.by import Bydriver = 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, '//*[@]/p[2]/p[2]/p/p[1]/ul[1]/li[2]').click() time.sleep(2) # 填写登录表单 driver.find_element(By.XPATH, '//*[@]').send_keys('12345678') driver.find_element(By.XPATH, '//*[@]').send_keys('202125DOUBAN') time.sleep(2) driver.find_element(By.XPATH, '//*[@]/p[2]/p[2]/p/p[2]/p[1]/p[4]/a').click() time.sleep(10) driver.close() driver.quit()except: print(Exception) 七、页面切换
不同的网站有不同的应有场景,有些网站不会新生成页面,有些网站可以自动跳转
from selenium import webdriverfrom selenium.webdriver.common.by import Byfrom lxml import etreeimport timeurl = 'https://www.bilibili.com/'driver = webdriver.Chrome()driver.get(url)html = driver.page_sourcehtml = etree.HTML(html)href = html.xpath('//*[@]/p[2]/main/p[2]/p/p[1]/p[5]/p/p[2]/a/@href')print(href)time.sleep(3)driver.find_element(By.XPATH, '//*[@]/p[2]/main/p[2]/p/p[1]/p[5]/p/p[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 webdriverfrom selenium.webdriver.chrome.options import Optionsfrom selenium.webdriver.common.by import Byfrom 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, '//*[@]').send_keys(book_key)# 搜索图书driver.find_element(By.XPATH, '//*[@]').click()# 爬取界面页数books_num = int(input('请输入需要爬取的界面页数(60本/页): '))books_info_lst = []for i in range(books_num): driver.find_element(By.XPATH, f'//*[@]/p[5]/p[2]/p/ul/li[{i+2}]/a').click() # 获取前端代码 text = driver.page_source html = etree.HTML(text) # 获取单页书籍列表 books_lst = html.xpath('//ul[@]/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()