隐藏

python——selenium爬虫入门

发布:2023/12/21 23:54:24作者:管理员 来源:本站 浏览次数:662

准备


1.安装selenium模块


   pip3 install selenium


2.装好浏览器,例如Chrome;


3.下载webdriver驱动,例如chromedriver,国内淘宝镜像参考这里。注意驱动与浏览器版本要适配!!!


4.然后把下载好的驱动放到python安装路径下的scripts文件里。

开启窗口


因为涉及大量的网页元素,需要了解HTML的一些基础知识,推荐菜鸟教程。


   from selenium import webdriver


   from selenium.webdriver.common.by import By


   from time import sleep


   driver = webdriver.Chrome()  # 开启一个Chrome窗口


   driver.maximize_window()  # 最大化窗口,充分展示元素控件


驱动不适配或则找不到应存放驱动的路径,可以尝试以下方法或者更换浏览器版本。


   from selenium import webdriver


   from selenium.webdriver.chrome.service import Service


   from webdriver_manager.chrome import ChromeDriverManager


   driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))


以上代码执行时,会同时打开一个Chrome浏览器窗口,自动进行之后的操作。

打开网页


建议打开Chrome的开发者工具,通过右键选中元素打开检查,可以快速查看元素在源码中相应块,便于查找元素的id、class、name之类的属性。


   # 通过get打开baidu


   driver.get("http://www.baidu.com")


   # 通过网页元素id找到相应的对象,并输入内容


   driver.find_element(by=By.ID,value="kw").send_keys('python selenium')


   # 沉默5s,太快会被识别为机器


   sleep(5)


   # 点击搜索按钮


   driver.find_element(by=By.ID,value="su").click()


取数


打开搜索结果中的一个链接,需要了解css_selector或XPATH语法,示例采用css_selector。关于元素定位的问题,可以在开发者工具里,打开搜索框,测试css_selector或XPATH路径是否定位准确。


   sleep(2)  # 等加载好


   driver.find_element(by=By.CSS_SELECTOR,value='div#content_left div.result.c-container:nth-child(5) a').click()


打开新浏览器标签后切换过去,根据元素定位,获取需要的数据。


   win_1=driver.window_handles  # 全部窗口句柄


   driver.switch_to.window(win_1[-1])  # 切换到最新的窗口


   data_1=[ ]


   # 获取标题


   data_1.append(driver.find_element(by=By.CSS_SELECTOR,value='div[class*="index-module_articleTitle"]').text)


   # 获取作者名


   data_1.append(driver.find_element(by=By.CSS_SELECTOR,value='p[class*="index-module_authorName"]').text)


   # 获取时间


   data_1.append(driver.find_element(by=By.CSS_SELECTOR,value='span[class*="index-module_time"]').text)


   # 获取文章内容


   data_1.append(driver.find_element(by=By.CSS_SELECTOR,value='div[class*="index-module_articleWrap"]').text)


text方法获取内容简单粗暴,有更加精细化的需求,可以采用BeautifulSoup,对源码进行操作,分层获取数据,也意味着花更多的时间。


   from bs4 import BeautifulSoup


   text = driver.find_element(by=By.CSS_SELECTOR, value= 'div[class*="index-module_articleWrap"]').get_attribute("innerHTML")


   text = BeautifulSoup(text, "html.parser")


有时候有些网页采用iframe结构,可能会出现网页元素明明在源码中可以看见,却找不到的情况,这时除了排查XPATH或者css_selector语法问题,也可能是因为在不同的iframe上,可以尝试切换frame,进入到相应的frame中再进行操作。


   driver.switch_to.frame(1)  # 可以通过索引、id、名字来切换


   driver.switch_to.default_content()  # 切换到原来默认的frame


导数


   # 存到text文件里


   with open( 'test.text', 'w', encoding="utf-8")  as f:


        for i in data_1:


               f.writelines(i)


               f.writelines('\n')


   # 关掉浏览器


   driver.quit()