前言:
眼前看官们对“selenium定位表格元素”大致比较关怀,我们都想要了解一些“selenium定位表格元素”的相关内容。那么小编同时在网络上收集了一些关于“selenium定位表格元素””的相关知识,希望姐妹们能喜欢,你们一起来学习一下吧!爬虫获取信息的步骤
1,首先应该获取网页显示界面的源代码
2,想办法从源代码中提取出想要的信息
3,将提取的信息存入文件/数据库中
4,结束程序
获取页面显示的源代码
selenium
selenium 是一个开源的自动化测试工具,一般用来自动化测试的,但是我们也可以使用它来获取浏览器页面的源代码。
简单来说就是我们有了它,就可以用python代码来自动让浏览器打开,并且执行相应的操作,比如点击,输入文字....
首先我们要安装一个python 的库
pip install selenium
安装好后,我们还是不能使用selenium去操纵浏览器的,我们还需要安装一个驱动。我使用的是谷歌浏览器,因此我下载的驱动也是它的驱动
在浏览器的地址栏,输入chrome://version/,回车后即可查看到对应版本。
这时114版本之前的驱动
117,118,119版本的驱动可以到这里去找
当然了,网站打不开,那么可以在评论区告诉我一声,我可以帮你们下载。
好的,现在驱动已经下载完毕了,那么就将它解压,然后放在如下图所在位置:
接下来就是创建一个python项目,我们就是为例,爬取java的岗位信息
from selenium import webdriver #从selenium库中导入webdriverimport time #用来让程序休眠的import pandas as pd #处理数据的
创建一个类,其中添加两个方法search() ,get_jobs()
class lagou: def __init__(self): # 初始化浏览器 self.driver = webdriver.Chrome() #这个self.driver相当于我们的浏览器对象 self.driver.maximize_window() #让窗口最大化(其实可以不用写) # 起始网址 self.start_url = '; def search(self, keyword): # 打开页面 self.driver.get(self.start_url) # 关闭弹窗(首次打开页面会有弹窗,这条语句就是根据xpath来定位到关闭按钮的位置, #然后点击关闭的,按自己需求,。) # self.driver.find_element_by_xpath('//*[@id="cboxClose"]').click() # 在搜索框中输入关键字 time.sleep(2)# 这里要让程序休息两秒,是因为页面不能很快的加载出来, #而程序运行的很快,因此要停留一会儿 self.driver.find_element_by_css_selector("#search_input").send_keys(keyword) # 点击搜索按钮 self.driver.find_element_by_xpath("//*[@id='search_button'] ").click() # 等待两秒5秒 time.sleep(5) self.driver.switch_to.window(self.driver.window_handles[1]) # 获取当前页面html page_source = self.driver.page_source # 将职位信息添加到excel文件中 self.df = pd.DataFrame() for i in range(30): self.get_jobs(page_source) print(self.df) time.sleep(5) # 点击前往下一页 self.driver.find_element_by_css_selector(".lg-pagination-next .lg-pagination-item-link").click() # 再次获取当前页面的源代码 time.sleep(2) page_source = self.driver.page_source # 关闭浏览器 self.df.to_excel('lagou.xlsx') self.driver.quit() return page_source def get_jobs(self, page_source): # 使用BeatufulSoup解析页面 soup = BeautifulSoup(page_source, 'lxml') # 获取所有的招聘条目 hot_items = soup.select(".item__10RTO") print(len(hot_items)) for item in hot_items: d = dict() d['job_name'] = item.select_one('#openWinPostion').get_text() d['company'] = item.select_one('.company-name__2-SjF a').get_text() d['salary'] = item.select_one('.money__3Lkgq').get_text() div_tag=item.select_one('.p-bom__JlNur') # 获取 <div> 标签内除了 <span> 标签外的所有子元素 filtered_contents = [item for item in div_tag.contents if item.name != 'span'] # 将过滤后的内容的文本内容连接起来 requirements_text = ''.join(str(content) for content in filtered_contents) d['requirements'] = requirements_text a = pd.Series(d) self.df =self.df._append(a, ignore_index=True)
上面selenium要实现对浏览器的操作,我们就要告诉它,我们要点击或者输入关键字的位置在哪里。
上面用到了两种selenium定位页面元素的方法
1,self.driver.find_element_by_xpath('//*[@id="cboxClose"]').click()
怎么找到一个元素的xpath呢,我们可以借助浏览器,如上面图中选中元素,然后右键,选择复制就可以了。
这是根据xpath来定位当前页面的元素,不过在使用的过程中,我发现了一个问题:同一个页面元素,在另一个页面它的xpath就可能发生变化,因此除非只查找当前页面的某个元素位置,一般我不建议使用(当然这只是我当前的认识,说不定随着进一步学习,也会改变这个想法。)
2,self.driver.find_element_by_css_selector("#search_input").send_keys(keyword)
第二种就是根据css选择器来定位要找的元素,比如#search_input ,了解前端知识的,可能直到,它就可以定位到id=search_input的元素。
self.driver.find_element_by_css_selector(".lg-pagination-next .lg-pagination-item-link").click() 这种是根据类名来定位的:定位的是class=lg-pagination-next的标签内一个class=lg-pagination-item-link的标签。
获取当前页面原代码,我们可以使用:page_source = self.driver.page_source
不过在使用的过程中,我也遇到了一个问题:明明我已经获取到了页面的源代码,但是得到的却是它前面页面的源码,不是我真正想要的。
self.driver.switch_to.window(self.driver.window_handles[1]) 这条语句的作用就是帮助我们切换标签页,之后我们就可以真正获取到页面2的源代码
提取我们需要的信息
我们通过selenium获取到了很长很长一串的字符串,我们需要的所有信息都在里面,那么接下来,我们要做的就是将信息提取出来
BeautifulSoup 它是一个库,可以帮助我们解析获取的源代码。
保存数据
在找到我们想要的数据的同时,我们也需要考虑,找到的数据需要存放到一个地方,我这里选择,将其保存到excel表格中。
我这里使用了Pandas库中的DataFrame 结构,它就是一张表,在这里我将查找的数据全部存入df,然后就保存到一个lagou.xlsx文件中。
全部的完整代码如下:
from selenium import webdriverimport timeimport pandas as pdfrom bs4 import BeautifulSoupclass lagou: def __init__(self): # 初始化浏览器 self.driver = webdriver.Chrome() self.driver.maximize_window() # 起始网址 self.start_url = '; def search(self, keyword): # 打开页面 self.driver.get(self.start_url) # 关闭弹窗 # self.driver.find_element_by_xpath('//*[@id="cboxClose"]').click() # 在搜索框中输入关键字 time.sleep(2) self.driver.find_element_by_css_selector("#search_input").send_keys(keyword) # 点击搜索按钮 self.driver.find_element_by_xpath("//*[@id='search_button'] ").click() # 等待两秒55 time.sleep(5) self.driver.switch_to.window(self.driver.window_handles[1]) # 获取当前页面html page_source = self.driver.page_source # 将职位信息添加到excel文件中 self.df = pd.DataFrame() for i in range(30): self.get_jobs(page_source) print(self.df) time.sleep(5) # 点击前往下一页 self.driver.find_element_by_css_selector(".lg-pagination-next .lg-pagination-item-link").click() # 再次获取当前页面的源代码 time.sleep(2) page_source = self.driver.page_source # 关闭浏览器 self.df.to_excel('lagou.xlsx') self.driver.quit() return page_source def get_jobs(self, page_source): # 使用BeatufulSoup解析页面 soup = BeautifulSoup(page_source, 'lxml') # 获取所有的招聘条目 hot_items = soup.select(".item__10RTO") print(len(hot_items)) for item in hot_items: d = dict() d['job_name'] = item.select_one('#openWinPostion').get_text() d['company'] = item.select_one('.company-name__2-SjF a').get_text() d['salary'] = item.select_one('.money__3Lkgq').get_text() div_tag=item.select_one('.p-bom__JlNur') # 获取 <div> 标签内除了 <span> 标签外的所有子元素 filtered_contents = [item for item in div_tag.contents if item.name != 'span'] # 将过滤后的内容的文本内容连接起来 requirements_text = ''.join(str(content) for content in filtered_contents) d['requirements'] = requirements_text a = pd.Series(d) self.df =self.df._append(a, ignore_index=True)if __name__ == '__main__': hot = lagou() # 搜索关键字 page_source = hot.search('java')
最后就可以得到一个文件:
其中还有点不足,就是job_name那一列还可以进行字符串操作,将地区名作为新的一列。
学习感受:最重要的一步就是获取网页源代码的那一步,我们这里使用selenium很简单就获取了网页源码,但是它也有不好的地方,比如在一些页面中,由于网速的原因,一些页面不能很快加载出来,导致selenium找不到我们要操作的位置,因此需要在一些地方适当的让程序休息一段时间,等网页顺利加载出来。
另一个缺点就是:使用selenium要花费的时间更多,不仅有让程序休眠的时间,还有网页加载的时间,我获取30页的职位信息大概就花了2~3分钟。
它的优点就是上手简单,只要了解前端构成,就可以快速实现,自己想要让浏览器自己做的事情。
在这个例子中,我们使用selenium获取源代码,beautifulSoup进行解析,pandas来将数据存储到文件。
学习下一步:scrapy框架。
标签: #selenium定位表格元素